diff options
Diffstat (limited to 'REORG.TODO/stdlib')
225 files changed, 37988 insertions, 0 deletions
diff --git a/REORG.TODO/stdlib/Depend b/REORG.TODO/stdlib/Depend new file mode 100644 index 0000000000..f3e1156a4e --- /dev/null +++ b/REORG.TODO/stdlib/Depend @@ -0,0 +1 @@ +localedata diff --git a/REORG.TODO/stdlib/Makefile b/REORG.TODO/stdlib/Makefile new file mode 100644 index 0000000000..9b0acce8cc --- /dev/null +++ b/REORG.TODO/stdlib/Makefile @@ -0,0 +1,221 @@ +# Copyright (C) 1991-2017 Free Software Foundation, Inc. +# This file is part of the GNU C Library. + +# The GNU C Library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +# The GNU C Library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public +# License along with the GNU C Library; if not, see +# <http://www.gnu.org/licenses/>. + +# +# Makefile for stdlib routines +# +subdir := stdlib + +include ../Makeconfig + +headers := stdlib.h bits/stdlib.h bits/stdlib-ldbl.h bits/stdlib-float.h \ + monetary.h bits/monetary-ldbl.h \ + inttypes.h stdint.h bits/wordsize.h \ + errno.h sys/errno.h bits/errno.h \ + ucontext.h sys/ucontext.h \ + alloca.h fmtmsg.h \ + bits/stdlib-bsearch.h sys/random.h bits/stdint-intn.h \ + bits/stdint-uintn.h + +routines := \ + atof atoi atol atoll \ + abort \ + bsearch qsort msort \ + getenv putenv setenv secure-getenv \ + exit on_exit atexit cxa_atexit cxa_finalize old_atexit \ + quick_exit at_quick_exit cxa_at_quick_exit cxa_thread_atexit_impl \ + abs labs llabs \ + div ldiv lldiv \ + mblen mbstowcs mbtowc wcstombs wctomb \ + random random_r rand rand_r \ + drand48 erand48 lrand48 nrand48 mrand48 jrand48 \ + srand48 seed48 lcong48 \ + drand48_r erand48_r lrand48_r nrand48_r mrand48_r jrand48_r \ + srand48_r seed48_r lcong48_r \ + drand48-iter getrandom getentropy \ + strfromf strfromd strfroml \ + strtol strtoul strtoll strtoull \ + strtol_l strtoul_l strtoll_l strtoull_l \ + strtof strtod strtold \ + strtof_l strtod_l strtold_l \ + strtof_nan strtod_nan strtold_nan \ + system canonicalize \ + a64l l64a \ + rpmatch strfmon strfmon_l getsubopt xpg_basename fmtmsg \ + strtoimax strtoumax wcstoimax wcstoumax \ + getcontext setcontext makecontext swapcontext +aux = grouping groupingwc tens_in_limb + +# These routines will be omitted from the libc shared object. +# Instead the static object files will be included in a special archive +# linked against when the shared library will be used. +static-only-routines = atexit at_quick_exit + +test-srcs := tst-fmtmsg +tests := tst-strtol tst-strtod testmb testrand testsort testdiv \ + test-canon test-canon2 tst-strtoll tst-environ \ + tst-xpg-basename tst-random tst-random2 tst-bsearch \ + tst-limits tst-rand48 bug-strtod tst-setcontext \ + tst-setcontext2 test-a64l tst-qsort tst-system testmb2 \ + bug-strtod2 tst-atof1 tst-atof2 tst-strtod2 \ + tst-rand48-2 tst-makecontext tst-strtod5 \ + tst-qsort2 tst-makecontext2 tst-strtod6 tst-unsetenv1 \ + tst-makecontext3 bug-getcontext bug-fmtmsg1 \ + tst-secure-getenv tst-strtod-overflow tst-strtod-round \ + tst-tininess tst-strtod-underflow tst-setcontext3 \ + tst-strtol-locale tst-strtod-nan-locale tst-strfmon_l \ + tst-quick_exit tst-thread-quick_exit tst-width \ + tst-width-stdint tst-strfrom tst-strfrom-locale \ + tst-getrandom +tests-internal := tst-strtod1i tst-strtod3 tst-strtod4 tst-strtod5i \ + tst-tls-atexit tst-tls-atexit-nodelete +tests-static := tst-secure-getenv + +ifeq ($(build-hardcoded-path-in-tests),yes) +tests += tst-empty-env +endif + +ifeq ($(have-cxx-thread_local),yes) +CFLAGS-tst-quick_exit.o = -std=c++11 +LDLIBS-tst-quick_exit = -lstdc++ +CFLAGS-tst-thread-quick_exit.o = -std=c++11 +LDLIBS-tst-thread-quick_exit = -lstdc++ +$(objpfx)tst-thread-quick_exit: $(shared-thread-library) +else +tests-unsupported += tst-quick_exit tst-thread-quick_exit +endif + +modules-names = tst-tls-atexit-lib +extra-test-objs += $(addsuffix .os, $(modules-names)) + +ifeq ($(build-shared),yes) +tests += tst-putenv +endif + +# Several mpn functions from GNU MP are used by the strtod function. +mpn-routines := inlines add_n addmul_1 cmp divmod_1 divrem udiv_qrnnd \ + lshift rshift mod_1 mul mul_1 mul_n sub_n submul_1 +mpn-headers = longlong.h gmp.h gmp-impl.h gmp-mparam.h asm-syntax.h + +routines := $(strip $(routines) $(mpn-routines)) \ + dbl2mpn ldbl2mpn \ + mpn2flt mpn2dbl mpn2ldbl +aux += fpioconst mp_clz_tab + +tests-extras += tst-putenvmod +extra-test-objs += tst-putenvmod.os + +generated += isomac isomac.out tst-putenvmod.so + +CFLAGS-bsearch.c = $(uses-callbacks) +CFLAGS-msort.c = $(uses-callbacks) +CFLAGS-qsort.c = $(uses-callbacks) +CFLAGS-system.c = -fexceptions +CFLAGS-system.os = -fomit-frame-pointer +CFLAGS-fmtmsg.c = -fexceptions + +CFLAGS-strfmon.c = $(libio-mtsafe) +CFLAGS-strfmon_l.c = $(libio-mtsafe) + +# The strfrom class of functions call __printf_fp in order to convert the +# floating-point value to characters. This requires the value of IO_MTSAFE_IO. +CFLAGS-strfromd.c = $(libio-mtsafe) +CFLAGS-strfromf.c = $(libio-mtsafe) +CFLAGS-strfroml.c = $(libio-mtsafe) + +CFLAGS-tst-bsearch.c = $(stack-align-test-flags) +CFLAGS-tst-qsort.c = $(stack-align-test-flags) +CFLAGS-tst-makecontext.c += -funwind-tables +CFLAGS-tst-makecontext2.c = $(stack-align-test-flags) + +# Run a test on the header files we use. +tests-special += $(objpfx)isomac.out + +ifeq ($(run-built-tests),yes) +tests-special += $(objpfx)tst-fmtmsg.out +endif + +include ../Rules + +ifeq ($(run-built-tests),yes) +LOCALES := cs_CZ.UTF-8 de_DE.UTF-8 en_US.ISO-8859-1 tr_TR.UTF-8 \ + tr_TR.ISO-8859-9 tg_TJ.UTF-8 te_IN.UTF-8 bn_IN.UTF-8 \ + el_GR.UTF-8 +include ../gen-locales.mk + +$(objpfx)bug-strtod2.out: $(gen-locales) +$(objpfx)testmb2.out: $(gen-locales) +$(objpfx)tst-strtod.out: $(gen-locales) +$(objpfx)tst-strtod3.out: $(gen-locales) +$(objpfx)tst-strtod4.out: $(gen-locales) +$(objpfx)tst-strtod5.out: $(gen-locales) +$(objpfx)tst-strtol-locale.out: $(gen-locales) +$(objpfx)tst-strtod-nan-locale.out: $(gen-locales) +$(objpfx)tst-strfmon_l.out: $(gen-locales) +$(objpfx)tst-strfrom.out: $(gen-locales) +$(objpfx)tst-strfrom-locale.out: $(gen-locales) +endif + +# Testdir has to be named stdlib and needs to be writable +test-canon-ARGS = --test-dir=${common-objpfx}stdlib + +bug-fmtmsg1-ENV = SEV_LEVEL=foo,11,newsev + +$(objpfx)isomac.out: $(objpfx)isomac + $(dir $<)$(notdir $<) '$(CC)' \ + '-I../include $(+sysdep-includes) $(sysincludes) -I..' > $<.out; \ + $(evaluate-test) + +isomac-CFLAGS = -O +$(objpfx)isomac: isomac.c + $(native-compile) + +$(objpfx)tst-fmtmsg.out: tst-fmtmsg.sh $(objpfx)tst-fmtmsg + $(SHELL) $< $(common-objpfx) '$(test-program-prefix-before-env)' \ + '$(run-program-env)' '$(test-program-prefix-after-env)' \ + $(common-objpfx)stdlib/; \ + $(evaluate-test) + +$(objpfx)tst-putenv: $(objpfx)tst-putenvmod.so +LDFLAGS-tst-putenv = $(no-as-needed) + +$(objpfx)tst-putenvmod.so: $(objpfx)tst-putenvmod.os $(link-libc-deps) + $(build-module) +libof-tst-putenvmod = extramodules + +$(objpfx)bug-getcontext: $(libm) +$(objpfx)tst-strtod-round: $(libm) +$(objpfx)tst-tininess: $(libm) +$(objpfx)tst-strtod-underflow: $(libm) +$(objpfx)tst-strtod6: $(libm) +$(objpfx)tst-strtod-nan-locale: $(libm) + +tst-tls-atexit-lib.so-no-z-defs = yes + +$(objpfx)tst-tls-atexit: $(shared-thread-library) $(libdl) +$(objpfx)tst-tls-atexit.out: $(objpfx)tst-tls-atexit-lib.so + +$(objpfx)tst-tls-atexit-nodelete: $(shared-thread-library) $(libdl) +$(objpfx)tst-tls-atexit-nodelete.out: $(objpfx)tst-tls-atexit-lib.so + +$(objpfx)tst-setcontext3.out: tst-setcontext3.sh $(objpfx)tst-setcontext3 + $(SHELL) $< $(common-objpfx) '$(test-program-prefix-before-env)' \ + '$(run-program-env)' '$(test-program-prefix-after-env)' \ + $(common-objpfx)stdlib/; \ + $(evaluate-test) + +$(objpfx)tst-makecontext: $(libdl) diff --git a/REORG.TODO/stdlib/Versions b/REORG.TODO/stdlib/Versions new file mode 100644 index 0000000000..9cade20a06 --- /dev/null +++ b/REORG.TODO/stdlib/Versions @@ -0,0 +1,135 @@ +libc { + GLIBC_2.0 { + # functions with required interface outside normal name space + __xpg_basename; + + # functions used in inline functions or macros + __strtod_internal; __strtof_internal; __strtold_internal; + __strtol_internal; __strtoll_internal; + __strtoul_internal; __strtoull_internal; + # functions formerly so used (compatibility symbols) + __strtoq_internal; __strtouq_internal; + + # compatibility symbol + __secure_getenv; + + # a* + a64l; abort; abs; atexit; atof; atoi; atol; atoll; + + # b* + bsearch; + + # c* + canonicalize_file_name; clearenv; + + # d* + div; drand48; drand48_r; + + # e* + erand48; erand48_r; exit; + + # g* + getenv; getsubopt; + + # i* + initstate; initstate_r; + + # l* + l64a; labs; lcong48; lcong48_r; ldiv; llabs; lldiv; lrand48; lrand48_r; + + # m* + mblen; mbrlen; mbrtowc; mbsinit; mbsnrtowcs; mbsrtowcs; mbstowcs; + mbtowc; mcheck; mcount; mrand48; mrand48_r; + + # n* + nrand48; nrand48_r; + + # o* + on_exit; + + # p* + putenv; + + # q* + qsort; + + # r* + rand; rand_r; random; random_r; realpath; rpmatch; + + # s* + seed48; seed48_r; setcontext; setenv; setstate; setstate_r; srand; srand48; + srand48_r; srandom; srandom_r; step; strfmon; strtod; strtof; strtol; + strtold; strtoll; strtoq; strtoul; strtoull; strtouq; system; + + # u* + unsetenv; + + # w* + wcstombs; wctomb; + } + GLIBC_2.1 { + # a* + addseverity; + + # f* + fmtmsg; + + # g* + getcontext; + + # m* + makecontext; + + # s* + strtoimax; strtoumax; swapcontext; + } + GLIBC_2.1.1 { + # _* + _Exit; + + # i* + imaxabs; imaxdiv; + } + GLIBC_2.1.3 { + # used by new G++ ABI + __cxa_atexit; __cxa_finalize; + } + GLIBC_2.3 { + # Silent change in SUS. + realpath; + } + GLIBC_2.8 { + qsort_r; + } + GLIBC_2.10 { + quick_exit; __cxa_at_quick_exit; + } + GLIBC_2.13 { + __fentry__; + } + GLIBC_2.17 { + secure_getenv; + } + GLIBC_2.18 { + __cxa_thread_atexit_impl; + } + GLIBC_2.24 { + quick_exit; + } + GLIBC_2.25 { + # s* + strfromd; strfromf; strfroml; + getrandom; getentropy; + } + GLIBC_PRIVATE { + # functions which have an additional interface since they are + # are cancelable. + __libc_system; + # Variable which needs a dynamic symbol table entry. + __abort_msg; + # Used from other libraries + __libc_secure_getenv; + __call_tls_dtors; + __strtof_nan; __strtod_nan; __strtold_nan; + } +} diff --git a/REORG.TODO/stdlib/a64l.c b/REORG.TODO/stdlib/a64l.c new file mode 100644 index 0000000000..55de3129d3 --- /dev/null +++ b/REORG.TODO/stdlib/a64l.c @@ -0,0 +1,64 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.org>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +#define TABLE_BASE 0x2e +#define TABLE_SIZE 0x4d + +#define XX ((char)0x40) + + +static const char a64l_table[TABLE_SIZE] = +{ + /* 0x2e */ 0, 1, + /* 0x30 */ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, XX, XX, XX, XX, XX, XX, + /* 0x40 */ XX, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, + /* 0x50 */ 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, XX, XX, XX, XX, XX, + /* 0x60 */ XX, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, + /* 0x70 */ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63 +}; + + +long int +a64l (const char *string) +{ + const char *ptr = string; + unsigned long int result = 0ul; + const char *end = ptr + 6; + int shift = 0; + + do + { + unsigned index; + unsigned value; + + index = *ptr - TABLE_BASE; + if ((unsigned int) index >= TABLE_SIZE) + break; + value = (int) a64l_table[index]; + if (value == (int) XX) + break; + ++ptr; + result |= value << shift; + shift += 6; + } + while (ptr != end); + + return (long int) result; +} diff --git a/REORG.TODO/stdlib/abort.c b/REORG.TODO/stdlib/abort.c new file mode 100644 index 0000000000..19882f3e3d --- /dev/null +++ b/REORG.TODO/stdlib/abort.c @@ -0,0 +1,142 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <libc-lock.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sigsetops.h> + +/* Try to get a machine dependent instruction which will make the + program crash. This is used in case everything else fails. */ +#include <abort-instr.h> +#ifndef ABORT_INSTRUCTION +/* No such instruction is available. */ +# define ABORT_INSTRUCTION +#endif + +#include <libio/libioP.h> +#define fflush(s) _IO_flush_all_lockp (0) + +/* Exported variable to locate abort message in core files etc. */ +struct abort_msg_s *__abort_msg __attribute__ ((nocommon)); +libc_hidden_def (__abort_msg) + +/* We must avoid to run in circles. Therefore we remember how far we + already got. */ +static int stage; + +/* We should be prepared for multiple threads trying to run abort. */ +__libc_lock_define_initialized_recursive (static, lock); + + +/* Cause an abnormal program termination with core-dump. */ +void +abort (void) +{ + struct sigaction act; + sigset_t sigs; + + /* First acquire the lock. */ + __libc_lock_lock_recursive (lock); + + /* Now it's for sure we are alone. But recursive calls are possible. */ + + /* Unblock SIGABRT. */ + if (stage == 0) + { + ++stage; + __sigemptyset (&sigs); + __sigaddset (&sigs, SIGABRT); + __sigprocmask (SIG_UNBLOCK, &sigs, 0); + } + + /* Flush all streams. We cannot close them now because the user + might have registered a handler for SIGABRT. */ + if (stage == 1) + { + ++stage; + fflush (NULL); + } + + /* Send signal which possibly calls a user handler. */ + if (stage == 2) + { + /* This stage is special: we must allow repeated calls of + `abort' when a user defined handler for SIGABRT is installed. + This is risky since the `raise' implementation might also + fail but I don't see another possibility. */ + int save_stage = stage; + + stage = 0; + __libc_lock_unlock_recursive (lock); + + raise (SIGABRT); + + __libc_lock_lock_recursive (lock); + stage = save_stage + 1; + } + + /* There was a handler installed. Now remove it. */ + if (stage == 3) + { + ++stage; + memset (&act, '\0', sizeof (struct sigaction)); + act.sa_handler = SIG_DFL; + __sigfillset (&act.sa_mask); + act.sa_flags = 0; + __sigaction (SIGABRT, &act, NULL); + } + + /* Now close the streams which also flushes the output the user + defined handler might has produced. */ + if (stage == 4) + { + ++stage; + __fcloseall (); + } + + /* Try again. */ + if (stage == 5) + { + ++stage; + raise (SIGABRT); + } + + /* Now try to abort using the system specific command. */ + if (stage == 6) + { + ++stage; + ABORT_INSTRUCTION; + } + + /* If we can't signal ourselves and the abort instruction failed, exit. */ + if (stage == 7) + { + ++stage; + _exit (127); + } + + /* If even this fails try to use the provided instruction to crash + or otherwise make sure we never return. */ + while (1) + /* Try for ever and ever. */ + ABORT_INSTRUCTION; +} +libc_hidden_def (abort) diff --git a/REORG.TODO/stdlib/abs.c b/REORG.TODO/stdlib/abs.c new file mode 100644 index 0000000000..dad7403658 --- /dev/null +++ b/REORG.TODO/stdlib/abs.c @@ -0,0 +1,27 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +#undef abs + +/* Return the absolute value of I. */ +int +abs (int i) +{ + return i < 0 ? -i : i; +} diff --git a/REORG.TODO/stdlib/add_n.c b/REORG.TODO/stdlib/add_n.c new file mode 100644 index 0000000000..12ded53c58 --- /dev/null +++ b/REORG.TODO/stdlib/add_n.c @@ -0,0 +1,53 @@ +/* mpn_add_n -- Add two limb vectors of equal, non-zero length. + +Copyright (C) 1992-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library; see the file COPYING.LIB. If not, see +<http://www.gnu.org/licenses/>. */ + +#include <gmp.h> +#include "gmp-impl.h" + +mp_limb_t +mpn_add_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size) +{ + register mp_limb_t x, y, cy; + register mp_size_t j; + + /* The loop counter and index J goes from -SIZE to -1. This way + the loop becomes faster. */ + j = -size; + + /* Offset the base pointers to compensate for the negative indices. */ + s1_ptr -= j; + s2_ptr -= j; + res_ptr -= j; + + cy = 0; + do + { + y = s2_ptr[j]; + x = s1_ptr[j]; + y += cy; /* add previous carry to one addend */ + cy = (y < cy); /* get out carry from that addition */ + y = x + y; /* add other addend */ + cy = (y < x) + cy; /* get out carry from that add, combine */ + res_ptr[j] = y; + } + while (++j != 0); + + return cy; +} diff --git a/REORG.TODO/stdlib/addmul_1.c b/REORG.TODO/stdlib/addmul_1.c new file mode 100644 index 0000000000..9eaea8ba33 --- /dev/null +++ b/REORG.TODO/stdlib/addmul_1.c @@ -0,0 +1,61 @@ +/* mpn_addmul_1 -- multiply the S1_SIZE long limb vector pointed to by S1_PTR + by S2_LIMB, add the S1_SIZE least significant limbs of the product to the + limb vector pointed to by RES_PTR. Return the most significant limb of + the product, adjusted for carry-out from the addition. + +Copyright (C) 1992-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library; see the file COPYING.LIB. If not, see +<http://www.gnu.org/licenses/>. */ + +#include <gmp.h> +#include "gmp-impl.h" +#include "longlong.h" + +mp_limb_t +mpn_addmul_1 (register mp_ptr res_ptr, register mp_srcptr s1_ptr, + mp_size_t s1_size, register mp_limb_t s2_limb) +{ + register mp_limb_t cy_limb; + register mp_size_t j; + register mp_limb_t prod_high, prod_low; + register mp_limb_t x; + + /* The loop counter and index J goes from -SIZE to -1. This way + the loop becomes faster. */ + j = -s1_size; + + /* Offset the base pointers to compensate for the negative indices. */ + res_ptr -= j; + s1_ptr -= j; + + cy_limb = 0; + do + { + umul_ppmm (prod_high, prod_low, s1_ptr[j], s2_limb); + + prod_low += cy_limb; + cy_limb = (prod_low < cy_limb) + prod_high; + + x = res_ptr[j]; + prod_low = x + prod_low; + cy_limb += (prod_low < x); + res_ptr[j] = prod_low; + } + while (++j != 0); + + return cy_limb; +} diff --git a/REORG.TODO/stdlib/alloca.h b/REORG.TODO/stdlib/alloca.h new file mode 100644 index 0000000000..89a1a90a4f --- /dev/null +++ b/REORG.TODO/stdlib/alloca.h @@ -0,0 +1,40 @@ +/* Copyright (C) 1992-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _ALLOCA_H +#define _ALLOCA_H 1 + +#include <features.h> + +#define __need_size_t +#include <stddef.h> + +__BEGIN_DECLS + +/* Remove any previous definitions. */ +#undef alloca + +/* Allocate a block that will be freed when the calling function exits. */ +extern void *alloca (size_t __size) __THROW; + +#ifdef __GNUC__ +# define alloca(size) __builtin_alloca (size) +#endif /* GCC. */ + +__END_DECLS + +#endif /* alloca.h */ diff --git a/REORG.TODO/stdlib/at_quick_exit.c b/REORG.TODO/stdlib/at_quick_exit.c new file mode 100644 index 0000000000..3b74d0a688 --- /dev/null +++ b/REORG.TODO/stdlib/at_quick_exit.c @@ -0,0 +1,50 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include "exit.h" + + +/* This is defined by newer gcc version unique for each module. */ +extern void *__dso_handle __attribute__ ((__weak__)); + + +/* Register FUNC to be executed by `quick_exit'. */ +int +attribute_hidden +at_quick_exit (void (*func) (void)) +{ + return __cxa_at_quick_exit ((void (*) (void *)) func, + &__dso_handle == NULL ? NULL : __dso_handle); +} diff --git a/REORG.TODO/stdlib/atexit.c b/REORG.TODO/stdlib/atexit.c new file mode 100644 index 0000000000..f28b6ba1b7 --- /dev/null +++ b/REORG.TODO/stdlib/atexit.c @@ -0,0 +1,52 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file with other + programs, and to distribute those programs without any restriction + coming from the use of this file. (The GNU Lesser General Public + License restrictions do apply in other respects; for example, they + cover modification of the file, and distribution when not linked + into another program.) + + Note that people who make modified versions of this file are not + obligated to grant this special exception for their modified + versions; it is their choice whether to do so. The GNU Lesser + General Public License gives permission to release a modified + version without this exception; this exception also makes it + possible to release a modified version which carries forward this + exception. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include "exit.h" + + +/* This is defined by newer gcc version unique for each module. */ +extern void *__dso_handle __attribute__ ((__weak__)); + + +/* Register FUNC to be executed by `exit'. */ +int +#ifndef atexit +attribute_hidden +#endif +atexit (void (*func) (void)) +{ + return __cxa_atexit ((void (*) (void *)) func, NULL, + &__dso_handle == NULL ? NULL : __dso_handle); +} diff --git a/REORG.TODO/stdlib/atof.c b/REORG.TODO/stdlib/atof.c new file mode 100644 index 0000000000..a21ce58924 --- /dev/null +++ b/REORG.TODO/stdlib/atof.c @@ -0,0 +1,28 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +#undef atof + + +/* Convert a string to a double. */ +double +atof (const char *nptr) +{ + return strtod (nptr, (char **) NULL); +} diff --git a/REORG.TODO/stdlib/atoi.c b/REORG.TODO/stdlib/atoi.c new file mode 100644 index 0000000000..f8593423a6 --- /dev/null +++ b/REORG.TODO/stdlib/atoi.c @@ -0,0 +1,28 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +#undef atoi + + +/* Convert a string to an int. */ +int +atoi (const char *nptr) +{ + return (int) strtol (nptr, (char **) NULL, 10); +} diff --git a/REORG.TODO/stdlib/atol.c b/REORG.TODO/stdlib/atol.c new file mode 100644 index 0000000000..8ca34c0803 --- /dev/null +++ b/REORG.TODO/stdlib/atol.c @@ -0,0 +1,28 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +#undef atol + + +/* Convert a string to a long int. */ +long int +atol (const char *nptr) +{ + return strtol (nptr, (char **) NULL, 10); +} diff --git a/REORG.TODO/stdlib/atoll.c b/REORG.TODO/stdlib/atoll.c new file mode 100644 index 0000000000..41b36a016e --- /dev/null +++ b/REORG.TODO/stdlib/atoll.c @@ -0,0 +1,28 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +#undef atoll + + +/* Convert a string to a long long int. */ +long long int +atoll (const char *nptr) +{ + return strtoll (nptr, (char **) NULL, 10); +} diff --git a/REORG.TODO/stdlib/bits/monetary-ldbl.h b/REORG.TODO/stdlib/bits/monetary-ldbl.h new file mode 100644 index 0000000000..d042ac5af1 --- /dev/null +++ b/REORG.TODO/stdlib/bits/monetary-ldbl.h @@ -0,0 +1,27 @@ +/* -mlong-double-64 compatibility mode for monetary functions. + Copyright (C) 2006-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _MONETARY_H +# error "Never include <bits/monetary-ldbl.h> directly; use <monetary.h> instead." +#endif + +__LDBL_REDIR_DECL (strfmon) + +#ifdef __USE_GNU +__LDBL_REDIR_DECL (strfmon_l) +#endif diff --git a/REORG.TODO/stdlib/bits/stdlib-float.h b/REORG.TODO/stdlib/bits/stdlib-float.h new file mode 100644 index 0000000000..aba8e94596 --- /dev/null +++ b/REORG.TODO/stdlib/bits/stdlib-float.h @@ -0,0 +1,29 @@ +/* Floating-point inline functions for stdlib.h. + Copyright (C) 2012-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _STDLIB_H +# error "Never use <bits/stdlib-float.h> directly; include <stdlib.h> instead." +#endif + +#ifdef __USE_EXTERN_INLINES +__extern_inline double +__NTH (atof (const char *__nptr)) +{ + return strtod (__nptr, (char **) NULL); +} +#endif /* Optimizing and Inlining. */ diff --git a/REORG.TODO/stdlib/bits/stdlib-ldbl.h b/REORG.TODO/stdlib/bits/stdlib-ldbl.h new file mode 100644 index 0000000000..2f568db45a --- /dev/null +++ b/REORG.TODO/stdlib/bits/stdlib-ldbl.h @@ -0,0 +1,41 @@ +/* -mlong-double-64 compatibility mode for <stdlib.h> functions. + Copyright (C) 2006-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _STDLIB_H +# error "Never include <bits/stdlib-ldbl.h> directly; use <stdlib.h> instead." +#endif + +#ifdef __USE_ISOC99 +__LDBL_REDIR1_DECL (strtold, strtod) +#endif + +#ifdef __USE_GNU +__LDBL_REDIR1_DECL (strtold_l, strtod_l) +#endif + +#if __GLIBC_USE (IEC_60559_BFP_EXT) +__LDBL_REDIR1_DECL (strfroml, strfromd) +#endif + +#ifdef __USE_MISC +__LDBL_REDIR1_DECL (qecvt, ecvt) +__LDBL_REDIR1_DECL (qfcvt, fcvt) +__LDBL_REDIR1_DECL (qgcvt, gcvt) +__LDBL_REDIR1_DECL (qecvt_r, ecvt_r) +__LDBL_REDIR1_DECL (qfcvt_r, fcvt_r) +#endif diff --git a/REORG.TODO/stdlib/bits/stdlib.h b/REORG.TODO/stdlib/bits/stdlib.h new file mode 100644 index 0000000000..864284fc74 --- /dev/null +++ b/REORG.TODO/stdlib/bits/stdlib.h @@ -0,0 +1,155 @@ +/* Checking macros for stdlib functions. + Copyright (C) 2005-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _STDLIB_H +# error "Never include <bits/stdlib.h> directly; use <stdlib.h> instead." +#endif + +extern char *__realpath_chk (const char *__restrict __name, + char *__restrict __resolved, + size_t __resolvedlen) __THROW __wur; +extern char *__REDIRECT_NTH (__realpath_alias, + (const char *__restrict __name, + char *__restrict __resolved), realpath) __wur; +extern char *__REDIRECT_NTH (__realpath_chk_warn, + (const char *__restrict __name, + char *__restrict __resolved, + size_t __resolvedlen), __realpath_chk) __wur + __warnattr ("second argument of realpath must be either NULL or at " + "least PATH_MAX bytes long buffer"); + +__fortify_function __wur char * +__NTH (realpath (const char *__restrict __name, char *__restrict __resolved)) +{ + if (__bos (__resolved) != (size_t) -1) + { +#if defined _LIBC_LIMITS_H_ && defined PATH_MAX + if (__bos (__resolved) < PATH_MAX) + return __realpath_chk_warn (__name, __resolved, __bos (__resolved)); +#endif + return __realpath_chk (__name, __resolved, __bos (__resolved)); + } + + return __realpath_alias (__name, __resolved); +} + + +extern int __ptsname_r_chk (int __fd, char *__buf, size_t __buflen, + size_t __nreal) __THROW __nonnull ((2)); +extern int __REDIRECT_NTH (__ptsname_r_alias, (int __fd, char *__buf, + size_t __buflen), ptsname_r) + __nonnull ((2)); +extern int __REDIRECT_NTH (__ptsname_r_chk_warn, + (int __fd, char *__buf, size_t __buflen, + size_t __nreal), __ptsname_r_chk) + __nonnull ((2)) __warnattr ("ptsname_r called with buflen bigger than " + "size of buf"); + +__fortify_function int +__NTH (ptsname_r (int __fd, char *__buf, size_t __buflen)) +{ + if (__bos (__buf) != (size_t) -1) + { + if (!__builtin_constant_p (__buflen)) + return __ptsname_r_chk (__fd, __buf, __buflen, __bos (__buf)); + if (__buflen > __bos (__buf)) + return __ptsname_r_chk_warn (__fd, __buf, __buflen, __bos (__buf)); + } + return __ptsname_r_alias (__fd, __buf, __buflen); +} + + +extern int __wctomb_chk (char *__s, wchar_t __wchar, size_t __buflen) + __THROW __wur; +extern int __REDIRECT_NTH (__wctomb_alias, (char *__s, wchar_t __wchar), + wctomb) __wur; + +__fortify_function __wur int +__NTH (wctomb (char *__s, wchar_t __wchar)) +{ + /* We would have to include <limits.h> to get a definition of MB_LEN_MAX. + But this would only disturb the namespace. So we define our own + version here. */ +#define __STDLIB_MB_LEN_MAX 16 +#if defined MB_LEN_MAX && MB_LEN_MAX != __STDLIB_MB_LEN_MAX +# error "Assumed value of MB_LEN_MAX wrong" +#endif + if (__bos (__s) != (size_t) -1 && __STDLIB_MB_LEN_MAX > __bos (__s)) + return __wctomb_chk (__s, __wchar, __bos (__s)); + return __wctomb_alias (__s, __wchar); +} + + +extern size_t __mbstowcs_chk (wchar_t *__restrict __dst, + const char *__restrict __src, + size_t __len, size_t __dstlen) __THROW; +extern size_t __REDIRECT_NTH (__mbstowcs_alias, + (wchar_t *__restrict __dst, + const char *__restrict __src, + size_t __len), mbstowcs); +extern size_t __REDIRECT_NTH (__mbstowcs_chk_warn, + (wchar_t *__restrict __dst, + const char *__restrict __src, + size_t __len, size_t __dstlen), __mbstowcs_chk) + __warnattr ("mbstowcs called with dst buffer smaller than len " + "* sizeof (wchar_t)"); + +__fortify_function size_t +__NTH (mbstowcs (wchar_t *__restrict __dst, const char *__restrict __src, + size_t __len)) +{ + if (__bos (__dst) != (size_t) -1) + { + if (!__builtin_constant_p (__len)) + return __mbstowcs_chk (__dst, __src, __len, + __bos (__dst) / sizeof (wchar_t)); + + if (__len > __bos (__dst) / sizeof (wchar_t)) + return __mbstowcs_chk_warn (__dst, __src, __len, + __bos (__dst) / sizeof (wchar_t)); + } + return __mbstowcs_alias (__dst, __src, __len); +} + + +extern size_t __wcstombs_chk (char *__restrict __dst, + const wchar_t *__restrict __src, + size_t __len, size_t __dstlen) __THROW; +extern size_t __REDIRECT_NTH (__wcstombs_alias, + (char *__restrict __dst, + const wchar_t *__restrict __src, + size_t __len), wcstombs); +extern size_t __REDIRECT_NTH (__wcstombs_chk_warn, + (char *__restrict __dst, + const wchar_t *__restrict __src, + size_t __len, size_t __dstlen), __wcstombs_chk) + __warnattr ("wcstombs called with dst buffer smaller than len"); + +__fortify_function size_t +__NTH (wcstombs (char *__restrict __dst, const wchar_t *__restrict __src, + size_t __len)) +{ + if (__bos (__dst) != (size_t) -1) + { + if (!__builtin_constant_p (__len)) + return __wcstombs_chk (__dst, __src, __len, __bos (__dst)); + if (__len > __bos (__dst)) + return __wcstombs_chk_warn (__dst, __src, __len, __bos (__dst)); + } + return __wcstombs_alias (__dst, __src, __len); +} diff --git a/REORG.TODO/stdlib/bsearch.c b/REORG.TODO/stdlib/bsearch.c new file mode 100644 index 0000000000..e6aa407491 --- /dev/null +++ b/REORG.TODO/stdlib/bsearch.c @@ -0,0 +1,23 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +#undef __extern_inline +#define __extern_inline /* Empty, so we get a normal definition. */ +#include <bits/stdlib-bsearch.h> +libc_hidden_def (bsearch) diff --git a/REORG.TODO/stdlib/bug-fmtmsg1.c b/REORG.TODO/stdlib/bug-fmtmsg1.c new file mode 100644 index 0000000000..04bfaea3ce --- /dev/null +++ b/REORG.TODO/stdlib/bug-fmtmsg1.c @@ -0,0 +1,28 @@ +#include <fmtmsg.h> +#include <stdio.h> + + +static int +do_test (void) +{ + /* Ugly, but fmtmsg would otherwise print to stderr which we do not + want. */ + fclose (stderr); + stderr = stdout; + + int e1; + e1 = fmtmsg (MM_PRINT, "label:part", MM_WARNING, "text", "action", "tag"); + + int e2; + e2 = fmtmsg (MM_PRINT, "label2:part2", 11, "text2", "action2", "tag2"); + + addseverity (10, "additional severity"); + + int e3; + e3 = fmtmsg (MM_PRINT, "label3:part3", 10, "text3", "action3", "tag3"); + + return e1 != 0 || e2 != 0 || e3 != 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/bug-getcontext.c b/REORG.TODO/stdlib/bug-getcontext.c new file mode 100644 index 0000000000..163400acba --- /dev/null +++ b/REORG.TODO/stdlib/bug-getcontext.c @@ -0,0 +1,76 @@ +/* BZ 12420 */ + +#include <errno.h> +#include <fenv.h> +#include <stdio.h> +#include <stdlib.h> +#include <ucontext.h> +#include <libc-diag.h> + +static int +do_test (void) +{ + if (FE_ALL_EXCEPT == 0) + { + printf("Skipping test; no support for FP exceptions.\n"); + return 0; + } + + int except_mask = 0; +#ifdef FE_DIVBYZERO + except_mask |= FE_DIVBYZERO; +#endif +#ifdef FE_INVALID + except_mask |= FE_INVALID; +#endif +#ifdef FE_OVERFLOW + except_mask |= FE_OVERFLOW; +#endif +#ifdef FE_UNDERFLOW + except_mask |= FE_UNDERFLOW; +#endif + int status = feenableexcept (except_mask); + + except_mask = fegetexcept (); + if (except_mask == -1) + { + printf("\nBefore getcontext(): fegetexcept returned: %d\n", + except_mask); + return 1; + } + + ucontext_t ctx; + status = getcontext(&ctx); + if (status) + { + printf("\ngetcontext failed, errno: %d.\n", errno); + return 1; + } + + printf ("\nDone with getcontext()!\n"); + fflush (NULL); + + /* On nios2 and tilepro, GCC 5 warns that except_mask may be used + uninitialized. Because it is always initialized and nothing in + this test ever calls setcontext (a setcontext call could result + in local variables being clobbered on the second return from + getcontext), in fact an uninitialized use is not possible. */ + DIAG_PUSH_NEEDS_COMMENT; + DIAG_IGNORE_NEEDS_COMMENT (5, "-Wmaybe-uninitialized"); + int mask = fegetexcept (); + if (mask != except_mask) + { + printf("\nAfter getcontext(): fegetexcept returned: %d, expected: %d.\n", + mask, except_mask); + return 1; + } + + printf("\nAt end fegetexcept() returned %d, expected: %d.\n", + mask, except_mask); + DIAG_POP_NEEDS_COMMENT; + + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/bug-strtod.c b/REORG.TODO/stdlib/bug-strtod.c new file mode 100644 index 0000000000..b91f739104 --- /dev/null +++ b/REORG.TODO/stdlib/bug-strtod.c @@ -0,0 +1,67 @@ +/* Test to strtod etc for numbers like x000...0000.000e-nn. + This file is part of the GNU C Library. + Copyright (C) 2001-2017 Free Software Foundation, Inc. + Contributed by Ulrich Drepper <drepper@redhat.com>, 2001. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "tst-strtod.h" + +#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ +static int \ +test_strto ## FSUF (void) \ +{ \ + char buf[300]; \ + int cnt; \ + int result = 0; \ + \ + for (cnt = 0; cnt < 200; ++cnt) \ + { \ + ssize_t n; \ + FTYPE f; \ + \ + n = sprintf (buf, "%d", cnt); \ + memset (buf + n, '0', cnt); \ + sprintf (buf + n + cnt, ".000e-%d", cnt); \ + f = strto ## FSUF (buf, NULL); \ + \ + if (f != (FTYPE) cnt) \ + { \ + char fstr[FSTRLENMAX]; \ + char fcntstr[FSTRLENMAX]; \ + FTOSTR (fstr, sizeof (fstr), "%g", f); \ + FTOSTR (fcntstr, sizeof (fstr), "%g", (FTYPE) cnt); \ + printf ("strto" #FSUF "(\"%s\") " \ + "failed for cnt == %d (%s instead of %s)\n", \ + buf, cnt, fstr, fcntstr); \ + result = 1; \ + } \ + else \ + printf ( "strto" #FSUF "() fine for cnt == %d\n", cnt); \ + } \ + return result; \ +} + +GEN_TEST_STRTOD_FOREACH (TEST_STRTOD) + +int +main (void) +{ + return STRTOD_TEST_FOREACH (test_strto); +} diff --git a/REORG.TODO/stdlib/bug-strtod2.c b/REORG.TODO/stdlib/bug-strtod2.c new file mode 100644 index 0000000000..6128f2dd56 --- /dev/null +++ b/REORG.TODO/stdlib/bug-strtod2.c @@ -0,0 +1,57 @@ +#include <locale.h> +#include <math.h> +#include <stdio.h> +#include <stdlib.h> + +#include "tst-strtod.h" + +static const char *tests[] = + { + "inf", "Inf", "iNf", "inF", "INf", "iNF", "INF", "InF", + "infinity", "Infinity", "InfInity", "INFINITY" + }; +#define ntests (sizeof (tests) / sizeof (tests[0])) + +#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ +static int \ +test_strto ## FSUF (void) \ +{ \ + int res = 0; \ + for (int i = 0; i < ntests; ++i) \ + { \ + char *endp; \ + FTYPE d = strto ## FSUF (tests[i], &endp); \ + if (*endp != '\0') \ + { \ + printf ("did not consume all of '%s'\n", tests[i]); \ + res = 1; \ + } \ + if (!isinf (d)) \ + { \ + printf ("'%s' does not pass isinf\n", tests[i]); \ + res = 1; \ + } \ + } \ + \ + return res; \ +} + +GEN_TEST_STRTOD_FOREACH (TEST_STRTOD) + +static int +do_test (void) +{ + /* The Turkish locale is notorious because tolower() maps 'I' to the + dotless lowercase 'i' and toupper() maps 'i' to an 'I' with a dot + above. */ + if (setlocale (LC_ALL, "tr_TR.UTF-8") == NULL) + { + puts ("cannot set locale"); + return 0; + } + + return STRTOD_TEST_FOREACH (test_strto); +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/canonicalize.c b/REORG.TODO/stdlib/canonicalize.c new file mode 100644 index 0000000000..c3d892c862 --- /dev/null +++ b/REORG.TODO/stdlib/canonicalize.c @@ -0,0 +1,246 @@ +/* Return the canonical absolute name of a given file. + Copyright (C) 1996-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <assert.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <limits.h> +#include <sys/stat.h> +#include <errno.h> +#include <stddef.h> + +#include <eloop-threshold.h> +#include <shlib-compat.h> + +/* Return the canonical absolute name of file NAME. A canonical name + does not contain any `.', `..' components nor any repeated path + separators ('/') or symlinks. All path components must exist. If + RESOLVED is null, the result is malloc'd; otherwise, if the + canonical name is PATH_MAX chars or more, returns null with `errno' + set to ENAMETOOLONG; if the name fits in fewer than PATH_MAX chars, + returns the name in RESOLVED. If the name cannot be resolved and + RESOLVED is non-NULL, it contains the path of the first component + that cannot be resolved. If the path can be resolved, RESOLVED + holds the same value as the value returned. */ + +char * +__realpath (const char *name, char *resolved) +{ + char *rpath, *dest, *extra_buf = NULL; + const char *start, *end, *rpath_limit; + long int path_max; + int num_links = 0; + + if (name == NULL) + { + /* As per Single Unix Specification V2 we must return an error if + either parameter is a null pointer. We extend this to allow + the RESOLVED parameter to be NULL in case the we are expected to + allocate the room for the return value. */ + __set_errno (EINVAL); + return NULL; + } + + if (name[0] == '\0') + { + /* As per Single Unix Specification V2 we must return an error if + the name argument points to an empty string. */ + __set_errno (ENOENT); + return NULL; + } + +#ifdef PATH_MAX + path_max = PATH_MAX; +#else + path_max = pathconf (name, _PC_PATH_MAX); + if (path_max <= 0) + path_max = 1024; +#endif + + if (resolved == NULL) + { + rpath = malloc (path_max); + if (rpath == NULL) + return NULL; + } + else + rpath = resolved; + rpath_limit = rpath + path_max; + + if (name[0] != '/') + { + if (!__getcwd (rpath, path_max)) + { + rpath[0] = '\0'; + goto error; + } + dest = __rawmemchr (rpath, '\0'); + } + else + { + rpath[0] = '/'; + dest = rpath + 1; + } + + for (start = end = name; *start; start = end) + { + struct stat64 st; + int n; + + /* Skip sequence of multiple path-separators. */ + while (*start == '/') + ++start; + + /* Find end of path component. */ + for (end = start; *end && *end != '/'; ++end) + /* Nothing. */; + + if (end - start == 0) + break; + else if (end - start == 1 && start[0] == '.') + /* nothing */; + else if (end - start == 2 && start[0] == '.' && start[1] == '.') + { + /* Back up to previous component, ignore if at root already. */ + if (dest > rpath + 1) + while ((--dest)[-1] != '/'); + } + else + { + size_t new_size; + + if (dest[-1] != '/') + *dest++ = '/'; + + if (dest + (end - start) >= rpath_limit) + { + ptrdiff_t dest_offset = dest - rpath; + char *new_rpath; + + if (resolved) + { + __set_errno (ENAMETOOLONG); + if (dest > rpath + 1) + dest--; + *dest = '\0'; + goto error; + } + new_size = rpath_limit - rpath; + if (end - start + 1 > path_max) + new_size += end - start + 1; + else + new_size += path_max; + new_rpath = (char *) realloc (rpath, new_size); + if (new_rpath == NULL) + goto error; + rpath = new_rpath; + rpath_limit = rpath + new_size; + + dest = rpath + dest_offset; + } + + dest = __mempcpy (dest, start, end - start); + *dest = '\0'; + + if (__lxstat64 (_STAT_VER, rpath, &st) < 0) + goto error; + + if (S_ISLNK (st.st_mode)) + { + char *buf = __alloca (path_max); + size_t len; + + if (++num_links > __eloop_threshold ()) + { + __set_errno (ELOOP); + goto error; + } + + n = __readlink (rpath, buf, path_max - 1); + if (n < 0) + goto error; + buf[n] = '\0'; + + if (!extra_buf) + extra_buf = __alloca (path_max); + + len = strlen (end); + if ((long int) (n + len) >= path_max) + { + __set_errno (ENAMETOOLONG); + goto error; + } + + /* Careful here, end may be a pointer into extra_buf... */ + memmove (&extra_buf[n], end, len + 1); + name = end = memcpy (extra_buf, buf, n); + + if (buf[0] == '/') + dest = rpath + 1; /* It's an absolute symlink */ + else + /* Back up to previous component, ignore if at root already: */ + if (dest > rpath + 1) + while ((--dest)[-1] != '/'); + } + else if (!S_ISDIR (st.st_mode) && *end != '\0') + { + __set_errno (ENOTDIR); + goto error; + } + } + } + if (dest > rpath + 1 && dest[-1] == '/') + --dest; + *dest = '\0'; + + assert (resolved == NULL || resolved == rpath); + return rpath; + +error: + assert (resolved == NULL || resolved == rpath); + if (resolved == NULL) + free (rpath); + return NULL; +} +versioned_symbol (libc, __realpath, realpath, GLIBC_2_3); + + +#if SHLIB_COMPAT(libc, GLIBC_2_0, GLIBC_2_3) +char * +attribute_compat_text_section +__old_realpath (const char *name, char *resolved) +{ + if (resolved == NULL) + { + __set_errno (EINVAL); + return NULL; + } + + return __realpath (name, resolved); +} +compat_symbol (libc, __old_realpath, realpath, GLIBC_2_0); +#endif + + +char * +__canonicalize_file_name (const char *name) +{ + return __realpath (name, NULL); +} +weak_alias (__canonicalize_file_name, canonicalize_file_name) diff --git a/REORG.TODO/stdlib/cmp.c b/REORG.TODO/stdlib/cmp.c new file mode 100644 index 0000000000..1480a9b165 --- /dev/null +++ b/REORG.TODO/stdlib/cmp.c @@ -0,0 +1,48 @@ +/* mpn_cmp -- Compare two low-level natural-number integers. + +Copyright (C) 1991-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library; see the file COPYING.LIB. If not, see +<http://www.gnu.org/licenses/>. */ + +#include <gmp.h> +#include "gmp-impl.h" + +/* Compare OP1_PTR/OP1_SIZE with OP2_PTR/OP2_SIZE. + There are no restrictions on the relative sizes of + the two arguments. + Return 1 if OP1 > OP2, 0 if they are equal, and -1 if OP1 < OP2. */ + +int +mpn_cmp (mp_srcptr op1_ptr, mp_srcptr op2_ptr, mp_size_t size) +{ + mp_size_t i; + mp_limb_t op1_word, op2_word; + + for (i = size - 1; i >= 0; i--) + { + op1_word = op1_ptr[i]; + op2_word = op2_ptr[i]; + if (op1_word != op2_word) + goto diff; + } + return 0; + diff: + /* This can *not* be simplified to + op2_word - op2_word + since that expression might give signed overflow. */ + return (op1_word > op2_word) ? 1 : -1; +} diff --git a/REORG.TODO/stdlib/cxa_at_quick_exit.c b/REORG.TODO/stdlib/cxa_at_quick_exit.c new file mode 100644 index 0000000000..ebebaf4bd7 --- /dev/null +++ b/REORG.TODO/stdlib/cxa_at_quick_exit.c @@ -0,0 +1,30 @@ +/* Copyright (C) 2009-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include "exit.h" + + +static struct exit_function_list initial_quick; +struct exit_function_list *__quick_exit_funcs = &initial_quick; + +/* Register a function to be called by quick_exit. */ +int +__cxa_at_quick_exit (void (*func) (void *), void *d) +{ + return __internal_atexit (func, NULL, d, &__quick_exit_funcs); +} diff --git a/REORG.TODO/stdlib/cxa_atexit.c b/REORG.TODO/stdlib/cxa_atexit.c new file mode 100644 index 0000000000..ce5d9f22b4 --- /dev/null +++ b/REORG.TODO/stdlib/cxa_atexit.c @@ -0,0 +1,133 @@ +/* Copyright (C) 1999-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <assert.h> +#include <stdlib.h> +#include <stdint.h> + +#include <libc-lock.h> +#include "exit.h" +#include <atomic.h> +#include <sysdep.h> + +#undef __cxa_atexit + + +int +attribute_hidden +__internal_atexit (void (*func) (void *), void *arg, void *d, + struct exit_function_list **listp) +{ + struct exit_function *new = __new_exitfn (listp); + + if (new == NULL) + return -1; + +#ifdef PTR_MANGLE + PTR_MANGLE (func); +#endif + new->func.cxa.fn = (void (*) (void *, int)) func; + new->func.cxa.arg = arg; + new->func.cxa.dso_handle = d; + atomic_write_barrier (); + new->flavor = ef_cxa; + return 0; +} + + +/* Register a function to be called by exit or when a shared library + is unloaded. This function is only called from code generated by + the C++ compiler. */ +int +__cxa_atexit (void (*func) (void *), void *arg, void *d) +{ + return __internal_atexit (func, arg, d, &__exit_funcs); +} +libc_hidden_def (__cxa_atexit) + + +/* We change global data, so we need locking. */ +__libc_lock_define_initialized (static, lock) + + +static struct exit_function_list initial; +struct exit_function_list *__exit_funcs = &initial; +uint64_t __new_exitfn_called; + +struct exit_function * +__new_exitfn (struct exit_function_list **listp) +{ + struct exit_function_list *p = NULL; + struct exit_function_list *l; + struct exit_function *r = NULL; + size_t i = 0; + + __libc_lock_lock (lock); + + for (l = *listp; l != NULL; p = l, l = l->next) + { + for (i = l->idx; i > 0; --i) + if (l->fns[i - 1].flavor != ef_free) + break; + + if (i > 0) + break; + + /* This block is completely unused. */ + l->idx = 0; + } + + if (l == NULL || i == sizeof (l->fns) / sizeof (l->fns[0])) + { + /* The last entry in a block is used. Use the first entry in + the previous block if it exists. Otherwise create a new one. */ + if (p == NULL) + { + assert (l != NULL); + p = (struct exit_function_list *) + calloc (1, sizeof (struct exit_function_list)); + if (p != NULL) + { + p->next = *listp; + *listp = p; + } + } + + if (p != NULL) + { + r = &p->fns[0]; + p->idx = 1; + } + } + else + { + /* There is more room in the block. */ + r = &l->fns[i]; + l->idx = i + 1; + } + + /* Mark entry as used, but we don't know the flavor now. */ + if (r != NULL) + { + r->flavor = ef_us; + ++__new_exitfn_called; + } + + __libc_lock_unlock (lock); + + return r; +} diff --git a/REORG.TODO/stdlib/cxa_finalize.c b/REORG.TODO/stdlib/cxa_finalize.c new file mode 100644 index 0000000000..aa0a70cb58 --- /dev/null +++ b/REORG.TODO/stdlib/cxa_finalize.c @@ -0,0 +1,82 @@ +/* Copyright (C) 1999-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <assert.h> +#include <stdlib.h> +#include <atomic.h> +#include "exit.h" +#include <fork.h> +#include <sysdep.h> +#include <stdint.h> + +/* If D is non-NULL, call all functions registered with `__cxa_atexit' + with the same dso handle. Otherwise, if D is NULL, call all of the + registered handlers. */ +void +__cxa_finalize (void *d) +{ + struct exit_function_list *funcs; + + restart: + for (funcs = __exit_funcs; funcs; funcs = funcs->next) + { + struct exit_function *f; + + for (f = &funcs->fns[funcs->idx - 1]; f >= &funcs->fns[0]; --f) + { + void (*cxafn) (void *arg, int status); + void *cxaarg; + + if ((d == NULL || d == f->func.cxa.dso_handle) + /* We don't want to run this cleanup more than once. */ + && (cxafn = f->func.cxa.fn, + cxaarg = f->func.cxa.arg, + ! catomic_compare_and_exchange_bool_acq (&f->flavor, ef_free, + ef_cxa))) + { + uint64_t check = __new_exitfn_called; + +#ifdef PTR_DEMANGLE + PTR_DEMANGLE (cxafn); +#endif + cxafn (cxaarg, 0); + + /* It is possible that that last exit function registered + more exit functions. Start the loop over. */ + if (__glibc_unlikely (check != __new_exitfn_called)) + goto restart; + } + } + } + + /* Also remove the quick_exit handlers, but do not call them. */ + for (funcs = __quick_exit_funcs; funcs; funcs = funcs->next) + { + struct exit_function *f; + + for (f = &funcs->fns[funcs->idx - 1]; f >= &funcs->fns[0]; --f) + if (d == NULL || d == f->func.cxa.dso_handle) + f->flavor = ef_free; + } + + /* Remove the registered fork handlers. We do not have to + unregister anything if the program is going to terminate anyway. */ +#ifdef UNREGISTER_ATFORK + if (d != NULL) + UNREGISTER_ATFORK (d); +#endif +} diff --git a/REORG.TODO/stdlib/cxa_thread_atexit_impl.c b/REORG.TODO/stdlib/cxa_thread_atexit_impl.c new file mode 100644 index 0000000000..f9942255a3 --- /dev/null +++ b/REORG.TODO/stdlib/cxa_thread_atexit_impl.c @@ -0,0 +1,165 @@ +/* Register destructors for C++ TLS variables declared with thread_local. + Copyright (C) 2013-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* CONCURRENCY NOTES: + + This documents concurrency for the non-POD TLS destructor registration, + calling and destruction. The functions __cxa_thread_atexit_impl, + _dl_close_worker and __call_tls_dtors are the three main routines that may + run concurrently and access shared data. The shared data in all possible + combinations of all three functions are the link map list, a link map for a + DSO and the link map member l_tls_dtor_count. + + __cxa_thread_atexit_impl acquires the dl_load_lock before accessing any + shared state and hence multiple of its instances can safely execute + concurrently. + + _dl_close_worker acquires the dl_load_lock before accessing any shared state + as well and hence can concurrently execute multiple of its own instances as + well as those of __cxa_thread_atexit_impl safely. Not all accesses to + l_tls_dtor_count are protected by the dl_load_lock, so we need to + synchronize using atomics. + + __call_tls_dtors accesses the l_tls_dtor_count without taking the lock; it + decrements the value by one. It does not need the big lock because it does + not access any other shared state except for the current DSO link map and + its member l_tls_dtor_count. + + Correspondingly, _dl_close_worker loads l_tls_dtor_count and if it is zero, + unloads the DSO, thus deallocating the current link map. This is the goal + of maintaining l_tls_dtor_count - to unload the DSO and free resources if + there are no pending destructors to be called. + + We want to eliminate the inconsistent state where the DSO is unloaded in + _dl_close_worker before it is used in __call_tls_dtors. This could happen + if __call_tls_dtors uses the link map after it sets l_tls_dtor_count to 0, + since _dl_close_worker will conclude from the 0 l_tls_dtor_count value that + it is safe to unload the DSO. Hence, to ensure that this does not happen, + the following conditions must be met: + + 1. In _dl_close_worker, the l_tls_dtor_count load happens before the DSO is + unloaded and its link map is freed + 2. The link map dereference in __call_tls_dtors happens before the + l_tls_dtor_count dereference. + + To ensure this, the l_tls_dtor_count decrement in __call_tls_dtors should + have release semantics and the load in _dl_close_worker should have acquire + semantics. + + Concurrent executions of __call_tls_dtors should only ensure that the value + is accessed atomically; no reordering constraints need to be considered. + Likewise for the increment of l_tls_dtor_count in __cxa_thread_atexit_impl. + + There is still a possibility on concurrent execution of _dl_close_worker and + __call_tls_dtors where _dl_close_worker reads the value of l_tls_dtor_count + as 1, __call_tls_dtors decrements the value of l_tls_dtor_count but + _dl_close_worker does not unload the DSO, having read the old value. This + is not very different from a case where __call_tls_dtors is called after + _dl_close_worker on the DSO and hence is an accepted execution. */ + +#include <stdlib.h> +#include <ldsodefs.h> + +typedef void (*dtor_func) (void *); + +struct dtor_list +{ + dtor_func func; + void *obj; + struct link_map *map; + struct dtor_list *next; +}; + +static __thread struct dtor_list *tls_dtor_list; +static __thread void *dso_symbol_cache; +static __thread struct link_map *lm_cache; + +/* Register a destructor for TLS variables declared with the 'thread_local' + keyword. This function is only called from code generated by the C++ + compiler. FUNC is the destructor function and OBJ is the object to be + passed to the destructor. DSO_SYMBOL is the __dso_handle symbol that each + DSO has at a unique address in its map, added from crtbegin.o during the + linking phase. */ +int +__cxa_thread_atexit_impl (dtor_func func, void *obj, void *dso_symbol) +{ +#ifdef PTR_MANGLE + PTR_MANGLE (func); +#endif + + /* Prepend. */ + struct dtor_list *new = calloc (1, sizeof (struct dtor_list)); + new->func = func; + new->obj = obj; + new->next = tls_dtor_list; + tls_dtor_list = new; + + /* We have to acquire the big lock to prevent a racing dlclose from pulling + our DSO from underneath us while we're setting up our destructor. */ + __rtld_lock_lock_recursive (GL(dl_load_lock)); + + /* See if we already encountered the DSO. */ + if (__glibc_unlikely (dso_symbol_cache != dso_symbol)) + { + ElfW(Addr) caller = (ElfW(Addr)) dso_symbol; + + struct link_map *l = _dl_find_dso_for_object (caller); + + /* If the address is not recognized the call comes from the main + program (we hope). */ + lm_cache = l ? l : GL(dl_ns)[LM_ID_BASE]._ns_loaded; + } + + /* This increment may only be concurrently observed either by the decrement + in __call_tls_dtors since the other l_tls_dtor_count access in + _dl_close_worker is protected by the dl_load_lock. The execution in + __call_tls_dtors does not really depend on this value beyond the fact that + it should be atomic, so Relaxed MO should be sufficient. */ + atomic_fetch_add_relaxed (&lm_cache->l_tls_dtor_count, 1); + __rtld_lock_unlock_recursive (GL(dl_load_lock)); + + new->map = lm_cache; + + return 0; +} + +/* Call the destructors. This is called either when a thread returns from the + initial function or when the process exits via the exit function. */ +void +__call_tls_dtors (void) +{ + while (tls_dtor_list) + { + struct dtor_list *cur = tls_dtor_list; + dtor_func func = cur->func; +#ifdef PTR_DEMANGLE + PTR_DEMANGLE (func); +#endif + + tls_dtor_list = tls_dtor_list->next; + func (cur->obj); + + /* Ensure that the MAP dereference happens before + l_tls_dtor_count decrement. That way, we protect this access from a + potential DSO unload in _dl_close_worker, which happens when + l_tls_dtor_count is 0. See CONCURRENCY NOTES for more detail. */ + atomic_fetch_add_release (&cur->map->l_tls_dtor_count, -1); + free (cur); + } +} +libc_hidden_def (__call_tls_dtors) diff --git a/REORG.TODO/stdlib/dbl2mpn.c b/REORG.TODO/stdlib/dbl2mpn.c new file mode 100644 index 0000000000..3872db5c41 --- /dev/null +++ b/REORG.TODO/stdlib/dbl2mpn.c @@ -0,0 +1,31 @@ +/* Copyright (C) 1993-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <gmp.h> +#include "gmp-impl.h" + +/* Convert a `double' to a multi-precision integer representing the + significand scaled up by the highest possible number of significant bits + of fraction (DBL_MANT_DIG), and an integral power of two (MPN frexp). */ + +mp_size_t +__mpn_extract_double (mp_ptr res_ptr, mp_size_t size, + int *expt, int *is_neg, + double value) +{ +#error "__mpn_extract_double is not implemented for this floating point format" +} diff --git a/REORG.TODO/stdlib/div.c b/REORG.TODO/stdlib/div.c new file mode 100644 index 0000000000..d525afa1ac --- /dev/null +++ b/REORG.TODO/stdlib/div.c @@ -0,0 +1,62 @@ +/* Copyright (C) 1992-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* + * Copyright (c) 1990 Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Chris Torek. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include <stdlib.h> + +/* Return the `div_t' representation of NUMER over DENOM. */ +div_t +div (int numer, int denom) +{ + div_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + return result; +} diff --git a/REORG.TODO/stdlib/divmod_1.c b/REORG.TODO/stdlib/divmod_1.c new file mode 100644 index 0000000000..1ef15d6a1e --- /dev/null +++ b/REORG.TODO/stdlib/divmod_1.c @@ -0,0 +1,199 @@ +/* mpn_divmod_1(quot_ptr, dividend_ptr, dividend_size, divisor_limb) -- + Divide (DIVIDEND_PTR,,DIVIDEND_SIZE) by DIVISOR_LIMB. + Write DIVIDEND_SIZE limbs of quotient at QUOT_PTR. + Return the single-limb remainder. + There are no constraints on the value of the divisor. + + QUOT_PTR and DIVIDEND_PTR might point to the same limb. + +Copyright (C) 1991-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library; see the file COPYING.LIB. If not, see +<http://www.gnu.org/licenses/>. */ + +#include <gmp.h> +#include "gmp-impl.h" +#include "longlong.h" + +#ifndef UMUL_TIME +#define UMUL_TIME 1 +#endif + +#ifndef UDIV_TIME +#define UDIV_TIME UMUL_TIME +#endif + +/* FIXME: We should be using invert_limb (or invert_normalized_limb) + here (not udiv_qrnnd). */ + +mp_limb_t +mpn_divmod_1 (mp_ptr quot_ptr, + mp_srcptr dividend_ptr, mp_size_t dividend_size, + mp_limb_t divisor_limb) +{ + mp_size_t i; + mp_limb_t n1, n0, r; + mp_limb_t dummy __attribute__ ((unused)); + + /* ??? Should this be handled at all? Rely on callers? */ + if (dividend_size == 0) + return 0; + + /* If multiplication is much faster than division, and the + dividend is large, pre-invert the divisor, and use + only multiplications in the inner loop. */ + + /* This test should be read: + Does it ever help to use udiv_qrnnd_preinv? + && Does what we save compensate for the inversion overhead? */ + if (UDIV_TIME > (2 * UMUL_TIME + 6) + && (UDIV_TIME - (2 * UMUL_TIME + 6)) * dividend_size > UDIV_TIME) + { + int normalization_steps; + + count_leading_zeros (normalization_steps, divisor_limb); + if (normalization_steps != 0) + { + mp_limb_t divisor_limb_inverted; + + divisor_limb <<= normalization_steps; + + /* Compute (2**2N - 2**N * DIVISOR_LIMB) / DIVISOR_LIMB. The + result is a (N+1)-bit approximation to 1/DIVISOR_LIMB, with the + most significant bit (with weight 2**N) implicit. */ + + /* Special case for DIVISOR_LIMB == 100...000. */ + if (divisor_limb << 1 == 0) + divisor_limb_inverted = ~(mp_limb_t) 0; + else + udiv_qrnnd (divisor_limb_inverted, dummy, + -divisor_limb, 0, divisor_limb); + + n1 = dividend_ptr[dividend_size - 1]; + r = n1 >> (BITS_PER_MP_LIMB - normalization_steps); + + /* Possible optimization: + if (r == 0 + && divisor_limb > ((n1 << normalization_steps) + | (dividend_ptr[dividend_size - 2] >> ...))) + ...one division less... */ + + for (i = dividend_size - 2; i >= 0; i--) + { + n0 = dividend_ptr[i]; + udiv_qrnnd_preinv (quot_ptr[i + 1], r, r, + ((n1 << normalization_steps) + | (n0 >> (BITS_PER_MP_LIMB - normalization_steps))), + divisor_limb, divisor_limb_inverted); + n1 = n0; + } + udiv_qrnnd_preinv (quot_ptr[0], r, r, + n1 << normalization_steps, + divisor_limb, divisor_limb_inverted); + return r >> normalization_steps; + } + else + { + mp_limb_t divisor_limb_inverted; + + /* Compute (2**2N - 2**N * DIVISOR_LIMB) / DIVISOR_LIMB. The + result is a (N+1)-bit approximation to 1/DIVISOR_LIMB, with the + most significant bit (with weight 2**N) implicit. */ + + /* Special case for DIVISOR_LIMB == 100...000. */ + if (divisor_limb << 1 == 0) + divisor_limb_inverted = ~(mp_limb_t) 0; + else + udiv_qrnnd (divisor_limb_inverted, dummy, + -divisor_limb, 0, divisor_limb); + + i = dividend_size - 1; + r = dividend_ptr[i]; + + if (r >= divisor_limb) + r = 0; + else + { + quot_ptr[i] = 0; + i--; + } + + for (; i >= 0; i--) + { + n0 = dividend_ptr[i]; + udiv_qrnnd_preinv (quot_ptr[i], r, r, + n0, divisor_limb, divisor_limb_inverted); + } + return r; + } + } + else + { + if (UDIV_NEEDS_NORMALIZATION) + { + int normalization_steps; + + count_leading_zeros (normalization_steps, divisor_limb); + if (normalization_steps != 0) + { + divisor_limb <<= normalization_steps; + + n1 = dividend_ptr[dividend_size - 1]; + r = n1 >> (BITS_PER_MP_LIMB - normalization_steps); + + /* Possible optimization: + if (r == 0 + && divisor_limb > ((n1 << normalization_steps) + | (dividend_ptr[dividend_size - 2] >> ...))) + ...one division less... */ + + for (i = dividend_size - 2; i >= 0; i--) + { + n0 = dividend_ptr[i]; + udiv_qrnnd (quot_ptr[i + 1], r, r, + ((n1 << normalization_steps) + | (n0 >> (BITS_PER_MP_LIMB - normalization_steps))), + divisor_limb); + n1 = n0; + } + udiv_qrnnd (quot_ptr[0], r, r, + n1 << normalization_steps, + divisor_limb); + return r >> normalization_steps; + } + } + /* No normalization needed, either because udiv_qrnnd doesn't require + it, or because DIVISOR_LIMB is already normalized. */ + + i = dividend_size - 1; + r = dividend_ptr[i]; + + if (r >= divisor_limb) + r = 0; + else + { + quot_ptr[i] = 0; + i--; + } + + for (; i >= 0; i--) + { + n0 = dividend_ptr[i]; + udiv_qrnnd (quot_ptr[i], r, r, n0, divisor_limb); + } + return r; + } +} diff --git a/REORG.TODO/stdlib/divrem.c b/REORG.TODO/stdlib/divrem.c new file mode 100644 index 0000000000..984d945dee --- /dev/null +++ b/REORG.TODO/stdlib/divrem.c @@ -0,0 +1,234 @@ +/* mpn_divrem -- Divide natural numbers, producing both remainder and + quotient. + +Copyright (C) 1993-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library; see the file COPYING.LIB. If not, see +<http://www.gnu.org/licenses/>. */ + +#include <gmp.h> +#include "gmp-impl.h" +#include "longlong.h" + +/* Divide num (NP/NSIZE) by den (DP/DSIZE) and write + the NSIZE-DSIZE least significant quotient limbs at QP + and the DSIZE long remainder at NP. If QEXTRA_LIMBS is + non-zero, generate that many fraction bits and append them after the + other quotient limbs. + Return the most significant limb of the quotient, this is always 0 or 1. + + Preconditions: + 0. NSIZE >= DSIZE. + 1. The most significant bit of the divisor must be set. + 2. QP must either not overlap with the input operands at all, or + QP + DSIZE >= NP must hold true. (This means that it's + possible to put the quotient in the high part of NUM, right after the + remainder in NUM. + 3. NSIZE >= DSIZE, even if QEXTRA_LIMBS is non-zero. */ + +mp_limb_t +mpn_divrem (mp_ptr qp, mp_size_t qextra_limbs, + mp_ptr np, mp_size_t nsize, + mp_srcptr dp, mp_size_t dsize) +{ + mp_limb_t most_significant_q_limb = 0; + + switch (dsize) + { + case 0: + /* We are asked to divide by zero, so go ahead and do it! (To make + the compiler not remove this statement, return the value.) */ + return 1 / dsize; + + case 1: + { + mp_size_t i; + mp_limb_t n1; + mp_limb_t d; + + d = dp[0]; + n1 = np[nsize - 1]; + + if (n1 >= d) + { + n1 -= d; + most_significant_q_limb = 1; + } + + qp += qextra_limbs; + for (i = nsize - 2; i >= 0; i--) + udiv_qrnnd (qp[i], n1, n1, np[i], d); + qp -= qextra_limbs; + + for (i = qextra_limbs - 1; i >= 0; i--) + udiv_qrnnd (qp[i], n1, n1, 0, d); + + np[0] = n1; + } + break; + + case 2: + { + mp_size_t i; + mp_limb_t n1, n0, n2; + mp_limb_t d1, d0; + + np += nsize - 2; + d1 = dp[1]; + d0 = dp[0]; + n1 = np[1]; + n0 = np[0]; + + if (n1 >= d1 && (n1 > d1 || n0 >= d0)) + { + sub_ddmmss (n1, n0, n1, n0, d1, d0); + most_significant_q_limb = 1; + } + + for (i = qextra_limbs + nsize - 2 - 1; i >= 0; i--) + { + mp_limb_t q; + mp_limb_t r; + + if (i >= qextra_limbs) + np--; + else + np[0] = 0; + + if (n1 == d1) + { + /* Q should be either 111..111 or 111..110. Need special + treatment of this rare case as normal division would + give overflow. */ + q = ~(mp_limb_t) 0; + + r = n0 + d1; + if (r < d1) /* Carry in the addition? */ + { + add_ssaaaa (n1, n0, r - d0, np[0], 0, d0); + qp[i] = q; + continue; + } + n1 = d0 - (d0 != 0); + n0 = -d0; + } + else + { + udiv_qrnnd (q, r, n1, n0, d1); + umul_ppmm (n1, n0, d0, q); + } + + n2 = np[0]; + q_test: + if (n1 > r || (n1 == r && n0 > n2)) + { + /* The estimated Q was too large. */ + q--; + + sub_ddmmss (n1, n0, n1, n0, 0, d0); + r += d1; + if (r >= d1) /* If not carry, test Q again. */ + goto q_test; + } + + qp[i] = q; + sub_ddmmss (n1, n0, r, n2, n1, n0); + } + np[1] = n1; + np[0] = n0; + } + break; + + default: + { + mp_size_t i; + mp_limb_t dX, d1, n0; + + np += nsize - dsize; + dX = dp[dsize - 1]; + d1 = dp[dsize - 2]; + n0 = np[dsize - 1]; + + if (n0 >= dX) + { + if (n0 > dX || mpn_cmp (np, dp, dsize - 1) >= 0) + { + mpn_sub_n (np, np, dp, dsize); + n0 = np[dsize - 1]; + most_significant_q_limb = 1; + } + } + + for (i = qextra_limbs + nsize - dsize - 1; i >= 0; i--) + { + mp_limb_t q; + mp_limb_t n1, n2; + mp_limb_t cy_limb; + + if (i >= qextra_limbs) + { + np--; + n2 = np[dsize]; + } + else + { + n2 = np[dsize - 1]; + MPN_COPY_DECR (np + 1, np, dsize); + np[0] = 0; + } + + if (n0 == dX) + /* This might over-estimate q, but it's probably not worth + the extra code here to find out. */ + q = ~(mp_limb_t) 0; + else + { + mp_limb_t r; + + udiv_qrnnd (q, r, n0, np[dsize - 1], dX); + umul_ppmm (n1, n0, d1, q); + + while (n1 > r || (n1 == r && n0 > np[dsize - 2])) + { + q--; + r += dX; + if (r < dX) /* I.e. "carry in previous addition?" */ + break; + n1 -= n0 < d1; + n0 -= d1; + } + } + + /* Possible optimization: We already have (q * n0) and (1 * n1) + after the calculation of q. Taking advantage of that, we + could make this loop make two iterations less. */ + + cy_limb = mpn_submul_1 (np, dp, dsize, q); + + if (n2 != cy_limb) + { + mpn_add_n (np, np, dp, dsize); + q--; + } + + qp[i] = q; + n0 = np[dsize - 1]; + } + } + } + + return most_significant_q_limb; +} diff --git a/REORG.TODO/stdlib/drand48-iter.c b/REORG.TODO/stdlib/drand48-iter.c new file mode 100644 index 0000000000..f59c803138 --- /dev/null +++ b/REORG.TODO/stdlib/drand48-iter.c @@ -0,0 +1,56 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <stdlib.h> +#include <limits.h> +#include <stdint.h> +#include <sys/types.h> + +/* Global state for non-reentrant functions. */ +struct drand48_data __libc_drand48_data; + + +int +__drand48_iterate (unsigned short int xsubi[3], struct drand48_data *buffer) +{ + uint64_t X; + uint64_t result; + + /* Initialize buffer, if not yet done. */ + if (__glibc_unlikely (!buffer->__init)) + { + buffer->__a = 0x5deece66dull; + buffer->__c = 0xb; + buffer->__init = 1; + } + + /* Do the real work. We choose a data type which contains at least + 48 bits. Because we compute the modulus it does not care how + many bits really are computed. */ + + X = (uint64_t) xsubi[2] << 32 | (uint32_t) xsubi[1] << 16 | xsubi[0]; + + result = X * buffer->__a + buffer->__c; + + xsubi[0] = result & 0xffff; + xsubi[1] = (result >> 16) & 0xffff; + xsubi[2] = (result >> 32) & 0xffff; + + return 0; +} diff --git a/REORG.TODO/stdlib/drand48.c b/REORG.TODO/stdlib/drand48.c new file mode 100644 index 0000000000..b98759a32e --- /dev/null +++ b/REORG.TODO/stdlib/drand48.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + + +double +drand48 (void) +{ + double result; + + (void) __erand48_r (__libc_drand48_data.__x, &__libc_drand48_data, &result); + + return result; +} diff --git a/REORG.TODO/stdlib/drand48_r.c b/REORG.TODO/stdlib/drand48_r.c new file mode 100644 index 0000000000..801edf43a0 --- /dev/null +++ b/REORG.TODO/stdlib/drand48_r.c @@ -0,0 +1,27 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <math.h> +#include <stdlib.h> + +int +drand48_r (struct drand48_data *buffer, double *result) +{ + return __erand48_r (buffer->__x, buffer, result); +} diff --git a/REORG.TODO/stdlib/erand48.c b/REORG.TODO/stdlib/erand48.c new file mode 100644 index 0000000000..b209189ba3 --- /dev/null +++ b/REORG.TODO/stdlib/erand48.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + + +double +erand48 (unsigned short int xsubi[3]) +{ + double result; + + (void) __erand48_r (xsubi, &__libc_drand48_data, &result); + + return result; +} diff --git a/REORG.TODO/stdlib/erand48_r.c b/REORG.TODO/stdlib/erand48_r.c new file mode 100644 index 0000000000..8f6d3fad61 --- /dev/null +++ b/REORG.TODO/stdlib/erand48_r.c @@ -0,0 +1,47 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <ieee754.h> +#include <stdlib.h> +#include <limits.h> + + +int +__erand48_r (unsigned short int xsubi[3], struct drand48_data *buffer, + double *result) +{ + union ieee754_double temp; + + /* Compute next state. */ + if (__drand48_iterate (xsubi, buffer) < 0) + return -1; + + /* Construct a positive double with the 48 random bits distributed over + its fractional part so the resulting FP number is [0.0,1.0). */ + + temp.ieee.negative = 0; + temp.ieee.exponent = IEEE754_DOUBLE_BIAS; + temp.ieee.mantissa0 = (xsubi[2] << 4) | (xsubi[1] >> 12); + temp.ieee.mantissa1 = ((xsubi[1] & 0xfff) << 20) | (xsubi[0] << 4); + + /* Please note the lower 4 bits of mantissa1 are always 0. */ + *result = temp.d - 1.0; + + return 0; +} +weak_alias (__erand48_r, erand48_r) diff --git a/REORG.TODO/stdlib/errno.h b/REORG.TODO/stdlib/errno.h new file mode 100644 index 0000000000..65f2f4570c --- /dev/null +++ b/REORG.TODO/stdlib/errno.h @@ -0,0 +1,72 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* + * ISO C99 Standard: 7.5 Errors <errno.h> + */ + +#ifndef _ERRNO_H + +/* The includer defined __need_Emath if he wants only the definitions + of EDOM and ERANGE, and not everything else. */ +#ifndef __need_Emath +# define _ERRNO_H 1 +# include <features.h> +#endif + +__BEGIN_DECLS + +/* Get the error number constants from the system-specific file. + This file will test __need_Emath and _ERRNO_H. */ +#include <bits/errno.h> +#undef __need_Emath + +#ifdef _ERRNO_H + +/* Declare the `errno' variable, unless it's defined as a macro by + bits/errno.h. This is the case in GNU, where it is a per-thread + variable. This redeclaration using the macro still works, but it + will be a function declaration without a prototype and may trigger + a -Wstrict-prototypes warning. */ +#ifndef errno +extern int errno; +#endif + +#ifdef __USE_GNU + +/* The full and simple forms of the name with which the program was + invoked. These variables are set up automatically at startup based on + the value of ARGV[0] (this works only if you use GNU ld). */ +extern char *program_invocation_name, *program_invocation_short_name; +#endif /* __USE_GNU */ +#endif /* _ERRNO_H */ + +__END_DECLS + +#endif /* _ERRNO_H */ + +/* The Hurd <bits/errno.h> defines `error_t' as an enumerated type so + that printing `error_t' values in the debugger shows the names. We + might need this definition sometimes even if this file was included + before. */ +#if defined __USE_GNU || defined __need_error_t +# ifndef __error_t_defined +typedef int error_t; +# define __error_t_defined 1 +# endif +# undef __need_error_t +#endif diff --git a/REORG.TODO/stdlib/exit.c b/REORG.TODO/stdlib/exit.c new file mode 100644 index 0000000000..c0b6d666c7 --- /dev/null +++ b/REORG.TODO/stdlib/exit.c @@ -0,0 +1,107 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sysdep.h> +#include "exit.h" + +#include "set-hooks.h" +DEFINE_HOOK (__libc_atexit, (void)) + + +/* Call all functions registered with `atexit' and `on_exit', + in the reverse of the order in which they were registered + perform stdio cleanup, and terminate program execution with STATUS. */ +void +attribute_hidden +__run_exit_handlers (int status, struct exit_function_list **listp, + bool run_list_atexit, bool run_dtors) +{ + /* First, call the TLS destructors. */ +#ifndef SHARED + if (&__call_tls_dtors != NULL) +#endif + if (run_dtors) + __call_tls_dtors (); + + /* We do it this way to handle recursive calls to exit () made by + the functions registered with `atexit' and `on_exit'. We call + everyone on the list and use the status value in the last + exit (). */ + while (*listp != NULL) + { + struct exit_function_list *cur = *listp; + + while (cur->idx > 0) + { + const struct exit_function *const f = + &cur->fns[--cur->idx]; + switch (f->flavor) + { + void (*atfct) (void); + void (*onfct) (int status, void *arg); + void (*cxafct) (void *arg, int status); + + case ef_free: + case ef_us: + break; + case ef_on: + onfct = f->func.on.fn; +#ifdef PTR_DEMANGLE + PTR_DEMANGLE (onfct); +#endif + onfct (status, f->func.on.arg); + break; + case ef_at: + atfct = f->func.at; +#ifdef PTR_DEMANGLE + PTR_DEMANGLE (atfct); +#endif + atfct (); + break; + case ef_cxa: + cxafct = f->func.cxa.fn; +#ifdef PTR_DEMANGLE + PTR_DEMANGLE (cxafct); +#endif + cxafct (f->func.cxa.arg, status); + break; + } + } + + *listp = cur->next; + if (*listp != NULL) + /* Don't free the last element in the chain, this is the statically + allocate element. */ + free (cur); + } + + if (run_list_atexit) + RUN_HOOK (__libc_atexit, ()); + + _exit (status); +} + + +void +exit (int status) +{ + __run_exit_handlers (status, &__exit_funcs, true, true); +} +libc_hidden_def (exit) diff --git a/REORG.TODO/stdlib/exit.h b/REORG.TODO/stdlib/exit.h new file mode 100644 index 0000000000..7f2e679246 --- /dev/null +++ b/REORG.TODO/stdlib/exit.h @@ -0,0 +1,77 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _EXIT_H +#define _EXIT_H 1 + +#include <stdbool.h> +#include <stdint.h> + +enum +{ + ef_free, /* `ef_free' MUST be zero! */ + ef_us, + ef_on, + ef_at, + ef_cxa +}; + +struct exit_function + { + /* `flavour' should be of type of the `enum' above but since we need + this element in an atomic operation we have to use `long int'. */ + long int flavor; + union + { + void (*at) (void); + struct + { + void (*fn) (int status, void *arg); + void *arg; + } on; + struct + { + void (*fn) (void *arg, int status); + void *arg; + void *dso_handle; + } cxa; + } func; + }; +struct exit_function_list + { + struct exit_function_list *next; + size_t idx; + struct exit_function fns[32]; + }; +extern struct exit_function_list *__exit_funcs attribute_hidden; +extern struct exit_function_list *__quick_exit_funcs attribute_hidden; + +extern struct exit_function *__new_exitfn (struct exit_function_list **listp); +extern uint64_t __new_exitfn_called attribute_hidden; + +extern void __run_exit_handlers (int status, + struct exit_function_list **listp, + bool run_list_atexit, bool run_dtors) + attribute_hidden __attribute__ ((__noreturn__)); + +extern int __internal_atexit (void (*func) (void *), void *arg, void *d, + struct exit_function_list **listp) + attribute_hidden; +extern int __cxa_at_quick_exit (void (*func) (void *), void *d); + + +#endif /* exit.h */ diff --git a/REORG.TODO/stdlib/fmtmsg.c b/REORG.TODO/stdlib/fmtmsg.c new file mode 100644 index 0000000000..ac0c3aa28a --- /dev/null +++ b/REORG.TODO/stdlib/fmtmsg.c @@ -0,0 +1,386 @@ +/* Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <fmtmsg.h> +#include <libc-lock.h> +#include <stdio.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <sys/syslog.h> +#include <wchar.h> + + +/* We have global data, protect the modification. */ +__libc_lock_define_initialized (static, lock) + + +enum +{ + label_mask = 0x01, + severity_mask = 0x02, + text_mask = 0x04, + action_mask = 0x08, + tag_mask = 0x10, + all_mask = label_mask | severity_mask | text_mask | action_mask | tag_mask +}; + +static const struct +{ + uint32_t len; + /* Adjust the size if new elements are added. */ + const char name[12]; +} keywords[] = + { + { 5, "label" }, + { 8, "severity" }, + { 4, "text" }, + { 6, "action"}, + { 3, "tag" } + }; +#define NKEYWORDS (sizeof( keywords) / sizeof (keywords[0])) + + +struct severity_info +{ + int severity; + const char *string; + struct severity_info *next; +}; + + +/* List of known severities. */ +static const struct severity_info nosev = +{ + MM_NOSEV, "", NULL +}; +static const struct severity_info haltsev = +{ + MM_HALT, "HALT", (struct severity_info *) &nosev +}; +static const struct severity_info errorsev = +{ + MM_ERROR, "ERROR", (struct severity_info *) &haltsev +}; +static const struct severity_info warningsev = +{ + MM_WARNING, "WARNING", (struct severity_info *) &errorsev +}; +static const struct severity_info infosev = +{ + MM_INFO, "INFO", (struct severity_info *) &warningsev +}; + +/* Start of the list. */ +static struct severity_info *severity_list = (struct severity_info *) &infosev; + +/* Mask of values we will print. */ +static int print; + +/* Prototypes for local functions. */ +static void init (void); +static int internal_addseverity (int severity, const char *string) + internal_function; + + +int +fmtmsg (long int classification, const char *label, int severity, + const char *text, const char *action, const char *tag) +{ + __libc_once_define (static, once); + struct severity_info *severity_rec; + + /* Make sure everything is initialized. */ + __libc_once (once, init); + + /* Start the real work. First check whether the input is ok. */ + if (label != MM_NULLLBL) + { + /* Must be two fields, separated by a colon. */ + const char *cp = strchr (label, ':'); + if (cp == NULL) + return MM_NOTOK; + + /* The first field must not contain more than 10 bytes. */ + if (cp - label > 10 + /* The second field must not have more than 14 bytes. */ + || strlen (cp + 1) > 14) + return MM_NOTOK; + } + +#ifdef __libc_ptf_call + /* We do not want this call to be cut short by a thread + cancellation. Therefore disable cancellation for now. */ + int state = PTHREAD_CANCEL_ENABLE; + __libc_ptf_call (__pthread_setcancelstate, + (PTHREAD_CANCEL_DISABLE, &state), 0); +#endif + + __libc_lock_lock (lock); + + for (severity_rec = severity_list; severity_rec != NULL; + severity_rec = severity_rec->next) + if (severity == severity_rec->severity) + /* Bingo. */ + break; + + /* If we don't know anything about the severity level return an error. */ + int result = MM_NOTOK; + if (severity_rec != NULL) + { + result = MM_OK; + + /* Now we can print. */ + if (classification & MM_PRINT) + { + int do_label = (print & label_mask) && label != MM_NULLLBL; + int do_severity = (print & severity_mask) && severity != MM_NULLSEV; + int do_text = (print & text_mask) && text != MM_NULLTXT; + int do_action = (print & action_mask) && action != MM_NULLACT; + int do_tag = (print & tag_mask) && tag != MM_NULLTAG; + int need_colon = (do_label + && (do_severity | do_text | do_action | do_tag)); + + if (__fxprintf (stderr, "%s%s%s%s%s%s%s%s%s%s\n", + do_label ? label : "", + need_colon ? ": " : "", + do_severity ? severity_rec->string : "", + do_severity && (do_text | do_action | do_tag) + ? ": " : "", + do_text ? text : "", + do_text && (do_action | do_tag) ? "\n" : "", + do_action ? "TO FIX: " : "", + do_action ? action : "", + do_action && do_tag ? " " : "", + do_tag ? tag : "") < 0) + /* Oh, oh. An error occurred during the output. */ + result = MM_NOMSG; + } + + if (classification & MM_CONSOLE) + { + int do_label = label != MM_NULLLBL; + int do_severity = severity != MM_NULLSEV; + int do_text = text != MM_NULLTXT; + int do_action = action != MM_NULLACT; + int do_tag = tag != MM_NULLTAG; + int need_colon = (do_label + && (do_severity | do_text | do_action | do_tag)); + + syslog (LOG_ERR, "%s%s%s%s%s%s%s%s%s%s\n", + do_label ? label : "", + need_colon ? ": " : "", + do_severity ? severity_rec->string : "", + do_severity && (do_text | do_action | do_tag) ? ": " : "", + do_text ? text : "", + do_text && (do_action | do_tag) ? "\n" : "", + do_action ? "TO FIX: " : "", + do_action ? action : "", + do_action && do_tag ? " " : "", + do_tag ? tag : ""); + } + } + + __libc_lock_unlock (lock); + +#ifdef __libc_ptf_call + __libc_ptf_call (__pthread_setcancelstate, (state, NULL), 0); +#endif + + return result; +} + + +/* Initialize from environment variable content. */ +static void +init (void) +{ + const char *msgverb_var = getenv ("MSGVERB"); + const char *sevlevel_var = getenv ("SEV_LEVEL"); + + if (msgverb_var != NULL && msgverb_var[0] != '\0') + { + /* Using this extra variable allows us to work without locking. */ + do + { + size_t cnt; + + for (cnt = 0; cnt < NKEYWORDS; ++cnt) + if (memcmp (msgverb_var, + keywords[cnt].name, keywords[cnt].len) == 0 + && (msgverb_var[keywords[cnt].len] == ':' + || msgverb_var[keywords[cnt].len] == '\0')) + break; + + if (cnt < NKEYWORDS) + { + print |= 1 << cnt; + + msgverb_var += keywords[cnt].len; + if (msgverb_var[0] == ':') + ++msgverb_var; + } + else + { + /* We found an illegal keyword in the environment + variable. The specifications say that we print all + fields. */ + print = all_mask; + break; + } + } + while (msgverb_var[0] != '\0'); + } + else + print = all_mask; + + + if (sevlevel_var != NULL) + { + __libc_lock_lock (lock); + + while (sevlevel_var[0] != '\0') + { + const char *end = __strchrnul (sevlevel_var, ':'); + int level; + + /* First field: keyword. This is not used here but it must be + present. */ + while (sevlevel_var < end) + if (*sevlevel_var++ == ',') + break; + + if (sevlevel_var < end) + { + /* Second field: severity level, a number. */ + char *cp; + + level = strtol (sevlevel_var, &cp, 0); + if (cp != sevlevel_var && cp < end && *cp++ == ',' + && level > MM_INFO) + { + const char *new_string; + + new_string = __strndup (cp, end - cp); + + if (new_string != NULL + && (internal_addseverity (level, new_string) + != MM_OK)) + free ((char *) new_string); + } + } + + sevlevel_var = end + (*end == ':' ? 1 : 0); + } + + __libc_lock_unlock (lock); + } +} + + +/* Add the new entry to the list. */ +static int +internal_function +internal_addseverity (int severity, const char *string) +{ + struct severity_info *runp, *lastp; + int result = MM_OK; + + /* First see if there is already a record for the severity level. */ + for (runp = severity_list, lastp = NULL; runp != NULL; runp = runp->next) + if (runp->severity == severity) + break; + else + lastp = runp; + + if (runp != NULL) + { + if (string != NULL) + /* Change the string. */ + runp->string = string; + else + { + /* Remove the severity class. */ + if (lastp == NULL) + severity_list = runp->next; + else + lastp->next = runp->next; + + free (runp); + } + } + else if (string != NULL) + { + runp = malloc (sizeof (*runp)); + if (runp == NULL) + result = MM_NOTOK; + else + { + runp->severity = severity; + runp->next = severity_list; + runp->string = string; + severity_list = runp; + } + } + else + /* We tried to remove a non-existing severity class. */ + result = MM_NOTOK; + + return result; +} + + +/* Add new severity level or remove old one. */ +int +__addseverity (int severity, const char *string) +{ + int result; + + /* Prevent illegal SEVERITY values. */ + if (severity <= MM_INFO) + return MM_NOTOK; + + /* Protect the global data. */ + __libc_lock_lock (lock); + + /* Do the real work. */ + result = internal_addseverity (severity, string); + + /* Release the lock. */ + __libc_lock_unlock (lock); + + return result; +} +weak_alias (__addseverity, addseverity) + + +libc_freeres_fn (free_mem) +{ + struct severity_info *runp = severity_list; + + while (runp != NULL) + if (runp->severity > MM_INFO) + { + /* This is data we have to release. */ + struct severity_info *here = runp; + runp = runp->next; + free (here); + } + else + runp = runp->next; +} diff --git a/REORG.TODO/stdlib/fmtmsg.h b/REORG.TODO/stdlib/fmtmsg.h new file mode 100644 index 0000000000..0b9069ca10 --- /dev/null +++ b/REORG.TODO/stdlib/fmtmsg.h @@ -0,0 +1,105 @@ +/* Message display handling. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef __FMTMSG_H +#define __FMTMSG_H 1 + +#include <features.h> + + +__BEGIN_DECLS + +/* Values to control `fmtmsg' function. */ +enum +{ + MM_HARD = 0x001, /* Source of the condition is hardware. */ +#define MM_HARD MM_HARD + MM_SOFT = 0x002, /* Source of the condition is software. */ +#define MM_SOFT MM_SOFT + MM_FIRM = 0x004, /* Source of the condition is firmware. */ +#define MM_FIRM MM_FIRM + MM_APPL = 0x008, /* Condition detected by application. */ +#define MM_APPL MM_APPL + MM_UTIL = 0x010, /* Condition detected by utility. */ +#define MM_UTIL MM_UTIL + MM_OPSYS = 0x020, /* Condition detected by operating system. */ +#define MM_OPSYS MM_OPSYS + MM_RECOVER = 0x040, /* Recoverable error. */ +#define MM_RECOVER MM_RECOVER + MM_NRECOV = 0x080, /* Non-recoverable error. */ +#define MM_NRECOV MM_NRECOV + MM_PRINT = 0x100, /* Display message in standard error. */ +#define MM_PRINT MM_PRINT + MM_CONSOLE = 0x200 /* Display message on system console. */ +#define MM_CONSOLE MM_CONSOLE +}; + +/* Values to be for SEVERITY parameter of `fmtmsg'. */ +enum +{ + MM_NOSEV = 0, /* No severity level provided for the message. */ +#define MM_NOSEV MM_NOSEV + MM_HALT, /* Error causing application to halt. */ +#define MM_HALT MM_HALT + MM_ERROR, /* Application has encountered a non-fatal fault. */ +#define MM_ERROR MM_ERROR + MM_WARNING, /* Application has detected unusual non-error + condition. */ +#define MM_WARNING MM_WARNING + MM_INFO /* Informative message. */ +#define MM_INFO MM_INFO +}; + + +/* Macros which can be used as null values for the arguments of `fmtmsg'. */ +#define MM_NULLLBL ((char *) 0) +#define MM_NULLSEV 0 +#define MM_NULLMC ((long int) 0) +#define MM_NULLTXT ((char *) 0) +#define MM_NULLACT ((char *) 0) +#define MM_NULLTAG ((char *) 0) + + +/* Possible return values of `fmtmsg'. */ +enum +{ + MM_NOTOK = -1, +#define MM_NOTOK MM_NOTOK + MM_OK = 0, +#define MM_OK MM_OK + MM_NOMSG = 1, +#define MM_NOMSG MM_NOMSG + MM_NOCON = 4 +#define MM_NOCON MM_NOCON +}; + + +/* Print message with given CLASSIFICATION, LABEL, SEVERITY, TEXT, ACTION + and TAG to console or standard error. */ +extern int fmtmsg (long int __classification, const char *__label, + int __severity, const char *__text, + const char *__action, const char *__tag); + +#ifdef __USE_MISC +/* Add or remove severity level. */ +extern int addseverity (int __severity, const char *__string) __THROW; +#endif + +__END_DECLS + +#endif /* fmtmsg.h */ diff --git a/REORG.TODO/stdlib/fpioconst.c b/REORG.TODO/stdlib/fpioconst.c new file mode 100644 index 0000000000..a0563b9676 --- /dev/null +++ b/REORG.TODO/stdlib/fpioconst.c @@ -0,0 +1,1329 @@ +/* Table of MP integer constants 10^(2^i), used for floating point <-> decimal. + Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include "fpioconst.h" +#include <gmp-mparam.h> /* This defines BITS_PER_MP_LIMB. */ + +/* First page : 32-bit limbs + Second page : 64-bit limbs + Last page : table of pointers + + The tables (apart from internal #if conditions) may be generated + with gen-fpioconst.c. + */ + +#if BITS_PER_MP_LIMB == 32 + +/* Table with constants of 10^(2^i), i=0..12 for 32-bit limbs. */ + +const mp_limb_t __tens[] = +{ +#define TENS_P0_IDX 0 +#define TENS_P0_SIZE 3 + [TENS_P0_IDX] = 0x00000000, 0x00000000, 0x0000000a, + +#define TENS_P1_IDX (TENS_P0_IDX + TENS_P0_SIZE) +#define TENS_P1_SIZE 3 + [TENS_P1_IDX] = 0x00000000, 0x00000000, 0x00000064, + +#define TENS_P2_IDX (TENS_P1_IDX + TENS_P1_SIZE) +#define TENS_P2_SIZE 3 + [TENS_P2_IDX] = 0x00000000, 0x00000000, 0x00002710, + +#define TENS_P3_IDX (TENS_P2_IDX + TENS_P2_SIZE) +#define TENS_P3_SIZE 3 + [TENS_P3_IDX] = 0x00000000, 0x00000000, 0x05f5e100, + +#define TENS_P4_IDX (TENS_P3_IDX + TENS_P3_SIZE) +#define TENS_P4_SIZE 4 + [TENS_P4_IDX] = 0x00000000, 0x00000000, 0x6fc10000, 0x002386f2, + +#define TENS_P5_IDX (TENS_P4_IDX + TENS_P4_SIZE) +#define TENS_P5_SIZE 6 + [TENS_P5_IDX] = 0x00000000, 0x00000000, 0x00000000, 0x85acef81, 0x2d6d415b, + 0x000004ee, + +#define TENS_P6_IDX (TENS_P5_IDX + TENS_P5_SIZE) +#define TENS_P6_SIZE 9 + [TENS_P6_IDX] = 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xbf6a1f01, + 0x6e38ed64, 0xdaa797ed, 0xe93ff9f4, 0x00184f03, + +#define TENS_P7_IDX (TENS_P6_IDX + TENS_P6_SIZE) +#define TENS_P7_SIZE 16 + [TENS_P7_IDX] = 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x2e953e01, 0x03df9909, 0x0f1538fd, 0x2374e42f, 0xd3cff5ec, + 0xc404dc08, 0xbccdb0da, 0xa6337f19, 0xe91f2603, 0x0000024e, + +#define TENS_P8_IDX (TENS_P7_IDX + TENS_P7_SIZE) +#define TENS_P8_SIZE 29 + [TENS_P8_IDX] = 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x982e7c01, + 0xbed3875b, 0xd8d99f72, 0x12152f87, 0x6bde50c6, 0xcf4a6e70, 0xd595d80f, + 0x26b2716e, 0xadc666b0, 0x1d153624, 0x3c42d35a, 0x63ff540e, 0xcc5573c0, + 0x65f9ef17, 0x55bc28f2, 0x80dcc7f7, 0xf46eeddc, 0x5fdcefce, 0x000553f7, + +#define TENS_P9_IDX (TENS_P8_IDX + TENS_P8_SIZE) +#define TENS_P9_SIZE 56 + [TENS_P9_IDX] = 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0xfc6cf801, 0x77f27267, 0x8f9546dc, 0x5d96976f, 0xb83a8a97, + 0xc31e1ad9, 0x46c40513, 0x94e65747, 0xc88976c1, 0x4475b579, 0x28f8733b, + 0xaa1da1bf, 0x703ed321, 0x1e25cfea, 0xb21a2f22, 0xbc51fb2e, 0x96e14f5d, + 0xbfa3edac, 0x329c57ae, 0xe7fc7153, 0xc3fc0695, 0x85a91924, 0xf95f635e, + 0xb2908ee0, 0x93abade4, 0x1366732a, 0x9449775c, 0x69be5b0e, 0x7343afac, + 0xb099bc81, 0x45a71d46, 0xa2699748, 0x8cb07303, 0x8a0b1f13, 0x8cab8a97, + 0xc1d238d9, 0x633415d4, 0x0000001c, + +#define TENS_P10_IDX (TENS_P9_IDX + TENS_P9_SIZE) +#define TENS_P10_SIZE 109 + [TENS_P10_IDX] = 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x2919f001, + 0xf55b2b72, 0x6e7c215b, 0x1ec29f86, 0x991c4e87, 0x15c51a88, 0x140ac535, + 0x4c7d1e1a, 0xcc2cd819, 0x0ed1440e, 0x896634ee, 0x7de16cfb, 0x1e43f61f, + 0x9fce837d, 0x231d2b9c, 0x233e55c7, 0x65dc60d7, 0xf451218b, 0x1c5cd134, + 0xc9635986, 0x922bbb9f, 0xa7e89431, 0x9f9f2a07, 0x62be695a, 0x8e1042c4, + 0x045b7a74, 0x1abe1de3, 0x8ad822a5, 0xba34c411, 0xd814b505, 0xbf3fdeb3, + 0x8fc51a16, 0xb1b896bc, 0xf56deeec, 0x31fb6bfd, 0xb6f4654b, 0x101a3616, + 0x6b7595fb, 0xdc1a47fe, 0x80d98089, 0x80bda5a5, 0x9a202882, 0x31eb0f66, + 0xfc8f1f90, 0x976a3310, 0xe26a7b7e, 0xdf68368a, 0x3ce3a0b8, 0x8e4262ce, + 0x75a351a2, 0x6cb0b6c9, 0x44597583, 0x31b5653f, 0xc356e38a, 0x35faaba6, + 0x0190fba0, 0x9fc4ed52, 0x88bc491b, 0x1640114a, 0x005b8041, 0xf4f3235e, + 0x1e8d4649, 0x36a8de06, 0x73c55349, 0xa7e6bd2a, 0xc1a6970c, 0x47187094, + 0xd2db49ef, 0x926c3f5b, 0xae6209d4, 0x2d433949, 0x34f4a3c6, 0xd4305d94, + 0xd9d61a05, 0x00000325, + +#if FPIOCONST_HAVE_EXTENDED_RANGE +# define TENS_P11_IDX (TENS_P10_IDX + TENS_P10_SIZE) +# define TENS_P11_SIZE 215 + [TENS_P11_IDX] = 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x1333e001, 0xe3096865, 0xb27d4d3f, 0x49e28dcf, 0xec2e4721, + 0xee87e354, 0xb6067584, 0x368b8abb, 0xa5e5a191, 0x2ed56d55, 0xfd827773, + 0xea50d142, 0x51b78db2, 0x98342c9e, 0xc850dabc, 0x866ed6f1, 0x19342c12, + 0x92794987, 0xd2f869c2, 0x66912e4a, 0x71c7fd8f, 0x57a7842d, 0x235552eb, + 0xfb7fedcc, 0xf3861ce0, 0x38209ce1, 0x9713b449, 0x34c10134, 0x8c6c54de, + 0xa7a8289c, 0x2dbb6643, 0xe3cb64f3, 0x8074ff01, 0xe3892ee9, 0x10c17f94, + 0xa8f16f92, 0xa8281ed6, 0x967abbb3, 0x5a151440, 0x9952fbed, 0x13b41e44, + 0xafe609c3, 0xa2bca416, 0xf111821f, 0xfb1264b4, 0x91bac974, 0xd6c7d6ab, + 0x8e48ff35, 0x4419bd43, 0xc4a65665, 0x685e5510, 0x33554c36, 0xab498697, + 0x0dbd21fe, 0x3cfe491d, 0x982da466, 0xcbea4ca7, 0x9e110c7b, 0x79c56b8a, + 0x5fc5a047, 0x84d80e2e, 0x1aa9f444, 0x730f203c, 0x6a57b1ab, 0xd752f7a6, + 0x87a7dc62, 0x944545ff, 0x40660460, 0x77c1a42f, 0xc9ac375d, 0xe866d7ef, + 0x744695f0, 0x81428c85, 0xa1fc6b96, 0xd7917c7b, 0x7bf03c19, 0x5b33eb41, + 0x5715f791, 0x8f6cae5f, 0xdb0708fd, 0xb125ac8e, 0x785ce6b7, 0x56c6815b, + 0x6f46eadb, 0x4eeebeee, 0x195355d8, 0xa244de3c, 0x9d7389c0, 0x53761abd, + 0xcf99d019, 0xde9ec24b, 0x0d76ce39, 0x70beb181, 0x2e55ecee, 0xd5f86079, + 0xf56d9d4b, 0xfb8886fb, 0x13ef5a83, 0x408f43c5, 0x3f3389a4, 0xfad37943, + 0x58ccf45c, 0xf82df846, 0x415c7f3e, 0x2915e818, 0x8b3d5cf4, 0x6a445f27, + 0xf8dbb57a, 0xca8f0070, 0x8ad803ec, 0xb2e87c34, 0x038f9245, 0xbedd8a6c, + 0xc7c9dee0, 0x0eac7d56, 0x2ad3fa14, 0xe0de0840, 0xf775677c, 0xf1bd0ad5, + 0x92be221e, 0x87fa1fb9, 0xce9d04a4, 0xd2c36fa9, 0x3f6f7024, 0xb028af62, + 0x907855ee, 0xd83e49d6, 0x4efac5dc, 0xe7151aab, 0x77cd8c6b, 0x0a753b7d, + 0x0af908b4, 0x8c983623, 0xe50f3027, 0x94222771, 0x1d08e2d6, 0xf7e928e6, + 0xf2ee5ca6, 0x1b61b93c, 0x11eb962b, 0x9648b21c, 0xce2bcba1, 0x34f77154, + 0x7bbebe30, 0xe526a319, 0x8ce329ac, 0xde4a74d2, 0xb5dc53d5, 0x0009e8b3, + +# define TENS_P12_IDX (TENS_P11_IDX + TENS_P11_SIZE) +# define TENS_P12_SIZE 428 + [TENS_P12_IDX] = 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x2a67c001, + 0xd4724e8d, 0x8efe7ae7, 0xf89a1e90, 0xef084117, 0x54e05154, 0x13b1bb51, + 0x506be829, 0xfb29b172, 0xe599574e, 0xf0da6146, 0x806c0ed3, 0xb86ae5be, + 0x45155e93, 0xc0591cc2, 0x7e1e7c34, 0x7c4823da, 0x1d1f4cce, 0x9b8ba1e8, + 0xd6bfdf75, 0xe341be10, 0xc2dfae78, 0x016b67b2, 0x0f237f1a, 0x3dbeabcd, + 0xaf6a2574, 0xcab3e6d7, 0x142e0e80, 0x61959127, 0x2c234811, 0x87009701, + 0xcb4bf982, 0xf8169c84, 0x88052f8c, 0x68dde6d4, 0xbc131761, 0xff0b0905, + 0x54ab9c41, 0x7613b224, 0x1a1c304e, 0x3bfe167b, 0x441c2d47, 0x4f6cea9c, + 0x78f06181, 0xeb659fb8, 0x30c7ae41, 0x947e0d0e, 0xa1ebcad7, 0xd97d9556, + 0x2130504d, 0x1a8309cb, 0xf2acd507, 0x3f8ec72a, 0xfd82373a, 0x95a842bc, + 0x280f4d32, 0xf3618ac0, 0x811a4f04, 0x6dc3a5b4, 0xd3967a1b, 0x15b8c898, + 0xdcfe388f, 0x454eb2a0, 0x8738b909, 0x10c4e996, 0x2bd9cc11, 0x3297cd0c, + 0x655fec30, 0xae0725b1, 0xf4090ee8, 0x037d19ee, 0x398c6fed, 0x3b9af26b, + 0xc994a450, 0xb5341743, 0x75a697b2, 0xac50b9c1, 0x3ccb5b92, 0xffe06205, + 0xa8329761, 0xdfea5242, 0xeb83cadb, 0xe79dadf7, 0x3c20ee69, 0x1e0a6817, + 0x7021b97a, 0x743074fa, 0x176ca776, 0x77fb8af6, 0xeca19beb, 0x92baf1de, + 0xaf63b712, 0xde35c88b, 0xa4eb8f8c, 0xe137d5e9, 0x40b464a0, 0x87d1cde8, + 0x42923bbd, 0xcd8f62ff, 0x2e2690f3, 0x095edc16, 0x59c89f1b, 0x1fa8fd5d, + 0x5138753d, 0x390a2b29, 0x80152f18, 0x2dd8d925, 0xf984d83e, 0x7a872e74, + 0xc19e1faf, 0xed4d542d, 0xecf9b5d0, 0x9462ea75, 0xc53c0adf, 0x0caea134, + 0x37a2d439, 0xc8fa2e8a, 0x2181327e, 0x6e7bb827, 0x2d240820, 0x50be10e0, + 0x5893d4b8, 0xab312bb9, 0x1f2b2322, 0x440b3f25, 0xbf627ede, 0x72dac789, + 0xb608b895, 0x78787e2a, 0x86deb3f0, 0x6fee7aab, 0xbb9373f4, 0x27ecf57b, + 0xf7d8b57e, 0xfca26a9f, 0x3d04e8d2, 0xc9df13cb, 0x3172826a, 0xcd9e8d7c, + 0xa8fcd8e0, 0xb2c39497, 0x307641d9, 0x1cc939c1, 0x2608c4cf, 0xb6d1c7bf, + 0x3d326a7e, 0xeeaf19e6, 0x8e13e25f, 0xee63302b, 0x2dfe6d97, 0x25971d58, + 0xe41d3cc4, 0x0a80627c, 0xab8db59a, 0x9eea37c8, 0xe90afb77, 0x90ca19cf, + 0x9ee3352c, 0x3613c850, 0xfe78d682, 0x788f6e50, 0x5b060904, 0xb71bd1a4, + 0x3fecb534, 0xb32c450c, 0x20c33857, 0xa6e9cfda, 0x0239f4ce, 0x48497187, + 0xa19adb95, 0xb492ed8a, 0x95aca6a8, 0x4dcd6cd9, 0xcf1b2350, 0xfbe8b12a, + 0x1a67778c, 0x38eb3acc, 0xc32da383, 0xfb126ab1, 0xa03f40a8, 0xed5bf546, + 0xe9ce4724, 0x4c4a74fd, 0x73a130d8, 0xd9960e2d, 0xa2ebd6c1, 0x94ab6feb, + 0x6f233b7c, 0x49126080, 0x8e7b9a73, 0x4b8c9091, 0xd298f999, 0x35e836b5, + 0xa96ddeff, 0x96119b31, 0x6b0dd9bc, 0xc6cc3f8d, 0x282566fb, 0x72b882e7, + 0xd6769f3b, 0xa674343d, 0x00fc509b, 0xdcbf7789, 0xd6266a3f, 0xae9641fd, + 0x4e89541b, 0x11953407, 0x53400d03, 0x8e0dd75a, 0xe5b53345, 0x108f19ad, + 0x108b89bc, 0x41a4c954, 0xe03b2b63, 0x437b3d7f, 0x97aced8e, 0xcbd66670, + 0x2c5508c2, 0x650ebc69, 0x5c4f2ef0, 0x904ff6bf, 0x9985a2df, 0x9faddd9e, + 0x5ed8d239, 0x25585832, 0xe3e51cb9, 0x0ff4f1d4, 0x56c02d9a, 0x8c4ef804, + 0xc1a08a13, 0x13fd01c8, 0xe6d27671, 0xa7c234f4, 0x9d0176cc, 0xd0d73df2, + 0x4d8bfa89, 0x544f10cd, 0x2b17e0b2, 0xb70a5c7d, 0xfd86fe49, 0xdf373f41, + 0x214495bb, 0x84e857fd, 0x00d313d5, 0x0496fcbe, 0xa4ba4744, 0xe8cac982, + 0xaec29e6e, 0x87ec7038, 0x7000a519, 0xaeee333b, 0xff66e42c, 0x8afd6b25, + 0x03b4f63b, 0xbd7991dc, 0x5ab8d9c7, 0x2ed4684e, 0x48741a6c, 0xaf06940d, + 0x2fdc6349, 0xb03d7ecd, 0xe974996f, 0xac7867f9, 0x52ec8721, 0xbcdd9d4a, + 0x8edd2d00, 0x3557de06, 0x41c759f8, 0x3956d4b9, 0xa75409f2, 0x123cd8a1, + 0xb6100fab, 0x3e7b21e2, 0x2e8d623b, 0x92959da2, 0xbca35f77, 0x200c03a5, + 0x35fcb457, 0x1bb6c6e4, 0xf74eb928, 0x3d5d0b54, 0x87cc1d21, 0x4964046f, + 0x18ae4240, 0xd868b275, 0x8bd2b496, 0x1c5563f4, 0xc234d8f5, 0xf868e970, + 0xf9151fff, 0xae7be4a2, 0x271133ee, 0xbb0fd922, 0x25254932, 0xa60a9fc0, + 0x104bcd64, 0x30290145, 0x00000062, + +# define TENS_P13_IDX (TENS_P12_IDX + TENS_P12_SIZE) +# define TENS_P13_SIZE 853 + [TENS_P13_IDX] = 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x64cf8001, 0x9f345226, 0x644963e5, 0x7b8d5053, 0x49f0aa29, + 0xb945c82f, 0x430ff478, 0x933b6bb8, 0x5ff82d0a, 0x64c501d4, 0x73bbf174, + 0x9ec1e1b3, 0x3bfbe803, 0xe9010689, 0xf7390d8e, 0x3fef8d80, 0xf31d1325, + 0x2c73446b, 0xf5ca7a92, 0x1c19e379, 0x270af2be, 0xf52d9d9c, 0xeb2bed48, + 0x3abf72e1, 0x4ac4ffc2, 0x7ecf3508, 0x22019a82, 0x38597a5a, 0xbe6a7b3c, + 0x9a51ff6e, 0xa2d28437, 0x0c0abe9d, 0x7c9ec6ea, 0xc79887ff, 0x5851c899, + 0x436420d0, 0xefead581, 0x72b5547f, 0x99b1d2b5, 0x077ad8f8, 0x5cddbf5b, + 0x3b4305ed, 0xe3861ac7, 0x2d88f3fd, 0x3d6b43be, 0x393220aa, 0xe5382405, + 0x1cd62095, 0x61a10c96, 0x87a0d1e1, 0xca95a55d, 0x68c933e6, 0x9ee082e2, + 0x778089bb, 0x41429ee9, 0xfbb6d8d4, 0xc529500d, 0x26cf5471, 0x68b9be29, + 0xd6c9b140, 0x07be635a, 0x84151852, 0xb5572182, 0x83730335, 0xeb2300b4, + 0xdd312d31, 0x05d6dd9b, 0x488da59c, 0x37784d25, 0xda2c2e40, 0x6a8d92fa, + 0x6a57d720, 0x950b41ac, 0xf07a8632, 0xcd55f062, 0x2ecad06a, 0xe6a3dfe7, + 0x34c98bb0, 0x9c767d8f, 0xb60521b1, 0x752aafd1, 0xe87d16be, 0x9de1d728, + 0xe58a8b0c, 0xc6013830, 0x2fa2c119, 0x3c4f9156, 0x519b40c8, 0x5058fc8f, + 0xab78701b, 0xadc59c47, 0xc502a554, 0x0fb3286f, 0x6647f04c, 0x9db4076e, + 0x5ea495c8, 0x9c74fab1, 0xb4f00f8b, 0x897c7a3c, 0xd092b4c6, 0x283e0340, + 0x32f31fa8, 0xeeb708cc, 0x67b63de2, 0x4f7b3c8b, 0xef2bc02b, 0xda14bfe3, + 0xc49344c0, 0xaabc85be, 0xb6c4e69e, 0x2ece8aa6, 0x63a11016, 0x19cfba4d, + 0x726ae4d9, 0x0fc90b42, 0xee6ae707, 0x4290b04a, 0x4d9aabc5, 0xfb2b070e, + 0xf34906cd, 0x1ff54b0a, 0x52ca9709, 0x0b42bfe1, 0x16431570, 0x980f3076, + 0x6b5565bb, 0xeb8c4c4a, 0x9ce63c76, 0xb9e4c771, 0x3da24c53, 0x6f0266fa, + 0xb50e3c66, 0x76e34f79, 0x01bb4b96, 0x9948cf3e, 0x0fbea124, 0x86bead12, + 0xa1fa4edc, 0xd11e901c, 0xc3b97bf9, 0x71730e03, 0x370ca58e, 0x48b19715, + 0x886467e2, 0xdb237497, 0x3c727e24, 0x2116ccd2, 0x8e67d76e, 0xf973aecf, + 0x34bdedd3, 0x31d680ec, 0xb042ab05, 0x770e96a0, 0xfc5c3c17, 0xab6f1874, + 0xb8204ece, 0x5843f3a5, 0x416c0ced, 0x11dd112f, 0x95780183, 0xb1c74bd8, + 0x7e0e8613, 0x96c6453b, 0xa79ffc10, 0xb2157651, 0xfcd6da0a, 0x836a34a7, + 0x3dd0ccac, 0x316e5a36, 0x496049ed, 0x0322bcb2, 0xdea1a97d, 0xcdf2aa5a, + 0x39578d53, 0x1d1aa931, 0x030565c9, 0xd198cbed, 0x324e0a27, 0x5db83e8a, + 0x28432534, 0x90bf23e8, 0x5cb134c0, 0xdd0adab6, 0x009e5051, 0xf8ad61da, + 0x7e36a6d7, 0x84c75e57, 0xbdffe6aa, 0xb5d5532e, 0x138d680e, 0xbd84ddac, + 0x4a5f74a1, 0xccff00d1, 0x55538cfa, 0xb0948b8c, 0x48528011, 0xe345f82e, + 0x9e047ad7, 0x6ee770ff, 0xea77bef0, 0x0fc13669, 0x2f162567, 0x869426ac, + 0x0614686c, 0x3a3ff464, 0x4263ed82, 0xb3589b47, 0x57205a7a, 0x213f24ad, + 0xae6fc46b, 0x3de03e4e, 0xd92b133f, 0x315a589b, 0x1b49c24a, 0x73381bcb, + 0x1641c138, 0x7bc99425, 0xbc680ada, 0xa5cfbc9a, 0x962e9884, 0x0a960d70, + 0xfc8d12f6, 0xed18ef4c, 0x60acc868, 0x9aea5d14, 0x13113036, 0xc747c87e, + 0x2d99a5b0, 0x3a369bb3, 0x006b3658, 0x118a5135, 0xe43fa6e6, 0xb4947190, + 0xa13dc05e, 0xd7733db8, 0x0dbd7170, 0xc3fb67d1, 0x117ed7e7, 0xe2d72a49, + 0xc05fe99e, 0x9638db40, 0xd971a25b, 0x4239d468, 0x1a159559, 0x850a223c, + 0xc1117392, 0x22d2dbd8, 0x567b5fc0, 0x92c5b4eb, 0xc051007a, 0x11cc0099, + 0xfb355720, 0x6907810d, 0x39848161, 0x5e8534f4, 0x61d19ef2, 0x2ee8c466, + 0x8a0ab03c, 0xc234af76, 0x879aa514, 0x9774a235, 0x59e5da57, 0x9bc466b3, + 0xf339bd5a, 0x44ab026d, 0xbbb5fd67, 0x2b977202, 0x3685c9f2, 0x03e5dc00, + 0x7054359e, 0x5239cfb0, 0x9ba11f08, 0xf8237562, 0x9c258687, 0xa3b510dd, + 0x52c7bf8f, 0xb31ed0cf, 0x3245e079, 0xff9ff8d3, 0xbaee38c7, 0xf17d5562, + 0xf702b3b9, 0xcc4c8563, 0xcbca275d, 0xe005d9d1, 0xe817dbac, 0x05c6920a, + 0x62cee350, 0x0f1deac0, 0x19e049b9, 0x59599f74, 0xb2a27a16, 0xf0911d5a, + 0x7dcef00d, 0x3603dd66, 0x37552251, 0x97813735, 0x5fa022da, 0x0d849416, + 0xefbe57c2, 0x30a0e592, 0x57619296, 0xc953cc47, 0x11735043, 0xa83526ad, + 0xc0444be0, 0xb5f8463c, 0x16ff5136, 0x2a0a6631, 0xf037572c, 0xd30464da, + 0xb1bf8daa, 0x7f5718f7, 0x0f3e9e7e, 0xe5a4cfe7, 0xc26f2624, 0x8c9b5ae4, + 0xdfe8f485, 0xf6fa82e3, 0xc64a1509, 0xacb24aea, 0x3024b220, 0xddb02ac0, + 0xddcdfedd, 0xd834c574, 0x384c86c3, 0xd904e099, 0xdd48a571, 0x4550a05f, + 0x77b35c74, 0x81e85f71, 0xaaebdc6d, 0x0f9bb0b1, 0xd4cdc054, 0x7af4df85, + 0x845786af, 0xe5e53887, 0xdf2a91ca, 0xf6a58211, 0x5689a3c4, 0x8cf6aa15, + 0xa705983a, 0x9fbf2f52, 0x2ce7fef0, 0x48e84a62, 0x4a3b5365, 0xf8281a47, + 0xd48a0872, 0x8423dcf6, 0xf0929c3e, 0x044a5049, 0xe9ec071b, 0x17decc36, + 0x20e30c1b, 0x45fc2813, 0x3342196a, 0x46afb7f9, 0x6601e337, 0x30754439, + 0xf18094d1, 0xd38b4112, 0x61410dd1, 0xd8796b36, 0xd97d4dd8, 0x47e9bc0b, + 0x80805191, 0x1584e2da, 0xcde438c1, 0x955d24f1, 0x409659a1, 0x1b0950b1, + 0x5a09635f, 0x65b1febe, 0x615472b9, 0x525dc00a, 0x6308e067, 0x4089e2d4, + 0xd4e705a4, 0x43fc9209, 0x32c18b26, 0x4447a5fa, 0xaf271153, 0x3617cadc, + 0x4dc4f0d2, 0x692eb386, 0x6aa116ef, 0x655991bc, 0x0641dc0b, 0x54469597, + 0xc6559664, 0x749c0fe8, 0x4bdc0d1a, 0xa7d3381e, 0xc5292a61, 0x4eb65fdc, + 0x42474cc2, 0xf2c6b173, 0x19dfc9ee, 0x0a19a199, 0xbece2ee3, 0xc68b778d, + 0xaa03aa7c, 0xc8db86f0, 0xae54d2be, 0xb92a01e0, 0xdee3f48f, 0x6023c0a9, + 0xf6ae2852, 0xa233763b, 0xa441cb9e, 0x3246dddd, 0x3a8bb4b7, 0x44faa3c3, + 0x308ef2c8, 0xfd1c8516, 0xd2862534, 0x3b25ebe7, 0x62336f6f, 0x0c336a45, + 0x0b8e2ce6, 0xe867f171, 0x11eea1f2, 0x523972ec, 0x68df4903, 0x50c05824, + 0x51ef4cb7, 0xcb4df2a8, 0x3ffae115, 0xb51aca2f, 0x3ed1635f, 0xd6ff1cc6, + 0x0a5ac09f, 0xde8ed9d6, 0x0a3dc76f, 0x5dc2d8dd, 0x37991dde, 0xf95bacb2, + 0x80ad6e13, 0x163005ee, 0xd4f8c7a6, 0x3225d180, 0xa4760f08, 0x5fff004d, + 0x9b2b1a87, 0xe7ea8576, 0x5cd00b66, 0xec478452, 0x285dd80d, 0x20112439, + 0x4301b3a1, 0xff879fc8, 0xfacbb68c, 0xaf6af6b8, 0xb17fdf84, 0xc208d9f1, + 0xf4489576, 0x8794a6e9, 0xadcc862c, 0x0e83e54c, 0x931685a4, 0xab01c580, + 0x1e40293b, 0xcad784fa, 0x1f1ddf7f, 0x6b856084, 0xcee722b2, 0x1c39938b, + 0x74254eb4, 0xc7ccebf4, 0xb9c26d9a, 0x6b08dfb9, 0x2e3ece24, 0x981455ec, + 0xdff60410, 0xbc804e2b, 0xe06fa38b, 0xb534540c, 0x72e53c52, 0x02dfb2ef, + 0xb2a5c05a, 0x5002a2a5, 0x97313338, 0x597c53ff, 0xd61df455, 0x34e5261a, + 0x39ac2ec5, 0xc6bc0cab, 0x388b7539, 0x3f732fc0, 0x00eac704, 0x92fb21d9, + 0xc089971e, 0xb4ffa503, 0x7af93f8f, 0x72e353b6, 0xa8311b23, 0x8266c9af, + 0x1de496ca, 0xdbdb16b0, 0xd6fa0b51, 0x9991a5ef, 0xbd563089, 0x168cbe0f, + 0x0954a1e3, 0x537b9245, 0x53d09723, 0x2867272d, 0x86558cb9, 0x0b83f026, + 0xfac85d10, 0xf8562951, 0x1e5ddb95, 0xad3668c8, 0x48d27b92, 0xc930b7e6, + 0x19b58a99, 0xa3de74e3, 0xa9cda917, 0xcb6e35ee, 0x7a4dd16e, 0x4c80e9d5, + 0x4d84073f, 0x74a95ba8, 0x9cffcfc0, 0xd28485eb, 0x15796372, 0x5717e9cd, + 0x77eda8df, 0xab473c4e, 0xadb965e1, 0xffad6959, 0x5bc05659, 0x6ed63880, + 0xfb240227, 0x2014850b, 0xd15fdddf, 0xfdd74592, 0xb538f37d, 0x3a8e2e82, + 0x1473396f, 0xf6a5edf8, 0x3ce41a21, 0x0cc4351a, 0x754e8264, 0xaab95e73, + 0xc7821b96, 0xf42ff463, 0xc242faaa, 0xdd00ac65, 0x087e260e, 0x17d193f5, + 0x0dbe0328, 0x844a63c9, 0xf9d10f96, 0x85aa91dd, 0xbaf127ec, 0x0ab6dabb, + 0xce85e6a5, 0x1af5d24f, 0xe7b56a16, 0xcd6c5a19, 0x57d1d79f, 0x5dfc2b28, + 0xec4dd2f0, 0x18fe64a1, 0x8d72216a, 0x5f222077, 0x72f14a08, 0xd8b09b11, + 0x3bf038ab, 0xc6cf1f44, 0xc4265d7c, 0xdab1b0e7, 0x46398d2c, 0x7dcfdc68, + 0xb6e705d3, 0x4aafd1e6, 0x362c1183, 0xd8701107, 0xf6ac98b7, 0xad114d7e, + 0xd6649424, 0xc40ab551, 0xddd1c6e4, 0xa132030f, 0xc9d284c8, 0xdb1f662a, + 0x824069ee, 0x4157904b, 0xc846b3ad, 0xd38481ca, 0x0a248c17, 0xc846831f, + 0xe8745feb, 0x000025a8, + +# define TENS_P14_IDX (TENS_P13_IDX + TENS_P13_SIZE) +# define TENS_P14_SIZE 1703 + [TENS_P14_IDX] = 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, + 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x099f0001, + 0x41b5687d, 0xcbfd1b6e, 0x8c75ee63, 0x4b191cea, 0xd75296ad, 0x2394d80a, + 0x1eb5da9b, 0x18a004ed, 0x5c79fed9, 0x37e3b01c, 0xed67a1b8, 0x78d9a714, + 0x2a1a34d5, 0x8fbe7f0d, 0x6b1d3516, 0xe57c43ea, 0xa7825681, 0xc81d32e8, + 0xd3e716e1, 0x58860b00, 0xa6d93d65, 0x83159c97, 0x0113232f, 0xd6122269, + 0x7321c3a0, 0xbe6a92f3, 0xca4ca9d3, 0xd1e276a5, 0xc0e55163, 0xb05915d6, + 0x7b7a78c1, 0x0fae0ca4, 0x62a3df4b, 0x08abec6f, 0x13030d11, 0xd446338a, + 0x60dcc8f2, 0x5f05d1d5, 0x25e1f9f6, 0x04a40bee, 0x7f8c7113, 0x88f47ec0, + 0x589ff59a, 0x308c3661, 0xea5068a1, 0x95fb108f, 0x06e87dff, 0x1559e741, + 0xd4d4abdc, 0x01e092e4, 0xee16907c, 0x5a7b78e6, 0xe73aabcb, 0x146bb7e0, + 0xad372889, 0x4f6b43c5, 0xfd49fc1d, 0x0f29f589, 0xd3739253, 0xc4745a56, + 0xe2acfcc2, 0xd75ccbc7, 0xedd016cd, 0xac5a63e0, 0xef82ccd3, 0xb352496e, + 0x2bdabfc4, 0x5b3d0401, 0x01b0197f, 0xade96d3c, 0x29d9253d, 0x19bebdba, + 0x73c56b1b, 0x255e7b25, 0x1f2b7f1e, 0xa56a457e, 0x6299c836, 0x5c63cc78, + 0xa2ca74c6, 0x5c85fe93, 0xee571bea, 0x508e2561, 0x2db5f1d0, 0xb1fde6a9, + 0xa9b87b99, 0x4fb90a37, 0xf7260f07, 0xff58c5fd, 0x56ee7e97, 0xbab9fa46, + 0x42e6f9ce, 0x78816f73, 0x1b76d267, 0xfdb2c728, 0x4566519c, 0xae17dd8d, + 0xb9f6a95f, 0x1cd533a1, 0x67160dea, 0x14534bac, 0xfcd8f8f9, 0xf3f2901d, + 0x708b1f0a, 0x8829063b, 0x9457a1df, 0x8f872aa1, 0x36bb9335, 0xb5672c0e, + 0xd889d109, 0x7ec63a6a, 0x93306672, 0x39b6d457, 0x8239ab68, 0xef2e2506, + 0xbe0d7a1f, 0x4251b635, 0x05f65522, 0x0ef0bd55, 0x03286891, 0x2c42b664, + 0x9815fbac, 0x471fd611, 0x814e379c, 0x7dd8349d, 0xa4a25bda, 0x9886b84c, + 0x01b9e39d, 0x5a7ce1a2, 0xae31cbc9, 0x86d07f32, 0x83ef8faf, 0xb66b5b76, + 0x58470fdf, 0x96d59b73, 0x51618889, 0xdc400cf7, 0xfc8e0fc6, 0xaf693670, + 0x09a08e56, 0x91737de6, 0x74f682e1, 0x0e03923f, 0x7f8ac56d, 0x7400cfd4, + 0x8e05e49a, 0x4cebea3c, 0x384e1164, 0xb2e43d8c, 0xb50ae05e, 0x0f0b3ed9, + 0xa4006123, 0x64137137, 0x4e9a1934, 0x05404100, 0xd9621be6, 0x9329a255, + 0x5c347ebb, 0x75cbeb1b, 0xe684346b, 0x840fee55, 0xba6a9753, 0xf43836f6, + 0x60505b7b, 0x334a9278, 0xfd6d475d, 0x5db94761, 0x267375aa, 0xc110e160, + 0x024f6d63, 0x2ec96610, 0xa99b4c19, 0xb915c9f4, 0x338cfd90, 0xf02ea846, + 0xb9e51a09, 0xae928fb1, 0xfae31d88, 0x1a3db721, 0x8475dd26, 0x5769489d, + 0x7ad4c407, 0x0a49e9f0, 0x34e275c8, 0x3d075d83, 0x1d63114a, 0x72a96415, + 0x6b98e947, 0x1d500b5f, 0xd50fdc36, 0x141e5085, 0x87751275, 0xe7843834, + 0x2278809e, 0xb15c52ee, 0x947aead2, 0xfedb7b02, 0x5197b744, 0x64e09ba8, + 0x8849d0a6, 0x23beaa85, 0x11ecb913, 0x0f7ed667, 0x5d984848, 0x9f6331ea, + 0x588290e9, 0xa24d64d1, 0x7e09e9e5, 0x32592033, 0x03a501df, 0x27c270a6, + 0xbb3df738, 0x3c7c5a70, 0x4190833c, 0x7d4bf9f4, 0x80e5d89b, 0xa7fc6194, + 0xfaefb663, 0x62e52b49, 0xd3b6adcd, 0x809646fc, 0x1f2cf73a, 0xb765ed4f, + 0x531e4bfb, 0x92cd05f2, 0xaf12d1a6, 0x22ee30f3, 0x38da1074, 0xed6447bb, + 0x1a725608, 0xaff222d3, 0x7a3c6f54, 0xbca79a56, 0x7b0e8d12, 0x1c4660c5, + 0x6e34d6fb, 0x6f481a9f, 0xfe9dc99c, 0xf888db82, 0xd8489ea0, 0x84b4c0fa, + 0xc0dea281, 0x977a8583, 0xae30e887, 0x8c1cbcec, 0x1d4848cb, 0x0ee0d137, + 0xd011b0fc, 0x94b5fd49, 0x478d7dd4, 0x3d67f2e7, 0xacab62ad, 0x0ab4e62a, + 0x1dfc7df5, 0xd22e4553, 0x870b0e75, 0x49b7b001, 0x1b73bf6d, 0x12807ffd, + 0xdc9f0737, 0x6f3e5852, 0xc0e2f250, 0x93e62e4a, 0x4d96a55a, 0xc1d0e185, + 0x83a126db, 0x190b917b, 0xefbfd043, 0xc7df1669, 0x8f25b6dd, 0x2062eac9, + 0x476c17a6, 0xcb60f278, 0x25460383, 0x0e85e996, 0xda8c05be, 0x6f678a34, + 0x69206234, 0xf59be929, 0x1947b69a, 0x0ebfa11b, 0x90fd8322, 0x15c1e9bf, + 0xd699b1ec, 0xb2f0343f, 0x7001d002, 0xcf76eaaa, 0xc0778ab5, 0x5173eda8, + 0xb7b008e2, 0x4e00e4c6, 0x505d3f4d, 0x99dd341a, 0x1c9d4e12, 0x4ffb6978, + 0x474c5e95, 0x6e9ca6dd, 0xda19f938, 0xe2dda6e0, 0x98dc318e, 0xda455e54, + 0x3f67b836, 0x21e4181c, 0xa97e9a64, 0x1e17f655, 0x527a08bb, 0x1712dc21, + 0x682972ad, 0x0042d256, 0xccbeadf1, 0xca497b96, 0x861e99e0, 0x0d8aa585, + 0xeeb0f650, 0xdcc3c3da, 0x506af77e, 0x5deb9768, 0x7c9d60be, 0xe9d978b7, + 0x37b37e95, 0x77ad0b94, 0x42747f75, 0x07be42c4, 0x6d5fd2fe, 0x4c8c5da9, + 0x0d8fc27d, 0x0f2fd50f, 0x0ccf6023, 0x5b56053f, 0x3b1101bd, 0x56d34906, + 0xc0feca27, 0x7602a150, 0xc4888da4, 0x419abe54, 0x56d10633, 0xc76120ed, + 0x8db14123, 0xb656e675, 0x741e8f76, 0xd297b94e, 0x96be6f21, 0x3662439d, + 0x9b409e27, 0x6626574d, 0x35fff92a, 0xbf558205, 0x69e02439, 0xbe6838b7, + 0x6400fd4c, 0xa00f64ca, 0x1f4b158a, 0x9e2052ae, 0x04cca558, 0xfb5ee69e, + 0x58da644c, 0x96f26e1f, 0x8ab19401, 0xbee1e16b, 0xed8bf908, 0x2f2809a4, + 0xd50babab, 0x6e57f7e6, 0x6b0a8929, 0xf7356431, 0xb54a4cfc, 0x9a1d0ac4, + 0x6f9fd6cb, 0x836bfbf8, 0x3b42f469, 0x8bd32129, 0x40111b6b, 0x7c278fb1, + 0xb345d955, 0xff1fd188, 0xd32cd13c, 0xf7ec3aa0, 0x3789f792, 0xab707fa4, + 0x4d79a4bf, 0xb3a28ceb, 0xd9c24d8e, 0x7134dadc, 0x06e2eb3e, 0xd7c04f76, + 0xb379d811, 0x2b3b0ebc, 0x8c94fc33, 0xa28b53ab, 0xc06c5d01, 0xd900432a, + 0x7fea91ca, 0x6d30b008, 0x64845f08, 0x796f5349, 0xfde4687d, 0xf888fe67, + 0xe0046c56, 0xae482177, 0xce98cb11, 0x84590c46, 0x1feb4400, 0x6e1ba29b, + 0xff2f1611, 0xf73f3e9c, 0x3159ca8c, 0x34845918, 0x56f0ed46, 0xb7d10c32, + 0xd9a16a01, 0x405b9e91, 0x3cee3e24, 0x8739e4a6, 0x2ab396b4, 0x3f1b7871, + 0x09835dfd, 0x8c7a489f, 0x1592b74a, 0x05df7c81, 0x0e8d3f37, 0xa61ff273, + 0x68b29622, 0x259cd337, 0x43ff84a6, 0x81cf8fe9, 0x566ed883, 0x48427fc6, + 0x35c79428, 0xcfd2fb59, 0xa97e8c8b, 0x750aaed8, 0x32ddca23, 0xaa8108ef, + 0x96fbfff9, 0xa1d039aa, 0xe3cdf588, 0x47e77e00, 0xcd6b3fdb, 0xe72a9a80, + 0x9a522152, 0xeda06283, 0xef175610, 0xa670cfa1, 0x339fe6c4, 0x2dfbf3ee, + 0xc2d7f53b, 0x92a44e27, 0xcc47e4b0, 0xdfa212bc, 0xd64f83c9, 0x997e5475, + 0xb51319bf, 0x9fffe599, 0x1fc2c7b6, 0xef5605e7, 0x832169dd, 0xfeb6be4e, + 0xbf921dc8, 0x60bdfb1d, 0x72759f8d, 0x3546efa0, 0x020eebed, 0xcaab3d64, + 0xdb20a2fe, 0xba1218f6, 0xb2b62bdd, 0x3101eff0, 0x8fde5cfa, 0x2e319213, + 0xa52114d2, 0x87eead3f, 0xdf08b1dd, 0xa5387642, 0x746f34d0, 0xd76c4844, + 0x4cc40317, 0xe4f689c9, 0xb7d76071, 0x5fe0b4a2, 0x6e1c7915, 0xc7d43f53, + 0x3efb7d71, 0x068dd906, 0x35a75f5f, 0x652d7770, 0x750f4607, 0x64a1656c, + 0x36c2cf8e, 0x214d758b, 0x9348ef93, 0xe4058978, 0x9674b7f3, 0x10570b0b, + 0xbdfaba8f, 0xcef09dd7, 0xa92b261f, 0x071c21b6, 0xcbebb81f, 0xf427ed6c, + 0x44228cd6, 0x65e56fcf, 0x5036c460, 0xad919def, 0xccfd848b, 0x61d158a6, + 0x7527dca3, 0x4cf30459, 0x50855075, 0xa70dfd09, 0x3540f5aa, 0x35577adb, + 0xb5ba3d4e, 0x35736c4f, 0xcdfb689f, 0xefe8fa82, 0x97ab0dca, 0x51bd2ff3, + 0x77a7fe9c, 0x3107846c, 0x3d618b81, 0xbca797a4, 0xfc5e9651, 0xe2e08fbc, + 0xf7e8791f, 0x772f1cc0, 0x7c426f9d, 0x08d56f88, 0x0080c3ab, 0x0deea663, + 0xe6d46ec6, 0x7dca4eb7, 0x6b681d9d, 0xda06730b, 0x4af0e0f2, 0x038bf468, + 0x52097463, 0xca19d302, 0xbc09bb9a, 0xaa55aeb1, 0x3ded4433, 0xf27938ba, + 0x3e4b7865, 0x28296be7, 0x7ef96314, 0x7a1d55cc, 0xdf0b6b47, 0xcde11852, + 0xcedda5bd, 0xf00a0eb3, 0x72ca1a8b, 0x5241b572, 0xb002fdcc, 0xff8898b3, + 0xc4878862, 0xb3e85372, 0xbf4bca29, 0x7e1fef45, 0xf2d83189, 0x0f5427af, + 0x3cdf9e05, 0x75bae885, 0xf65c06ac, 0x9c71a700, 0xa3145eac, 0xde63bab2, + 0x76255bbf, 0x6e817be6, 0x4c6ad3d0, 0x25ab9935, 0xe95ef2f8, 0x11cd095a, + 0xd54f78de, 0xa001ae7e, 0xb3829dcb, 0x5abd18bd, 0x18eb9c9e, 0xada3c504, + 0xe3e3556c, 0xd35479aa, 0x5191ac5f, 0x221821ac, 0xc8d1d9d3, 0x313a8c51, + 0x088c3fc8, 0xc146a264, 0xb154abed, 0x92755bc5, 0x349ec093, 0xf94aba57, + 0x41d5886c, 0x0a5ad8b2, 0x36aba94b, 0x883a6758, 0xa9ad229f, 0x5d64069a, + 0x0546172f, 0x0366da16, 0xc3808ea4, 0x0b172403, 0x70f0a235, 0xfa816e66, + 0x4fceb827, 0xa65fcfea, 0x167b56d5, 0xfe2b9fb2, 0xfec36bcd, 0xa84c4cc9, + 0xcd96320f, 0x3e128584, 0x09eda8b8, 0x91eca525, 0x7ec7e17b, 0xbc45bedc, + 0xc14032f4, 0x9be689a7, 0x2eb20bc0, 0xffdf1efc, 0x14ef835f, 0xc6966c59, + 0xcd778dd8, 0x5feb0f3b, 0x23d47715, 0xd64b87c8, 0x5722a550, 0x62883198, + 0x315a1a8b, 0x648e17e6, 0x4b7e9d7a, 0x2ba43d28, 0x67caca84, 0x741f0398, + 0x6e660159, 0x3e16e1a9, 0x3dde3c45, 0xa53e56ae, 0xc7eb0aef, 0x3f39f33e, + 0x78751d73, 0x45816df8, 0x626770f7, 0xcb17d28d, 0x909e87f4, 0x93a86aba, + 0xc1dcf328, 0x1a1e4ce2, 0xd895d042, 0xb9f6dd69, 0xbb00eaf5, 0xacc37687, + 0xca609578, 0x5b490d39, 0xf8b86d4c, 0xf2737ef0, 0x39419f6d, 0x69267bc0, + 0x72524a03, 0x6eb060c4, 0xdbc01e93, 0x291035b1, 0x83984d54, 0xf673ad85, + 0xe08cbc20, 0x1fb24915, 0x584803a6, 0xe15bbcd7, 0x4088ddb5, 0xd4c22542, + 0x2c18041a, 0xa51372d1, 0xb2ba69b4, 0x2299283f, 0xcd11c296, 0x25dcd6f3, + 0xac54df23, 0x24a3a55e, 0x77e16e1d, 0xb3cd415b, 0xb99d85c0, 0x497befc7, + 0xe91154e3, 0x7365cd8b, 0xb55100aa, 0x0ee699eb, 0xfc0927a6, 0xefb374de, + 0x8acaa910, 0x83b40e3d, 0xda3f0006, 0x8590a089, 0xc6ce1b75, 0x54f6ff20, + 0xfda2f7f3, 0xd2ab58f6, 0xd0763b6d, 0x6caf2515, 0x2519622d, 0xc3714057, + 0x9863638f, 0xea00bb4f, 0x09ea4a4d, 0xe69de96d, 0x6b01fe5f, 0x960161a5, + 0x529e32ec, 0xf8260ae9, 0x01a37eea, 0x69710577, 0x5aa0716f, 0xcb3fb1da, + 0x4260feda, 0xa33fb790, 0x76012f75, 0x24c0e5be, 0x130f09ae, 0x2e8323dc, + 0x5c8ecb76, 0x17cb8f12, 0x401b5f5c, 0x5f0a63e0, 0x47e1560a, 0xdc57a786, + 0xee1377d4, 0x228e7ee5, 0x0aa294b9, 0xaea6c534, 0x55b0fe2f, 0x922d318a, + 0xf108b772, 0xf15bddf6, 0xdfb69702, 0xcd438a4e, 0x90e1db66, 0x584ce4a1, + 0x568ef6cb, 0x69e55f9d, 0x6da376ba, 0x5ca6c109, 0x45c7e294, 0xc977b3e9, + 0xcf5b6c0c, 0x1d694499, 0x11b487ae, 0xcf8339ac, 0xbcb3cc6e, 0x50b828e0, + 0x046b1071, 0x5703ed0d, 0x2c615946, 0x720d1610, 0xa908dbd0, 0x742bbe33, + 0x22c076e2, 0x48966a66, 0x1d0cefa4, 0x1dde819f, 0x601352bf, 0xb9370c39, + 0xa585cc4a, 0xeb857f94, 0x5a2f7206, 0x3fae6b58, 0x49cd0f1f, 0x78e5fb3d, + 0x1b89d476, 0x74e9e65b, 0xed82945b, 0xb74e6483, 0x2941c4d9, 0x7e087acc, + 0x565c18dc, 0x1a09f2e5, 0xbf4ccd3d, 0xd304e977, 0xa522631d, 0x6123378e, + 0x4517109b, 0xb7e4285a, 0x4bf1a506, 0x625803c2, 0x683172f8, 0xc84e7354, + 0x3f8a2b11, 0x7dd12b89, 0xed420491, 0x8c698b0b, 0x9853fb97, 0x9631777b, + 0xb697e1c9, 0x5f028f05, 0x51038110, 0x9055f055, 0x30e255e3, 0xe2d0c1b6, + 0xb990321e, 0xa8fdf4d1, 0xff4dc144, 0x521a3056, 0x148999e0, 0xa8111c66, + 0xa9c96852, 0x8157f508, 0x4b394a94, 0xa0dc4df1, 0x94ec2e93, 0x6e6afa56, + 0x8fc28377, 0xf72ffa04, 0xc435186f, 0xf91488b7, 0x8d037f6f, 0xa899ec1e, + 0x48757727, 0x4101b612, 0xb8cf377d, 0xa5a54e68, 0xb4570569, 0x2ac5a0a0, + 0x063d9cfd, 0x7c504c74, 0xf1a5884c, 0x0a9b1955, 0x8d0b91bf, 0xe5f6862f, + 0x79ff5361, 0x0ed3d38f, 0xc6fd31fb, 0x9fe131c7, 0x85b9c648, 0x8febf2b4, + 0x8e77e86b, 0x992ba80e, 0x56429986, 0x6848879a, 0x608cdda5, 0x3e0d106e, + 0x754b300e, 0x25200576, 0xafd5195b, 0x5d37aad9, 0xe81f0939, 0xe00a390e, + 0xdeeea20a, 0xf5fef0be, 0xb5d51155, 0x6e27d173, 0x9e72ebcf, 0xb776e978, + 0xb966f7ba, 0x09520238, 0x726c8408, 0x3347ebc5, 0x65dce5a2, 0x3ec78337, + 0x8c92d740, 0x3cdde3fe, 0x32caec93, 0xd20379ae, 0x411be811, 0x41756580, + 0x72fa1bbd, 0xa92125b3, 0x84c42f04, 0xdd4ee5fe, 0x3a25922c, 0x96446853, + 0x49ad3be0, 0x2880366d, 0x1c841afe, 0xf1e09019, 0xfb905fe1, 0xa451ad59, + 0x3ba9d0c9, 0x56db2e9c, 0xa42419f2, 0xe921e7a0, 0x3c9a3ca5, 0xad8ea375, + 0xcec7d091, 0x99bdb940, 0x477ef58f, 0x8a4933c7, 0xb2598b8d, 0xf5659df7, + 0xcfac1e1c, 0x339f8748, 0xe2a04aab, 0xe122b03f, 0x45bc6f37, 0xc9feeb30, + 0x9c75aaa0, 0xc13c174e, 0x0ea0585d, 0xdc58bbb4, 0x3a96bd5a, 0x20251482, + 0x3c7a714d, 0x696897eb, 0x6cb83b6b, 0xa37de406, 0x3b496b5f, 0x37e75d6a, + 0x380dd382, 0x0e1a513c, 0xda26fac9, 0xf2458364, 0x12b5c6ea, 0x79ce9e47, + 0x1ff1fcbf, 0xbe7c6e86, 0x59a6a7ba, 0x8d70f515, 0x94761453, 0x6b04e425, + 0x8768ffb2, 0x1ca5f425, 0x3f9e8407, 0x3b641184, 0x5f8f6756, 0x62b1a5a5, + 0x56bc2120, 0xd1e5da68, 0x17f2fa18, 0x8cce5e2d, 0xa1bc9c06, 0x8e290fb1, + 0x892df1af, 0xad10b8c8, 0xb43e5517, 0xd0597409, 0x4407c38f, 0x4a020d81, + 0xfea9c9b6, 0xd8e0e7d6, 0xd5b2aaf9, 0xde5e9b40, 0xda44ed4a, 0x45d6bf41, + 0x87aa3ca0, 0xc62d12fc, 0x4708acc8, 0x10212e26, 0x0d1227ff, 0xfeeb5742, + 0x5da02550, 0xd66668e7, 0x1d56e5e1, 0x32c215ec, 0xae1e0bef, 0x7f048b7e, + 0x58c0e922, 0x2aea8619, 0x58251aac, 0xbbe10425, 0xa1fea536, 0x2e1d9667, + 0xd233eb7d, 0xcf435c0b, 0xb0693c67, 0x61d918ea, 0x903ec9f0, 0xd6c4e8ac, + 0x0efb1788, 0xb0098f5b, 0x1709d878, 0x3c12b35e, 0x3f6ce1b7, 0xa1b3ff54, + 0x8a8f7dbb, 0x37608d6a, 0x73e8563e, 0xa3330540, 0x64e00749, 0xebbfcab9, + 0x8d5caaf9, 0x3bc87c7e, 0xedb2bd94, 0x22f8f62d, 0xe656dec3, 0xc5683222, + 0x670c1626, 0x94089e7f, 0x4237542f, 0x47d29440, 0x2fc4e530, 0x8419441e, + 0x8b288dac, 0x7f9245f9, 0xa7afb4e9, 0x8a15650d, 0x082adef7, 0x3104ef19, + 0x043c62de, 0x0aff3dc5, 0x7ecd0635, 0xe7e80a8b, 0xe0600fad, 0x4d8e81cc, + 0x81ebf4e0, 0xf587e30f, 0x7b372af7, 0x2d8f8ca0, 0xdee11c6f, 0xd3624b1c, + 0xf8adc426, 0xca9debed, 0x5c22de4f, 0x3634f778, 0xfae3186b, 0xacf8b595, + 0xd7bfa75f, 0x003cd316, 0xbbfe3cf6, 0xb023cb50, 0xc51055a1, 0x0063cffd, + 0x93869a77, 0x51e022d4, 0xfbceeb10, 0x5187457e, 0x109defc9, 0x673892d8, + 0xe13cfde2, 0xd4aa3272, 0xc09c8134, 0xbf89ad5b, 0x0327181b, 0x09511ec7, + 0xaa21b632, 0xd7e72186, 0xe41885b5, 0x46713f9c, 0x493d2789, 0x1386c526, + 0xd5d22a5c, 0xcefddfc4, 0xcf59281c, 0x92973ea6, 0x4ebe43f6, 0xeac5c6ad, + 0x6cf4897d, 0xd95082a0, 0x82ce562a, 0x28e5e9bd, 0x28d8f0db, 0xddf06e81, + 0x707b0166, 0x7dae3f00, 0xfbf5756a, 0x035a4680, 0x4f114102, 0xe7ba4b33, + 0x5190fedf, 0x106a7594, 0xe5f1bc49, 0xaae3ad67, 0xd7a1a766, 0x040ee971, + 0x9120a214, 0xf415b374, 0x1edc87ea, 0x17aab43c, 0xc6ad637d, 0x885858c1, + 0xd90303c7, 0xbfd4b70b, 0x3ff4eb0e, 0x344a9a88, 0xd81eea30, 0x95925446, + 0x5adef0ec, 0xabb5f5e7, 0x20bbd8c3, 0xc1c22cce, 0xe6944262, 0xc5acdb23, + 0x80024021, 0x2232c635, 0x94b30c81, 0x55f07648, 0x78569acd, 0x9696ea39, + 0x4dd6b528, 0x1c3e1b40, 0xde5853b3, 0x8a2c3679, 0x6eb5a7d8, 0x56bda89a, + 0x8f9cf096, 0xfda86d5b, 0x6481c7e7, 0x50a6a7d5, 0x15bfb45d, 0x4f9a5381, + 0xc057d45d, 0x4fb10024, 0xa0009f00, 0x5e1ca0dd, 0xac420f74, 0xcfbb38bd, + 0xf0d4a615, 0x19bf0318, 0x0e3aef84, 0xcb3d7b20, 0x166c1e3e, 0x58272fdd, + 0x3bfacf9f, 0xc0f5ce46, 0x63a13528, 0xea59e333, 0xa020ca8c, 0xaadd116b, + 0x3dbb5a3d, 0xe5523f47, 0x747f55ea, 0x0922171e, 0x64d520fb, 0x6c709e84, + 0x07ce951b, 0x35fdc402, 0x7508eb6d, 0xc495a8fa, 0xb0d11c39, 0x81313d65, + 0x57447ef0, 0xa7b61e26, 0xf72301f3, 0xbb096315, 0x45a3a7c5, 0xa903a44b, + 0x00432f88, 0x19081987, 0xeb4e1b66, 0xbb7b66bd, 0x6d245171, 0xde4182f5, + 0x0d89bd0b, 0x87f4de6c, 0xf70d8a60, 0x9a87855b, 0x08a27449, 0x4ac7720a, + 0xd4964017, 0xb0d9ddac, 0x4db3488c, 0xfe397d44, 0xd07b745b, 0x197dcb7b, + 0x6e9d567d, 0xe3b90812, 0x9143fef1, 0xb9e002ac, 0x115ff96d, 0xf60a2201, + 0x5b61c9c8, 0x09abab2f, 0xb14a44a7, 0x0ca19c73, 0x843c7997, 0xe3a9bbe6, + 0x5e3fc18c, 0x0c0404ee, 0x764df59d, 0x990ec2c2, 0x4ad0ba3c, 0x05e8be0f, + 0xe599647d, 0xc19d365d, 0x4d0c2990, 0xe5a9d9ac, 0xb680a72d, 0x4ce2e5dd, + 0x6d6c0267, 0x06f9c25b, 0xbd6078e0, 0xb5fcdc81, 0xd742fa41, 0xcccc2399, + 0xc691adc0, 0x215ad82c, 0xea73b0c3, 0xa511e5b0, 0xf499e0a6, 0x53e27ab0, + 0xd94440a2, 0x47752521, 0x9a6e3644, 0xab113708, 0x8f8b301d, 0x058a42a3, +#endif /* FPIOCONST_HAVE_EXTENDED_RANGE */ +}; + +#elif BITS_PER_MP_LIMB == 64 + +/* Table with constants of 10^(2^i), i=0..12 for 64-bit limbs. */ + +const mp_limb_t __tens[] = +{ +#define TENS_P0_IDX 0 +#define TENS_P0_SIZE 2 + [TENS_P0_IDX] = 0x0000000000000000ull, 0x000000000000000aull, + +#define TENS_P1_IDX (TENS_P0_IDX + TENS_P0_SIZE) +#define TENS_P1_SIZE 2 + [TENS_P1_IDX] = 0x0000000000000000ull, 0x0000000000000064ull, + +#define TENS_P2_IDX (TENS_P1_IDX + TENS_P1_SIZE) +#define TENS_P2_SIZE 2 + [TENS_P2_IDX] = 0x0000000000000000ull, 0x0000000000002710ull, + +#define TENS_P3_IDX (TENS_P2_IDX + TENS_P2_SIZE) +#define TENS_P3_SIZE 2 + [TENS_P3_IDX] = 0x0000000000000000ull, 0x0000000005f5e100ull, + +#define TENS_P4_IDX (TENS_P3_IDX + TENS_P3_SIZE) +#define TENS_P4_SIZE 2 + [TENS_P4_IDX] = 0x0000000000000000ull, 0x002386f26fc10000ull, + +#define TENS_P5_IDX (TENS_P4_IDX + TENS_P4_SIZE) +#define TENS_P5_SIZE 3 + [TENS_P5_IDX] = 0x0000000000000000ull, 0x85acef8100000000ull, + 0x000004ee2d6d415bull, + +#define TENS_P6_IDX (TENS_P5_IDX + TENS_P5_SIZE) +#define TENS_P6_SIZE 5 + [TENS_P6_IDX] = 0x0000000000000000ull, 0x0000000000000000ull, + 0x6e38ed64bf6a1f01ull, 0xe93ff9f4daa797edull, 0x0000000000184f03ull, + +#define TENS_P7_IDX (TENS_P6_IDX + TENS_P6_SIZE) +#define TENS_P7_SIZE 8 + [TENS_P7_IDX] = 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x03df99092e953e01ull, 0x2374e42f0f1538fdull, + 0xc404dc08d3cff5ecull, 0xa6337f19bccdb0daull, 0x0000024ee91f2603ull, + +#define TENS_P8_IDX (TENS_P7_IDX + TENS_P7_SIZE) +#define TENS_P8_SIZE 15 + [TENS_P8_IDX] = 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0xbed3875b982e7c01ull, 0x12152f87d8d99f72ull, 0xcf4a6e706bde50c6ull, + 0x26b2716ed595d80full, 0x1d153624adc666b0ull, 0x63ff540e3c42d35aull, + 0x65f9ef17cc5573c0ull, 0x80dcc7f755bc28f2ull, 0x5fdcefcef46eeddcull, + 0x00000000000553f7ull, + +#define TENS_P9_IDX (TENS_P8_IDX + TENS_P8_SIZE) +#define TENS_P9_SIZE 28 + [TENS_P9_IDX] = 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x77f27267fc6cf801ull, 0x5d96976f8f9546dcull, + 0xc31e1ad9b83a8a97ull, 0x94e6574746c40513ull, 0x4475b579c88976c1ull, + 0xaa1da1bf28f8733bull, 0x1e25cfea703ed321ull, 0xbc51fb2eb21a2f22ull, + 0xbfa3edac96e14f5dull, 0xe7fc7153329c57aeull, 0x85a91924c3fc0695ull, + 0xb2908ee0f95f635eull, 0x1366732a93abade4ull, 0x69be5b0e9449775cull, + 0xb099bc817343afacull, 0xa269974845a71d46ull, 0x8a0b1f138cb07303ull, + 0xc1d238d98cab8a97ull, 0x0000001c633415d4ull, + +#define TENS_P10_IDX (TENS_P9_IDX + TENS_P9_SIZE) +#define TENS_P10_SIZE 55 + [TENS_P10_IDX] = 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0xf55b2b722919f001ull, 0x1ec29f866e7c215bull, 0x15c51a88991c4e87ull, + 0x4c7d1e1a140ac535ull, 0x0ed1440ecc2cd819ull, 0x7de16cfb896634eeull, + 0x9fce837d1e43f61full, 0x233e55c7231d2b9cull, 0xf451218b65dc60d7ull, + 0xc96359861c5cd134ull, 0xa7e89431922bbb9full, 0x62be695a9f9f2a07ull, + 0x045b7a748e1042c4ull, 0x8ad822a51abe1de3ull, 0xd814b505ba34c411ull, + 0x8fc51a16bf3fdeb3ull, 0xf56deeecb1b896bcull, 0xb6f4654b31fb6bfdull, + 0x6b7595fb101a3616ull, 0x80d98089dc1a47feull, 0x9a20288280bda5a5ull, + 0xfc8f1f9031eb0f66ull, 0xe26a7b7e976a3310ull, 0x3ce3a0b8df68368aull, + 0x75a351a28e4262ceull, 0x445975836cb0b6c9ull, 0xc356e38a31b5653full, + 0x0190fba035faaba6ull, 0x88bc491b9fc4ed52ull, 0x005b80411640114aull, + 0x1e8d4649f4f3235eull, 0x73c5534936a8de06ull, 0xc1a6970ca7e6bd2aull, + 0xd2db49ef47187094ull, 0xae6209d4926c3f5bull, 0x34f4a3c62d433949ull, + 0xd9d61a05d4305d94ull, 0x0000000000000325ull, + +#if FPIOCONST_HAVE_EXTENDED_RANGE +# define TENS_P11_IDX (TENS_P10_IDX + TENS_P10_SIZE) +# define TENS_P11_SIZE 108 + [TENS_P11_IDX] = 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0xe30968651333e001ull, 0x49e28dcfb27d4d3full, + 0xee87e354ec2e4721ull, 0x368b8abbb6067584ull, 0x2ed56d55a5e5a191ull, + 0xea50d142fd827773ull, 0x98342c9e51b78db2ull, 0x866ed6f1c850dabcull, + 0x9279498719342c12ull, 0x66912e4ad2f869c2ull, 0x57a7842d71c7fd8full, + 0xfb7fedcc235552ebull, 0x38209ce1f3861ce0ull, 0x34c101349713b449ull, + 0xa7a8289c8c6c54deull, 0xe3cb64f32dbb6643ull, 0xe3892ee98074ff01ull, + 0xa8f16f9210c17f94ull, 0x967abbb3a8281ed6ull, 0x9952fbed5a151440ull, + 0xafe609c313b41e44ull, 0xf111821fa2bca416ull, 0x91bac974fb1264b4ull, + 0x8e48ff35d6c7d6abull, 0xc4a656654419bd43ull, 0x33554c36685e5510ull, + 0x0dbd21feab498697ull, 0x982da4663cfe491dull, 0x9e110c7bcbea4ca7ull, + 0x5fc5a04779c56b8aull, 0x1aa9f44484d80e2eull, 0x6a57b1ab730f203cull, + 0x87a7dc62d752f7a6ull, 0x40660460944545ffull, 0xc9ac375d77c1a42full, + 0x744695f0e866d7efull, 0xa1fc6b9681428c85ull, 0x7bf03c19d7917c7bull, + 0x5715f7915b33eb41ull, 0xdb0708fd8f6cae5full, 0x785ce6b7b125ac8eull, + 0x6f46eadb56c6815bull, 0x195355d84eeebeeeull, 0x9d7389c0a244de3cull, + 0xcf99d01953761abdull, 0x0d76ce39de9ec24bull, 0x2e55ecee70beb181ull, + 0xf56d9d4bd5f86079ull, 0x13ef5a83fb8886fbull, 0x3f3389a4408f43c5ull, + 0x58ccf45cfad37943ull, 0x415c7f3ef82df846ull, 0x8b3d5cf42915e818ull, + 0xf8dbb57a6a445f27ull, 0x8ad803ecca8f0070ull, 0x038f9245b2e87c34ull, + 0xc7c9dee0bedd8a6cull, 0x2ad3fa140eac7d56ull, 0xf775677ce0de0840ull, + 0x92be221ef1bd0ad5ull, 0xce9d04a487fa1fb9ull, 0x3f6f7024d2c36fa9ull, + 0x907855eeb028af62ull, 0x4efac5dcd83e49d6ull, 0x77cd8c6be7151aabull, + 0x0af908b40a753b7dull, 0xe50f30278c983623ull, 0x1d08e2d694222771ull, + 0xf2ee5ca6f7e928e6ull, 0x11eb962b1b61b93cull, 0xce2bcba19648b21cull, + 0x7bbebe3034f77154ull, 0x8ce329ace526a319ull, 0xb5dc53d5de4a74d2ull, + 0x000000000009e8b3ull, + +# define TENS_P12_IDX (TENS_P11_IDX + TENS_P11_SIZE) +# define TENS_P12_SIZE 214 + [TENS_P12_IDX] = 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0xd4724e8d2a67c001ull, 0xf89a1e908efe7ae7ull, 0x54e05154ef084117ull, + 0x506be82913b1bb51ull, 0xe599574efb29b172ull, 0x806c0ed3f0da6146ull, + 0x45155e93b86ae5beull, 0x7e1e7c34c0591cc2ull, 0x1d1f4cce7c4823daull, + 0xd6bfdf759b8ba1e8ull, 0xc2dfae78e341be10ull, 0x0f237f1a016b67b2ull, + 0xaf6a25743dbeabcdull, 0x142e0e80cab3e6d7ull, 0x2c23481161959127ull, + 0xcb4bf98287009701ull, 0x88052f8cf8169c84ull, 0xbc13176168dde6d4ull, + 0x54ab9c41ff0b0905ull, 0x1a1c304e7613b224ull, 0x441c2d473bfe167bull, + 0x78f061814f6cea9cull, 0x30c7ae41eb659fb8ull, 0xa1ebcad7947e0d0eull, + 0x2130504dd97d9556ull, 0xf2acd5071a8309cbull, 0xfd82373a3f8ec72aull, + 0x280f4d3295a842bcull, 0x811a4f04f3618ac0ull, 0xd3967a1b6dc3a5b4ull, + 0xdcfe388f15b8c898ull, 0x8738b909454eb2a0ull, 0x2bd9cc1110c4e996ull, + 0x655fec303297cd0cull, 0xf4090ee8ae0725b1ull, 0x398c6fed037d19eeull, + 0xc994a4503b9af26bull, 0x75a697b2b5341743ull, 0x3ccb5b92ac50b9c1ull, + 0xa8329761ffe06205ull, 0xeb83cadbdfea5242ull, 0x3c20ee69e79dadf7ull, + 0x7021b97a1e0a6817ull, 0x176ca776743074faull, 0xeca19beb77fb8af6ull, + 0xaf63b71292baf1deull, 0xa4eb8f8cde35c88bull, 0x40b464a0e137d5e9ull, + 0x42923bbd87d1cde8ull, 0x2e2690f3cd8f62ffull, 0x59c89f1b095edc16ull, + 0x5138753d1fa8fd5dull, 0x80152f18390a2b29ull, 0xf984d83e2dd8d925ull, + 0xc19e1faf7a872e74ull, 0xecf9b5d0ed4d542dull, 0xc53c0adf9462ea75ull, + 0x37a2d4390caea134ull, 0x2181327ec8fa2e8aull, 0x2d2408206e7bb827ull, + 0x5893d4b850be10e0ull, 0x1f2b2322ab312bb9ull, 0xbf627ede440b3f25ull, + 0xb608b89572dac789ull, 0x86deb3f078787e2aull, 0xbb9373f46fee7aabull, + 0xf7d8b57e27ecf57bull, 0x3d04e8d2fca26a9full, 0x3172826ac9df13cbull, + 0xa8fcd8e0cd9e8d7cull, 0x307641d9b2c39497ull, 0x2608c4cf1cc939c1ull, + 0x3d326a7eb6d1c7bfull, 0x8e13e25feeaf19e6ull, 0x2dfe6d97ee63302bull, + 0xe41d3cc425971d58ull, 0xab8db59a0a80627cull, 0xe90afb779eea37c8ull, + 0x9ee3352c90ca19cfull, 0xfe78d6823613c850ull, 0x5b060904788f6e50ull, + 0x3fecb534b71bd1a4ull, 0x20c33857b32c450cull, 0x0239f4cea6e9cfdaull, + 0xa19adb9548497187ull, 0x95aca6a8b492ed8aull, 0xcf1b23504dcd6cd9ull, + 0x1a67778cfbe8b12aull, 0xc32da38338eb3accull, 0xa03f40a8fb126ab1ull, + 0xe9ce4724ed5bf546ull, 0x73a130d84c4a74fdull, 0xa2ebd6c1d9960e2dull, + 0x6f233b7c94ab6febull, 0x8e7b9a7349126080ull, 0xd298f9994b8c9091ull, + 0xa96ddeff35e836b5ull, 0x6b0dd9bc96119b31ull, 0x282566fbc6cc3f8dull, + 0xd6769f3b72b882e7ull, 0x00fc509ba674343dull, 0xd6266a3fdcbf7789ull, + 0x4e89541bae9641fdull, 0x53400d0311953407ull, 0xe5b533458e0dd75aull, + 0x108b89bc108f19adull, 0xe03b2b6341a4c954ull, 0x97aced8e437b3d7full, + 0x2c5508c2cbd66670ull, 0x5c4f2ef0650ebc69ull, 0x9985a2df904ff6bfull, + 0x5ed8d2399faddd9eull, 0xe3e51cb925585832ull, 0x56c02d9a0ff4f1d4ull, + 0xc1a08a138c4ef804ull, 0xe6d2767113fd01c8ull, 0x9d0176cca7c234f4ull, + 0x4d8bfa89d0d73df2ull, 0x2b17e0b2544f10cdull, 0xfd86fe49b70a5c7dull, + 0x214495bbdf373f41ull, 0x00d313d584e857fdull, 0xa4ba47440496fcbeull, + 0xaec29e6ee8cac982ull, 0x7000a51987ec7038ull, 0xff66e42caeee333bull, + 0x03b4f63b8afd6b25ull, 0x5ab8d9c7bd7991dcull, 0x48741a6c2ed4684eull, + 0x2fdc6349af06940dull, 0xe974996fb03d7ecdull, 0x52ec8721ac7867f9ull, + 0x8edd2d00bcdd9d4aull, 0x41c759f83557de06ull, 0xa75409f23956d4b9ull, + 0xb6100fab123cd8a1ull, 0x2e8d623b3e7b21e2ull, 0xbca35f7792959da2ull, + 0x35fcb457200c03a5ull, 0xf74eb9281bb6c6e4ull, 0x87cc1d213d5d0b54ull, + 0x18ae42404964046full, 0x8bd2b496d868b275ull, 0xc234d8f51c5563f4ull, + 0xf9151ffff868e970ull, 0x271133eeae7be4a2ull, 0x25254932bb0fd922ull, + 0x104bcd64a60a9fc0ull, 0x0000006230290145ull, + +# define TENS_P13_IDX (TENS_P12_IDX + TENS_P12_SIZE) +# define TENS_P13_SIZE 427 + [TENS_P13_IDX] = 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x9f34522664cf8001ull, 0x7b8d5053644963e5ull, + 0xb945c82f49f0aa29ull, 0x933b6bb8430ff478ull, 0x64c501d45ff82d0aull, + 0x9ec1e1b373bbf174ull, 0xe90106893bfbe803ull, 0x3fef8d80f7390d8eull, + 0x2c73446bf31d1325ull, 0x1c19e379f5ca7a92ull, 0xf52d9d9c270af2beull, + 0x3abf72e1eb2bed48ull, 0x7ecf35084ac4ffc2ull, 0x38597a5a22019a82ull, + 0x9a51ff6ebe6a7b3cull, 0x0c0abe9da2d28437ull, 0xc79887ff7c9ec6eaull, + 0x436420d05851c899ull, 0x72b5547fefead581ull, 0x077ad8f899b1d2b5ull, + 0x3b4305ed5cddbf5bull, 0x2d88f3fde3861ac7ull, 0x393220aa3d6b43beull, + 0x1cd62095e5382405ull, 0x87a0d1e161a10c96ull, 0x68c933e6ca95a55dull, + 0x778089bb9ee082e2ull, 0xfbb6d8d441429ee9ull, 0x26cf5471c529500dull, + 0xd6c9b14068b9be29ull, 0x8415185207be635aull, 0x83730335b5572182ull, + 0xdd312d31eb2300b4ull, 0x488da59c05d6dd9bull, 0xda2c2e4037784d25ull, + 0x6a57d7206a8d92faull, 0xf07a8632950b41acull, 0x2ecad06acd55f062ull, + 0x34c98bb0e6a3dfe7ull, 0xb60521b19c767d8full, 0xe87d16be752aafd1ull, + 0xe58a8b0c9de1d728ull, 0x2fa2c119c6013830ull, 0x519b40c83c4f9156ull, + 0xab78701b5058fc8full, 0xc502a554adc59c47ull, 0x6647f04c0fb3286full, + 0x5ea495c89db4076eull, 0xb4f00f8b9c74fab1ull, 0xd092b4c6897c7a3cull, + 0x32f31fa8283e0340ull, 0x67b63de2eeb708ccull, 0xef2bc02b4f7b3c8bull, + 0xc49344c0da14bfe3ull, 0xb6c4e69eaabc85beull, 0x63a110162ece8aa6ull, + 0x726ae4d919cfba4dull, 0xee6ae7070fc90b42ull, 0x4d9aabc54290b04aull, + 0xf34906cdfb2b070eull, 0x52ca97091ff54b0aull, 0x164315700b42bfe1ull, + 0x6b5565bb980f3076ull, 0x9ce63c76eb8c4c4aull, 0x3da24c53b9e4c771ull, + 0xb50e3c666f0266faull, 0x01bb4b9676e34f79ull, 0x0fbea1249948cf3eull, + 0xa1fa4edc86bead12ull, 0xc3b97bf9d11e901cull, 0x370ca58e71730e03ull, + 0x886467e248b19715ull, 0x3c727e24db237497ull, 0x8e67d76e2116ccd2ull, + 0x34bdedd3f973aecfull, 0xb042ab0531d680ecull, 0xfc5c3c17770e96a0ull, + 0xb8204eceab6f1874ull, 0x416c0ced5843f3a5ull, 0x9578018311dd112full, + 0x7e0e8613b1c74bd8ull, 0xa79ffc1096c6453bull, 0xfcd6da0ab2157651ull, + 0x3dd0ccac836a34a7ull, 0x496049ed316e5a36ull, 0xdea1a97d0322bcb2ull, + 0x39578d53cdf2aa5aull, 0x030565c91d1aa931ull, 0x324e0a27d198cbedull, + 0x284325345db83e8aull, 0x5cb134c090bf23e8ull, 0x009e5051dd0adab6ull, + 0x7e36a6d7f8ad61daull, 0xbdffe6aa84c75e57ull, 0x138d680eb5d5532eull, + 0x4a5f74a1bd84ddacull, 0x55538cfaccff00d1ull, 0x48528011b0948b8cull, + 0x9e047ad7e345f82eull, 0xea77bef06ee770ffull, 0x2f1625670fc13669ull, + 0x0614686c869426acull, 0x4263ed823a3ff464ull, 0x57205a7ab3589b47ull, + 0xae6fc46b213f24adull, 0xd92b133f3de03e4eull, 0x1b49c24a315a589bull, + 0x1641c13873381bcbull, 0xbc680ada7bc99425ull, 0x962e9884a5cfbc9aull, + 0xfc8d12f60a960d70ull, 0x60acc868ed18ef4cull, 0x131130369aea5d14ull, + 0x2d99a5b0c747c87eull, 0x006b36583a369bb3ull, 0xe43fa6e6118a5135ull, + 0xa13dc05eb4947190ull, 0x0dbd7170d7733db8ull, 0x117ed7e7c3fb67d1ull, + 0xc05fe99ee2d72a49ull, 0xd971a25b9638db40ull, 0x1a1595594239d468ull, + 0xc1117392850a223cull, 0x567b5fc022d2dbd8ull, 0xc051007a92c5b4ebull, + 0xfb35572011cc0099ull, 0x398481616907810dull, 0x61d19ef25e8534f4ull, + 0x8a0ab03c2ee8c466ull, 0x879aa514c234af76ull, 0x59e5da579774a235ull, + 0xf339bd5a9bc466b3ull, 0xbbb5fd6744ab026dull, 0x3685c9f22b977202ull, + 0x7054359e03e5dc00ull, 0x9ba11f085239cfb0ull, 0x9c258687f8237562ull, + 0x52c7bf8fa3b510ddull, 0x3245e079b31ed0cfull, 0xbaee38c7ff9ff8d3ull, + 0xf702b3b9f17d5562ull, 0xcbca275dcc4c8563ull, 0xe817dbace005d9d1ull, + 0x62cee35005c6920aull, 0x19e049b90f1deac0ull, 0xb2a27a1659599f74ull, + 0x7dcef00df0911d5aull, 0x375522513603dd66ull, 0x5fa022da97813735ull, + 0xefbe57c20d849416ull, 0x5761929630a0e592ull, 0x11735043c953cc47ull, + 0xc0444be0a83526adull, 0x16ff5136b5f8463cull, 0xf037572c2a0a6631ull, + 0xb1bf8daad30464daull, 0x0f3e9e7e7f5718f7ull, 0xc26f2624e5a4cfe7ull, + 0xdfe8f4858c9b5ae4ull, 0xc64a1509f6fa82e3ull, 0x3024b220acb24aeaull, + 0xddcdfeddddb02ac0ull, 0x384c86c3d834c574ull, 0xdd48a571d904e099ull, + 0x77b35c744550a05full, 0xaaebdc6d81e85f71ull, 0xd4cdc0540f9bb0b1ull, + 0x845786af7af4df85ull, 0xdf2a91cae5e53887ull, 0x5689a3c4f6a58211ull, + 0xa705983a8cf6aa15ull, 0x2ce7fef09fbf2f52ull, 0x4a3b536548e84a62ull, + 0xd48a0872f8281a47ull, 0xf0929c3e8423dcf6ull, 0xe9ec071b044a5049ull, + 0x20e30c1b17decc36ull, 0x3342196a45fc2813ull, 0x6601e33746afb7f9ull, + 0xf18094d130754439ull, 0x61410dd1d38b4112ull, 0xd97d4dd8d8796b36ull, + 0x8080519147e9bc0bull, 0xcde438c11584e2daull, 0x409659a1955d24f1ull, + 0x5a09635f1b0950b1ull, 0x615472b965b1febeull, 0x6308e067525dc00aull, + 0xd4e705a44089e2d4ull, 0x32c18b2643fc9209ull, 0xaf2711534447a5faull, + 0x4dc4f0d23617cadcull, 0x6aa116ef692eb386ull, 0x0641dc0b655991bcull, + 0xc655966454469597ull, 0x4bdc0d1a749c0fe8ull, 0xc5292a61a7d3381eull, + 0x42474cc24eb65fdcull, 0x19dfc9eef2c6b173ull, 0xbece2ee30a19a199ull, + 0xaa03aa7cc68b778dull, 0xae54d2bec8db86f0ull, 0xdee3f48fb92a01e0ull, + 0xf6ae28526023c0a9ull, 0xa441cb9ea233763bull, 0x3a8bb4b73246ddddull, + 0x308ef2c844faa3c3ull, 0xd2862534fd1c8516ull, 0x62336f6f3b25ebe7ull, + 0x0b8e2ce60c336a45ull, 0x11eea1f2e867f171ull, 0x68df4903523972ecull, + 0x51ef4cb750c05824ull, 0x3ffae115cb4df2a8ull, 0x3ed1635fb51aca2full, + 0x0a5ac09fd6ff1cc6ull, 0x0a3dc76fde8ed9d6ull, 0x37991dde5dc2d8ddull, + 0x80ad6e13f95bacb2ull, 0xd4f8c7a6163005eeull, 0xa4760f083225d180ull, + 0x9b2b1a875fff004dull, 0x5cd00b66e7ea8576ull, 0x285dd80dec478452ull, + 0x4301b3a120112439ull, 0xfacbb68cff879fc8ull, 0xb17fdf84af6af6b8ull, + 0xf4489576c208d9f1ull, 0xadcc862c8794a6e9ull, 0x931685a40e83e54cull, + 0x1e40293bab01c580ull, 0x1f1ddf7fcad784faull, 0xcee722b26b856084ull, + 0x74254eb41c39938bull, 0xb9c26d9ac7ccebf4ull, 0x2e3ece246b08dfb9ull, + 0xdff60410981455ecull, 0xe06fa38bbc804e2bull, 0x72e53c52b534540cull, + 0xb2a5c05a02dfb2efull, 0x973133385002a2a5ull, 0xd61df455597c53ffull, + 0x39ac2ec534e5261aull, 0x388b7539c6bc0cabull, 0x00eac7043f732fc0ull, + 0xc089971e92fb21d9ull, 0x7af93f8fb4ffa503ull, 0xa8311b2372e353b6ull, + 0x1de496ca8266c9afull, 0xd6fa0b51dbdb16b0ull, 0xbd5630899991a5efull, + 0x0954a1e3168cbe0full, 0x53d09723537b9245ull, 0x86558cb92867272dull, + 0xfac85d100b83f026ull, 0x1e5ddb95f8562951ull, 0x48d27b92ad3668c8ull, + 0x19b58a99c930b7e6ull, 0xa9cda917a3de74e3ull, 0x7a4dd16ecb6e35eeull, + 0x4d84073f4c80e9d5ull, 0x9cffcfc074a95ba8ull, 0x15796372d28485ebull, + 0x77eda8df5717e9cdull, 0xadb965e1ab473c4eull, 0x5bc05659ffad6959ull, + 0xfb2402276ed63880ull, 0xd15fdddf2014850bull, 0xb538f37dfdd74592ull, + 0x1473396f3a8e2e82ull, 0x3ce41a21f6a5edf8ull, 0x754e82640cc4351aull, + 0xc7821b96aab95e73ull, 0xc242faaaf42ff463ull, 0x087e260edd00ac65ull, + 0x0dbe032817d193f5ull, 0xf9d10f96844a63c9ull, 0xbaf127ec85aa91ddull, + 0xce85e6a50ab6dabbull, 0xe7b56a161af5d24full, 0x57d1d79fcd6c5a19ull, + 0xec4dd2f05dfc2b28ull, 0x8d72216a18fe64a1ull, 0x72f14a085f222077ull, + 0x3bf038abd8b09b11ull, 0xc4265d7cc6cf1f44ull, 0x46398d2cdab1b0e7ull, + 0xb6e705d37dcfdc68ull, 0x362c11834aafd1e6ull, 0xf6ac98b7d8701107ull, + 0xd6649424ad114d7eull, 0xddd1c6e4c40ab551ull, 0xc9d284c8a132030full, + 0x824069eedb1f662aull, 0xc846b3ad4157904bull, 0x0a248c17d38481caull, + 0xe8745febc846831full, 0x00000000000025a8ull, + +# define TENS_P14_IDX (TENS_P13_IDX + TENS_P13_SIZE) +# define TENS_P14_SIZE 852 + [TENS_P14_IDX] = 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x0000000000000000ull, 0x0000000000000000ull, 0x0000000000000000ull, + 0x41b5687d099f0001ull, 0x8c75ee63cbfd1b6eull, 0xd75296ad4b191ceaull, + 0x1eb5da9b2394d80aull, 0x5c79fed918a004edull, 0xed67a1b837e3b01cull, + 0x2a1a34d578d9a714ull, 0x6b1d35168fbe7f0dull, 0xa7825681e57c43eaull, + 0xd3e716e1c81d32e8ull, 0xa6d93d6558860b00ull, 0x0113232f83159c97ull, + 0x7321c3a0d6122269ull, 0xca4ca9d3be6a92f3ull, 0xc0e55163d1e276a5ull, + 0x7b7a78c1b05915d6ull, 0x62a3df4b0fae0ca4ull, 0x13030d1108abec6full, + 0x60dcc8f2d446338aull, 0x25e1f9f65f05d1d5ull, 0x7f8c711304a40beeull, + 0x589ff59a88f47ec0ull, 0xea5068a1308c3661ull, 0x06e87dff95fb108full, + 0xd4d4abdc1559e741ull, 0xee16907c01e092e4ull, 0xe73aabcb5a7b78e6ull, + 0xad372889146bb7e0ull, 0xfd49fc1d4f6b43c5ull, 0xd37392530f29f589ull, + 0xe2acfcc2c4745a56ull, 0xedd016cdd75ccbc7ull, 0xef82ccd3ac5a63e0ull, + 0x2bdabfc4b352496eull, 0x01b0197f5b3d0401ull, 0x29d9253dade96d3cull, + 0x73c56b1b19bebdbaull, 0x1f2b7f1e255e7b25ull, 0x6299c836a56a457eull, + 0xa2ca74c65c63cc78ull, 0xee571bea5c85fe93ull, 0x2db5f1d0508e2561ull, + 0xa9b87b99b1fde6a9ull, 0xf7260f074fb90a37ull, 0x56ee7e97ff58c5fdull, + 0x42e6f9cebab9fa46ull, 0x1b76d26778816f73ull, 0x4566519cfdb2c728ull, + 0xb9f6a95fae17dd8dull, 0x67160dea1cd533a1ull, 0xfcd8f8f914534bacull, + 0x708b1f0af3f2901dull, 0x9457a1df8829063bull, 0x36bb93358f872aa1ull, + 0xd889d109b5672c0eull, 0x933066727ec63a6aull, 0x8239ab6839b6d457ull, + 0xbe0d7a1fef2e2506ull, 0x05f655224251b635ull, 0x032868910ef0bd55ull, + 0x9815fbac2c42b664ull, 0x814e379c471fd611ull, 0xa4a25bda7dd8349dull, + 0x01b9e39d9886b84cull, 0xae31cbc95a7ce1a2ull, 0x83ef8faf86d07f32ull, + 0x58470fdfb66b5b76ull, 0x5161888996d59b73ull, 0xfc8e0fc6dc400cf7ull, + 0x09a08e56af693670ull, 0x74f682e191737de6ull, 0x7f8ac56d0e03923full, + 0x8e05e49a7400cfd4ull, 0x384e11644cebea3cull, 0xb50ae05eb2e43d8cull, + 0xa40061230f0b3ed9ull, 0x4e9a193464137137ull, 0xd9621be605404100ull, + 0x5c347ebb9329a255ull, 0xe684346b75cbeb1bull, 0xba6a9753840fee55ull, + 0x60505b7bf43836f6ull, 0xfd6d475d334a9278ull, 0x267375aa5db94761ull, + 0x024f6d63c110e160ull, 0xa99b4c192ec96610ull, 0x338cfd90b915c9f4ull, + 0xb9e51a09f02ea846ull, 0xfae31d88ae928fb1ull, 0x8475dd261a3db721ull, + 0x7ad4c4075769489dull, 0x34e275c80a49e9f0ull, 0x1d63114a3d075d83ull, + 0x6b98e94772a96415ull, 0xd50fdc361d500b5full, 0x87751275141e5085ull, + 0x2278809ee7843834ull, 0x947aead2b15c52eeull, 0x5197b744fedb7b02ull, + 0x8849d0a664e09ba8ull, 0x11ecb91323beaa85ull, 0x5d9848480f7ed667ull, + 0x588290e99f6331eaull, 0x7e09e9e5a24d64d1ull, 0x03a501df32592033ull, + 0xbb3df73827c270a6ull, 0x4190833c3c7c5a70ull, 0x80e5d89b7d4bf9f4ull, + 0xfaefb663a7fc6194ull, 0xd3b6adcd62e52b49ull, 0x1f2cf73a809646fcull, + 0x531e4bfbb765ed4full, 0xaf12d1a692cd05f2ull, 0x38da107422ee30f3ull, + 0x1a725608ed6447bbull, 0x7a3c6f54aff222d3ull, 0x7b0e8d12bca79a56ull, + 0x6e34d6fb1c4660c5ull, 0xfe9dc99c6f481a9full, 0xd8489ea0f888db82ull, + 0xc0dea28184b4c0faull, 0xae30e887977a8583ull, 0x1d4848cb8c1cbcecull, + 0xd011b0fc0ee0d137ull, 0x478d7dd494b5fd49ull, 0xacab62ad3d67f2e7ull, + 0x1dfc7df50ab4e62aull, 0x870b0e75d22e4553ull, 0x1b73bf6d49b7b001ull, + 0xdc9f073712807ffdull, 0xc0e2f2506f3e5852ull, 0x4d96a55a93e62e4aull, + 0x83a126dbc1d0e185ull, 0xefbfd043190b917bull, 0x8f25b6ddc7df1669ull, + 0x476c17a62062eac9ull, 0x25460383cb60f278ull, 0xda8c05be0e85e996ull, + 0x692062346f678a34ull, 0x1947b69af59be929ull, 0x90fd83220ebfa11bull, + 0xd699b1ec15c1e9bfull, 0x7001d002b2f0343full, 0xc0778ab5cf76eaaaull, + 0xb7b008e25173eda8ull, 0x505d3f4d4e00e4c6ull, 0x1c9d4e1299dd341aull, + 0x474c5e954ffb6978ull, 0xda19f9386e9ca6ddull, 0x98dc318ee2dda6e0ull, + 0x3f67b836da455e54ull, 0xa97e9a6421e4181cull, 0x527a08bb1e17f655ull, + 0x682972ad1712dc21ull, 0xccbeadf10042d256ull, 0x861e99e0ca497b96ull, + 0xeeb0f6500d8aa585ull, 0x506af77edcc3c3daull, 0x7c9d60be5deb9768ull, + 0x37b37e95e9d978b7ull, 0x42747f7577ad0b94ull, 0x6d5fd2fe07be42c4ull, + 0x0d8fc27d4c8c5da9ull, 0x0ccf60230f2fd50full, 0x3b1101bd5b56053full, + 0xc0feca2756d34906ull, 0xc4888da47602a150ull, 0x56d10633419abe54ull, + 0x8db14123c76120edull, 0x741e8f76b656e675ull, 0x96be6f21d297b94eull, + 0x9b409e273662439dull, 0x35fff92a6626574dull, 0x69e02439bf558205ull, + 0x6400fd4cbe6838b7ull, 0x1f4b158aa00f64caull, 0x04cca5589e2052aeull, + 0x58da644cfb5ee69eull, 0x8ab1940196f26e1full, 0xed8bf908bee1e16bull, + 0xd50babab2f2809a4ull, 0x6b0a89296e57f7e6ull, 0xb54a4cfcf7356431ull, + 0x6f9fd6cb9a1d0ac4ull, 0x3b42f469836bfbf8ull, 0x40111b6b8bd32129ull, + 0xb345d9557c278fb1ull, 0xd32cd13cff1fd188ull, 0x3789f792f7ec3aa0ull, + 0x4d79a4bfab707fa4ull, 0xd9c24d8eb3a28cebull, 0x06e2eb3e7134dadcull, + 0xb379d811d7c04f76ull, 0x8c94fc332b3b0ebcull, 0xc06c5d01a28b53abull, + 0x7fea91cad900432aull, 0x64845f086d30b008ull, 0xfde4687d796f5349ull, + 0xe0046c56f888fe67ull, 0xce98cb11ae482177ull, 0x1feb440084590c46ull, + 0xff2f16116e1ba29bull, 0x3159ca8cf73f3e9cull, 0x56f0ed4634845918ull, + 0xd9a16a01b7d10c32ull, 0x3cee3e24405b9e91ull, 0x2ab396b48739e4a6ull, + 0x09835dfd3f1b7871ull, 0x1592b74a8c7a489full, 0x0e8d3f3705df7c81ull, + 0x68b29622a61ff273ull, 0x43ff84a6259cd337ull, 0x566ed88381cf8fe9ull, + 0x35c7942848427fc6ull, 0xa97e8c8bcfd2fb59ull, 0x32ddca23750aaed8ull, + 0x96fbfff9aa8108efull, 0xe3cdf588a1d039aaull, 0xcd6b3fdb47e77e00ull, + 0x9a522152e72a9a80ull, 0xef175610eda06283ull, 0x339fe6c4a670cfa1ull, + 0xc2d7f53b2dfbf3eeull, 0xcc47e4b092a44e27ull, 0xd64f83c9dfa212bcull, + 0xb51319bf997e5475ull, 0x1fc2c7b69fffe599ull, 0x832169ddef5605e7ull, + 0xbf921dc8feb6be4eull, 0x72759f8d60bdfb1dull, 0x020eebed3546efa0ull, + 0xdb20a2fecaab3d64ull, 0xb2b62bddba1218f6ull, 0x8fde5cfa3101eff0ull, + 0xa52114d22e319213ull, 0xdf08b1dd87eead3full, 0x746f34d0a5387642ull, + 0x4cc40317d76c4844ull, 0xb7d76071e4f689c9ull, 0x6e1c79155fe0b4a2ull, + 0x3efb7d71c7d43f53ull, 0x35a75f5f068dd906ull, 0x750f4607652d7770ull, + 0x36c2cf8e64a1656cull, 0x9348ef93214d758bull, 0x9674b7f3e4058978ull, + 0xbdfaba8f10570b0bull, 0xa92b261fcef09dd7ull, 0xcbebb81f071c21b6ull, + 0x44228cd6f427ed6cull, 0x5036c46065e56fcfull, 0xccfd848bad919defull, + 0x7527dca361d158a6ull, 0x508550754cf30459ull, 0x3540f5aaa70dfd09ull, + 0xb5ba3d4e35577adbull, 0xcdfb689f35736c4full, 0x97ab0dcaefe8fa82ull, + 0x77a7fe9c51bd2ff3ull, 0x3d618b813107846cull, 0xfc5e9651bca797a4ull, + 0xf7e8791fe2e08fbcull, 0x7c426f9d772f1cc0ull, 0x0080c3ab08d56f88ull, + 0xe6d46ec60deea663ull, 0x6b681d9d7dca4eb7ull, 0x4af0e0f2da06730bull, + 0x52097463038bf468ull, 0xbc09bb9aca19d302ull, 0x3ded4433aa55aeb1ull, + 0x3e4b7865f27938baull, 0x7ef9631428296be7ull, 0xdf0b6b477a1d55ccull, + 0xcedda5bdcde11852ull, 0x72ca1a8bf00a0eb3ull, 0xb002fdcc5241b572ull, + 0xc4878862ff8898b3ull, 0xbf4bca29b3e85372ull, 0xf2d831897e1fef45ull, + 0x3cdf9e050f5427afull, 0xf65c06ac75bae885ull, 0xa3145eac9c71a700ull, + 0x76255bbfde63bab2ull, 0x4c6ad3d06e817be6ull, 0xe95ef2f825ab9935ull, + 0xd54f78de11cd095aull, 0xb3829dcba001ae7eull, 0x18eb9c9e5abd18bdull, + 0xe3e3556cada3c504ull, 0x5191ac5fd35479aaull, 0xc8d1d9d3221821acull, + 0x088c3fc8313a8c51ull, 0xb154abedc146a264ull, 0x349ec09392755bc5ull, + 0x41d5886cf94aba57ull, 0x36aba94b0a5ad8b2ull, 0xa9ad229f883a6758ull, + 0x0546172f5d64069aull, 0xc3808ea40366da16ull, 0x70f0a2350b172403ull, + 0x4fceb827fa816e66ull, 0x167b56d5a65fcfeaull, 0xfec36bcdfe2b9fb2ull, + 0xcd96320fa84c4cc9ull, 0x09eda8b83e128584ull, 0x7ec7e17b91eca525ull, + 0xc14032f4bc45bedcull, 0x2eb20bc09be689a7ull, 0x14ef835fffdf1efcull, + 0xcd778dd8c6966c59ull, 0x23d477155feb0f3bull, 0x5722a550d64b87c8ull, + 0x315a1a8b62883198ull, 0x4b7e9d7a648e17e6ull, 0x67caca842ba43d28ull, + 0x6e660159741f0398ull, 0x3dde3c453e16e1a9ull, 0xc7eb0aefa53e56aeull, + 0x78751d733f39f33eull, 0x626770f745816df8ull, 0x909e87f4cb17d28dull, + 0xc1dcf32893a86abaull, 0xd895d0421a1e4ce2ull, 0xbb00eaf5b9f6dd69ull, + 0xca609578acc37687ull, 0xf8b86d4c5b490d39ull, 0x39419f6df2737ef0ull, + 0x72524a0369267bc0ull, 0xdbc01e936eb060c4ull, 0x83984d54291035b1ull, + 0xe08cbc20f673ad85ull, 0x584803a61fb24915ull, 0x4088ddb5e15bbcd7ull, + 0x2c18041ad4c22542ull, 0xb2ba69b4a51372d1ull, 0xcd11c2962299283full, + 0xac54df2325dcd6f3ull, 0x77e16e1d24a3a55eull, 0xb99d85c0b3cd415bull, + 0xe91154e3497befc7ull, 0xb55100aa7365cd8bull, 0xfc0927a60ee699ebull, + 0x8acaa910efb374deull, 0xda3f000683b40e3dull, 0xc6ce1b758590a089ull, + 0xfda2f7f354f6ff20ull, 0xd0763b6dd2ab58f6ull, 0x2519622d6caf2515ull, + 0x9863638fc3714057ull, 0x09ea4a4dea00bb4full, 0x6b01fe5fe69de96dull, + 0x529e32ec960161a5ull, 0x01a37eeaf8260ae9ull, 0x5aa0716f69710577ull, + 0x4260fedacb3fb1daull, 0x76012f75a33fb790ull, 0x130f09ae24c0e5beull, + 0x5c8ecb762e8323dcull, 0x401b5f5c17cb8f12ull, 0x47e1560a5f0a63e0ull, + 0xee1377d4dc57a786ull, 0x0aa294b9228e7ee5ull, 0x55b0fe2faea6c534ull, + 0xf108b772922d318aull, 0xdfb69702f15bddf6ull, 0x90e1db66cd438a4eull, + 0x568ef6cb584ce4a1ull, 0x6da376ba69e55f9dull, 0x45c7e2945ca6c109ull, + 0xcf5b6c0cc977b3e9ull, 0x11b487ae1d694499ull, 0xbcb3cc6ecf8339acull, + 0x046b107150b828e0ull, 0x2c6159465703ed0dull, 0xa908dbd0720d1610ull, + 0x22c076e2742bbe33ull, 0x1d0cefa448966a66ull, 0x601352bf1dde819full, + 0xa585cc4ab9370c39ull, 0x5a2f7206eb857f94ull, 0x49cd0f1f3fae6b58ull, + 0x1b89d47678e5fb3dull, 0xed82945b74e9e65bull, 0x2941c4d9b74e6483ull, + 0x565c18dc7e087accull, 0xbf4ccd3d1a09f2e5ull, 0xa522631dd304e977ull, + 0x4517109b6123378eull, 0x4bf1a506b7e4285aull, 0x683172f8625803c2ull, + 0x3f8a2b11c84e7354ull, 0xed4204917dd12b89ull, 0x9853fb978c698b0bull, + 0xb697e1c99631777bull, 0x510381105f028f05ull, 0x30e255e39055f055ull, + 0xb990321ee2d0c1b6ull, 0xff4dc144a8fdf4d1ull, 0x148999e0521a3056ull, + 0xa9c96852a8111c66ull, 0x4b394a948157f508ull, 0x94ec2e93a0dc4df1ull, + 0x8fc283776e6afa56ull, 0xc435186ff72ffa04ull, 0x8d037f6ff91488b7ull, + 0x48757727a899ec1eull, 0xb8cf377d4101b612ull, 0xb4570569a5a54e68ull, + 0x063d9cfd2ac5a0a0ull, 0xf1a5884c7c504c74ull, 0x8d0b91bf0a9b1955ull, + 0x79ff5361e5f6862full, 0xc6fd31fb0ed3d38full, 0x85b9c6489fe131c7ull, + 0x8e77e86b8febf2b4ull, 0x56429986992ba80eull, 0x608cdda56848879aull, + 0x754b300e3e0d106eull, 0xafd5195b25200576ull, 0xe81f09395d37aad9ull, + 0xdeeea20ae00a390eull, 0xb5d51155f5fef0beull, 0x9e72ebcf6e27d173ull, + 0xb966f7bab776e978ull, 0x726c840809520238ull, 0x65dce5a23347ebc5ull, + 0x8c92d7403ec78337ull, 0x32caec933cdde3feull, 0x411be811d20379aeull, + 0x72fa1bbd41756580ull, 0x84c42f04a92125b3ull, 0x3a25922cdd4ee5feull, + 0x49ad3be096446853ull, 0x1c841afe2880366dull, 0xfb905fe1f1e09019ull, + 0x3ba9d0c9a451ad59ull, 0xa42419f256db2e9cull, 0x3c9a3ca5e921e7a0ull, + 0xcec7d091ad8ea375ull, 0x477ef58f99bdb940ull, 0xb2598b8d8a4933c7ull, + 0xcfac1e1cf5659df7ull, 0xe2a04aab339f8748ull, 0x45bc6f37e122b03full, + 0x9c75aaa0c9feeb30ull, 0x0ea0585dc13c174eull, 0x3a96bd5adc58bbb4ull, + 0x3c7a714d20251482ull, 0x6cb83b6b696897ebull, 0x3b496b5fa37de406ull, + 0x380dd38237e75d6aull, 0xda26fac90e1a513cull, 0x12b5c6eaf2458364ull, + 0x1ff1fcbf79ce9e47ull, 0x59a6a7babe7c6e86ull, 0x947614538d70f515ull, + 0x8768ffb26b04e425ull, 0x3f9e84071ca5f425ull, 0x5f8f67563b641184ull, + 0x56bc212062b1a5a5ull, 0x17f2fa18d1e5da68ull, 0xa1bc9c068cce5e2dull, + 0x892df1af8e290fb1ull, 0xb43e5517ad10b8c8ull, 0x4407c38fd0597409ull, + 0xfea9c9b64a020d81ull, 0xd5b2aaf9d8e0e7d6ull, 0xda44ed4ade5e9b40ull, + 0x87aa3ca045d6bf41ull, 0x4708acc8c62d12fcull, 0x0d1227ff10212e26ull, + 0x5da02550feeb5742ull, 0x1d56e5e1d66668e7ull, 0xae1e0bef32c215ecull, + 0x58c0e9227f048b7eull, 0x58251aac2aea8619ull, 0xa1fea536bbe10425ull, + 0xd233eb7d2e1d9667ull, 0xb0693c67cf435c0bull, 0x903ec9f061d918eaull, + 0x0efb1788d6c4e8acull, 0x1709d878b0098f5bull, 0x3f6ce1b73c12b35eull, + 0x8a8f7dbba1b3ff54ull, 0x73e8563e37608d6aull, 0x64e00749a3330540ull, + 0x8d5caaf9ebbfcab9ull, 0xedb2bd943bc87c7eull, 0xe656dec322f8f62dull, + 0x670c1626c5683222ull, 0x4237542f94089e7full, 0x2fc4e53047d29440ull, + 0x8b288dac8419441eull, 0xa7afb4e97f9245f9ull, 0x082adef78a15650dull, + 0x043c62de3104ef19ull, 0x7ecd06350aff3dc5ull, 0xe0600fade7e80a8bull, + 0x81ebf4e04d8e81ccull, 0x7b372af7f587e30full, 0xdee11c6f2d8f8ca0ull, + 0xf8adc426d3624b1cull, 0x5c22de4fca9debedull, 0xfae3186b3634f778ull, + 0xd7bfa75facf8b595ull, 0xbbfe3cf6003cd316ull, 0xc51055a1b023cb50ull, + 0x93869a770063cffdull, 0xfbceeb1051e022d4ull, 0x109defc95187457eull, + 0xe13cfde2673892d8ull, 0xc09c8134d4aa3272ull, 0x0327181bbf89ad5bull, + 0xaa21b63209511ec7ull, 0xe41885b5d7e72186ull, 0x493d278946713f9cull, + 0xd5d22a5c1386c526ull, 0xcf59281ccefddfc4ull, 0x4ebe43f692973ea6ull, + 0x6cf4897deac5c6adull, 0x82ce562ad95082a0ull, 0x28d8f0db28e5e9bdull, + 0x707b0166ddf06e81ull, 0xfbf5756a7dae3f00ull, 0x4f114102035a4680ull, + 0x5190fedfe7ba4b33ull, 0xe5f1bc49106a7594ull, 0xd7a1a766aae3ad67ull, + 0x9120a214040ee971ull, 0x1edc87eaf415b374ull, 0xc6ad637d17aab43cull, + 0xd90303c7885858c1ull, 0x3ff4eb0ebfd4b70bull, 0xd81eea30344a9a88ull, + 0x5adef0ec95925446ull, 0x20bbd8c3abb5f5e7ull, 0xe6944262c1c22cceull, + 0x80024021c5acdb23ull, 0x94b30c812232c635ull, 0x78569acd55f07648ull, + 0x4dd6b5289696ea39ull, 0xde5853b31c3e1b40ull, 0x6eb5a7d88a2c3679ull, + 0x8f9cf09656bda89aull, 0x6481c7e7fda86d5bull, 0x15bfb45d50a6a7d5ull, + 0xc057d45d4f9a5381ull, 0xa0009f004fb10024ull, 0xac420f745e1ca0ddull, + 0xf0d4a615cfbb38bdull, 0x0e3aef8419bf0318ull, 0x166c1e3ecb3d7b20ull, + 0x3bfacf9f58272fddull, 0x63a13528c0f5ce46ull, 0xa020ca8cea59e333ull, + 0x3dbb5a3daadd116bull, 0x747f55eae5523f47ull, 0x64d520fb0922171eull, + 0x07ce951b6c709e84ull, 0x7508eb6d35fdc402ull, 0xb0d11c39c495a8faull, + 0x57447ef081313d65ull, 0xf72301f3a7b61e26ull, 0x45a3a7c5bb096315ull, + 0x00432f88a903a44bull, 0xeb4e1b6619081987ull, 0x6d245171bb7b66bdull, + 0x0d89bd0bde4182f5ull, 0xf70d8a6087f4de6cull, 0x08a274499a87855bull, + 0xd49640174ac7720aull, 0x4db3488cb0d9ddacull, 0xd07b745bfe397d44ull, + 0x6e9d567d197dcb7bull, 0x9143fef1e3b90812ull, 0x115ff96db9e002acull, + 0x5b61c9c8f60a2201ull, 0xb14a44a709abab2full, 0x843c79970ca19c73ull, + 0x5e3fc18ce3a9bbe6ull, 0x764df59d0c0404eeull, 0x4ad0ba3c990ec2c2ull, + 0xe599647d05e8be0full, 0x4d0c2990c19d365dull, 0xb680a72de5a9d9acull, + 0x6d6c02674ce2e5ddull, 0xbd6078e006f9c25bull, 0xd742fa41b5fcdc81ull, + 0xc691adc0cccc2399ull, 0xea73b0c3215ad82cull, 0xf499e0a6a511e5b0ull, + 0xd94440a253e27ab0ull, 0x9a6e364447752521ull, 0x8f8b301dab113708ull, + 0x00000000058a42a3ull, +#endif +}; + +#else +# error "mp_limb_t size " BITS_PER_MP_LIMB "not accounted for" +#endif + +/* Each of array variable above defines one mpn integer which is a power of 10. + This table points to those variables, indexed by the exponent. */ + +const struct mp_power _fpioconst_pow10[FPIOCONST_POW10_ARRAY_SIZE] = +{ + { TENS_P0_IDX, TENS_P0_SIZE, 4, }, + { TENS_P1_IDX, TENS_P1_SIZE, 7, 4 }, + { TENS_P2_IDX, TENS_P2_SIZE, 14, 10 }, + { TENS_P3_IDX, TENS_P3_SIZE, 27, 24 }, + { TENS_P4_IDX, TENS_P4_SIZE, 54, 50 }, + { TENS_P5_IDX, TENS_P5_SIZE, 107, 103 }, + { TENS_P6_IDX, TENS_P6_SIZE, 213, 210 }, + { TENS_P7_IDX, TENS_P7_SIZE, 426, 422 }, + { TENS_P8_IDX, TENS_P8_SIZE, 851, 848 }, + { TENS_P9_IDX, TENS_P9_SIZE, 1701, 1698 }, + { TENS_P10_IDX, TENS_P10_SIZE, 3402, 3399 }, +#if FPIOCONST_HAVE_EXTENDED_RANGE + { TENS_P11_IDX, TENS_P11_SIZE, 6804, 6800 }, + { TENS_P12_IDX, TENS_P12_SIZE, 13607, 13604 }, + { TENS_P13_IDX, TENS_P13_SIZE, 27214, 27210 }, + { TENS_P14_IDX, TENS_P14_SIZE, 54427, 54424 }, +#endif +}; diff --git a/REORG.TODO/stdlib/fpioconst.h b/REORG.TODO/stdlib/fpioconst.h new file mode 100644 index 0000000000..c05f8e7bac --- /dev/null +++ b/REORG.TODO/stdlib/fpioconst.h @@ -0,0 +1,88 @@ +/* Header file for constants used in floating point <-> decimal conversions. + Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _FPIOCONST_H +#define _FPIOCONST_H + +#include <float.h> +#include <math.h> +#include <gmp.h> + + +/* These values are used by __printf_fp, where they are noncritical (if the + value is not large enough, it will just be slower); and by + strtof/strtod/strtold, where it is critical (it's used for overflow + detection). + + XXX These should be defined in <float.h>. For the time being, we have the + IEEE754 values here. */ + +#if !defined __NO_LONG_DOUBLE_MATH && __LDBL_MAX_EXP__ > 1024 +# define LDBL_MAX_10_EXP_LOG 12 /* = floor(log_2(LDBL_MAX_10_EXP)) */ +#else +# define LDBL_MAX_10_EXP_LOG 8 /* = floor(log_2(LDBL_MAX_10_EXP)) */ +#endif +#define DBL_MAX_10_EXP_LOG 8 /* = floor(log_2(DBL_MAX_10_EXP)) */ +#define FLT_MAX_10_EXP_LOG 5 /* = floor(log_2(FLT_MAX_10_EXP)) */ + +/* On some machines, _Float128 may be ABI-distinct from long double (e.g + IBM extended precision). */ +#include <bits/floatn.h> + +#if __HAVE_DISTINCT_FLOAT128 +# define FLT128_MAX_10_EXP_LOG 12 /* = floor(log_2(FLT128_MAX_10_EXP)) */ +#endif + +/* For strtold, we need powers of 10 up to floor (log_2 (LDBL_MANT_DIG + - LDBL_MIN_EXP + 2)). When _Float128 is enabled in libm and it is + ABI-distinct from long double (e.g. on powerpc64le), we also need powers + of 10 up to floor (log_2 (FLT128_MANT_DIG - FLT128_MIN_EXP + 2)). */ +#define FPIOCONST_HAVE_EXTENDED_RANGE \ + ((!defined __NO_LONG_DOUBLE_MATH && __LDBL_MAX_EXP__ > 1024) \ + || __HAVE_DISTINCT_FLOAT128) + +#if FPIOCONST_HAVE_EXTENDED_RANGE +# define FPIOCONST_POW10_ARRAY_SIZE 15 +#else +# define FPIOCONST_POW10_ARRAY_SIZE 11 +#endif + +/* The array with the number representation. */ +extern const mp_limb_t __tens[] attribute_hidden; + +/* Table of powers of ten. This is used by __printf_fp and by + strtof/strtod/strtold. */ +struct mp_power + { + size_t arrayoff; /* Offset in `__tens'. */ + mp_size_t arraysize; /* Size of the array. */ + int p_expo; /* Exponent of the number 10^(2^i). */ + int m_expo; /* Exponent of the number 10^-(2^i-1). */ + }; +extern const struct mp_power _fpioconst_pow10[FPIOCONST_POW10_ARRAY_SIZE] + attribute_hidden; + +/* The constants in the array `_fpioconst_pow10' have an offset. */ +#if BITS_PER_MP_LIMB == 32 +# define _FPIO_CONST_OFFSET 2 +#else +# define _FPIO_CONST_OFFSET 1 +#endif + + +#endif /* fpioconst.h */ diff --git a/REORG.TODO/stdlib/gen-fpioconst.c b/REORG.TODO/stdlib/gen-fpioconst.c new file mode 100644 index 0000000000..e8b3258d1b --- /dev/null +++ b/REORG.TODO/stdlib/gen-fpioconst.c @@ -0,0 +1,108 @@ +/* Generate data for fpioconst.c. + Copyright (C) 2012-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <inttypes.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <gmp.h> +#include <stdint.h> + +int +main (void) +{ + FILE *out32 = fopen ("fpioconst-32", "w"); + if (out32 == NULL) + abort (); + FILE *out64 = fopen ("fpioconst-64", "w"); + if (out64 == NULL) + abort (); + FILE *outtable = fopen ("fpioconst-table", "w"); + if (outtable == NULL) + abort (); + mpz_t p; + mpz_init (p); + for (int i = 0; i <= 14; i++) + { + int j = 1 << i; + mpz_ui_pow_ui (p, 10, j - 1); + int exp_m = mpz_sizeinbase (p, 2); + mpz_ui_pow_ui (p, 10, j); + int exp_p = mpz_sizeinbase (p, 2); + int size32 = 2 + (exp_p + 31) / 32; + int size64 = 1 + (exp_p + 63) / 64; + uint32_t data32[size32]; + uint64_t data64[size64]; + memset (data32, 0, sizeof data32); + memset (data64, 0, sizeof data64); + mpz_export (data32 + 2, NULL, -1, 4, 0, 0, p); + mpz_export (data64 + 1, NULL, -1, 8, 0, 0, p); + if (i == 0) + { + fprintf (out32, "#define TENS_P%d_IDX\t0\n", i); + fprintf (out64, "#define TENS_P%d_IDX\t0\n", i); + } + else + { + fprintf (out32, "#define TENS_P%d_IDX\t" + "(TENS_P%d_IDX + TENS_P%d_SIZE)\n", + i, i - 1, i - 1); + fprintf (out64, "#define TENS_P%d_IDX\t" + "(TENS_P%d_IDX + TENS_P%d_SIZE)\n", + i, i - 1, i - 1); + } + fprintf (out32, "#define TENS_P%d_SIZE\t%d\n", i, size32); + fprintf (out64, "#define TENS_P%d_SIZE\t%d\n", i, size64); + for (int k = 0; k < size32; k++) + { + if (k == 0) + fprintf (out32, " [TENS_P%d_IDX] = ", i); + else if (k % 6 == 5) + fprintf (out32, "\n "); + else + fprintf (out32, " "); + fprintf (out32, "0x%08"PRIx32",", data32[k]); + } + for (int k = 0; k < size64; k++) + { + if (k == 0) + fprintf (out64, " [TENS_P%d_IDX] = ", i); + else if (k % 3 == 2) + fprintf (out64, "\n "); + else + fprintf (out64, " "); + fprintf (out64, "0x%016"PRIx64"ull,", data64[k]); + } + fprintf (out32, "\n\n"); + fprintf (out64, "\n\n"); + const char *t = (i >= 10 ? "\t" : "\t\t"); + if (i == 0) + fprintf (outtable, " { TENS_P%d_IDX, TENS_P%d_SIZE,%s%d,\t },\n", + i, i, t, exp_p); + else + fprintf (outtable, " { TENS_P%d_IDX, TENS_P%d_SIZE,%s%d,\t%5d },\n", + i, i, t, exp_p, exp_m); + } + if (fclose (out32) != 0) + abort (); + if (fclose (out64) != 0) + abort (); + if (fclose (outtable) != 0) + abort (); + return 0; +} diff --git a/REORG.TODO/stdlib/gen-tst-strtod-round.c b/REORG.TODO/stdlib/gen-tst-strtod-round.c new file mode 100644 index 0000000000..d792a245be --- /dev/null +++ b/REORG.TODO/stdlib/gen-tst-strtod-round.c @@ -0,0 +1,191 @@ +/* Generate table of tests in tst-strtod-round.c from + tst-strtod-round-data. + Copyright (C) 2012-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* Compile this program as: + + gcc -std=gnu11 -O2 -Wall -Wextra gen-tst-strtod-round.c -lmpfr \ + -o gen-tst-strtod-round + + (use of current MPFR version recommended) and run it as: + + gen-tst-strtod-round tst-strtod-round-data tst-strtod-round-data.h + + The output file will be generated as tst-strtod-round-data.h +*/ + + +#define _GNU_SOURCE +#include <assert.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <mpfr.h> + +/* Work around incorrect ternary value from mpfr_strtofr + <https://sympa.inria.fr/sympa/arc/mpfr/2012-08/msg00005.html>. */ +#define WORKAROUND + +static int +string_to_fp (mpfr_t f, const char *s, mpfr_rnd_t rnd) +{ +#ifdef WORKAROUND + mpfr_t f2; + mpfr_init2 (f2, 100000); + int r0 = mpfr_strtofr (f2, s, NULL, 0, rnd); + int r = mpfr_set (f, f2, rnd); + r |= mpfr_subnormalize (f, r, rnd); + mpfr_clear (f2); + return r0 | r; +#else + int r = mpfr_strtofr (f, s, NULL, 0, rnd); + r |= mpfr_subnormalize (f, r, rnd); + return r; +#endif +} + +void +print_fp (FILE *fout, mpfr_t f, const char *suffix) +{ + if (mpfr_inf_p (f)) + mpfr_fprintf (fout, "\t%sINF%s", mpfr_signbit (f) ? "-" : "", suffix); + else + mpfr_fprintf (fout, "\t%Ra%s", f, suffix); +} + +static void +round_str (FILE *fout, const char *s, int prec, int emin, int emax, + bool ibm_ld) +{ + mpfr_t f; + mpfr_set_default_prec (prec); + mpfr_set_emin (emin); + mpfr_set_emax (emax); + mpfr_init (f); + int r = string_to_fp (f, s, MPFR_RNDD); + if (ibm_ld) + { + assert (prec == 106 && emin == -1073 && emax == 1024); + /* The maximum value in IBM long double has discontiguous + mantissa bits. */ + mpfr_t max_value; + mpfr_init2 (max_value, 107); + mpfr_set_str (max_value, "0x1.fffffffffffff7ffffffffffffcp+1023", 0, + MPFR_RNDN); + if (mpfr_cmpabs (f, max_value) > 0) + r = 1; + mpfr_clear (max_value); + } + mpfr_fprintf (fout, "\t%s,\n", r ? "false" : "true"); + print_fp (fout, f, ",\n"); + string_to_fp (f, s, MPFR_RNDN); + print_fp (fout, f, ",\n"); + string_to_fp (f, s, MPFR_RNDZ); + print_fp (fout, f, ",\n"); + string_to_fp (f, s, MPFR_RNDU); + print_fp (fout, f, ""); + mpfr_clear (f); +} + +static void +round_for_all (FILE *fout, const char *s) +{ + static const struct fmt { + int prec; + int emin; + int emax; + bool ibm_ld; + } formats[] = { + { 24, -148, 128, false }, + { 53, -1073, 1024, false }, + /* This is the Intel extended float format. */ + { 64, -16444, 16384, false }, + /* This is the Motorola extended float format. */ + { 64, -16445, 16384, false }, + { 106, -1073, 1024, true }, + { 113, -16493, 16384, false }, + }; + mpfr_fprintf (fout, " TEST (\""); + const char *p; + for (p = s; *p; p++) + { + fputc (*p, fout); + if ((p - s) % 60 == 59 && p[1]) + mpfr_fprintf (fout, "\"\n\t\""); + } + mpfr_fprintf (fout, "\",\n"); + int i; + int n_formats = sizeof (formats) / sizeof (formats[0]); + for (i = 0; i < n_formats; i++) + { + round_str (fout, s, formats[i].prec, formats[i].emin, + formats[i].emax, formats[i].ibm_ld); + if (i < n_formats - 1) + mpfr_fprintf (fout, ",\n"); + } + mpfr_fprintf (fout, "),\n"); +} + +int +main (int argc, char **argv) +{ + char *p = NULL; + size_t len; + ssize_t nbytes; + FILE *fin, *fout; + char *fin_name, *fout_name; + + if (argc < 3) + { + fprintf (stderr, "Usage: %s <input> <output>\n", basename (argv[0])); + return EXIT_FAILURE; + } + + fin_name = argv[1]; + fout_name = argv[2]; + + fin = fopen (fin_name, "r"); + if (fin == NULL) + { + perror ("Could not open input for reading"); + return EXIT_FAILURE; + } + + fout = fopen (fout_name, "w"); + if (fout == NULL) + { + perror ("Could not open output for writing"); + return EXIT_FAILURE; + } + + fprintf (fout, "/* This file was generated by %s from %s. */\n", + __FILE__, fin_name); + fputs ("static const struct test tests[] = {\n", fout); + while ((nbytes = getline (&p, &len, fin)) != -1) + { + if (p[nbytes - 1] == '\n') + p[nbytes - 1] = 0; + round_for_all (fout, p); + free (p); + p = NULL; + } + fputs ("};\n", fout); + + return EXIT_SUCCESS; +} diff --git a/REORG.TODO/stdlib/getcontext.c b/REORG.TODO/stdlib/getcontext.c new file mode 100644 index 0000000000..07560033a6 --- /dev/null +++ b/REORG.TODO/stdlib/getcontext.c @@ -0,0 +1,29 @@ +/* Copyright (C) 1998-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <ucontext.h> + +int +getcontext (ucontext_t *ucp) +{ + __set_errno (ENOSYS); + return -1; +} + + +stub_warning (getcontext) diff --git a/REORG.TODO/stdlib/getentropy.c b/REORG.TODO/stdlib/getentropy.c new file mode 100644 index 0000000000..a71d4cd8f5 --- /dev/null +++ b/REORG.TODO/stdlib/getentropy.c @@ -0,0 +1,31 @@ +/* Stub for getentropy. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <sys/random.h> +#include <errno.h> + +/* Write LENGTH bytes of randomness starting at BUFFER. Return 0 on + success and -1 on failure. */ +ssize_t +getentropy (void *buffer, size_t length) +{ + __set_errno (ENOSYS); + return -1; +} + +stub_warning (getentropy) diff --git a/REORG.TODO/stdlib/getenv.c b/REORG.TODO/stdlib/getenv.c new file mode 100644 index 0000000000..b6fb1abeaa --- /dev/null +++ b/REORG.TODO/stdlib/getenv.c @@ -0,0 +1,92 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <endian.h> +#include <errno.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> + + +/* Return the value of the environment variable NAME. This implementation + is tuned a bit in that it assumes no environment variable has an empty + name which of course should always be true. We have a special case for + one character names so that for the general case we can assume at least + two characters which we can access. By doing this we can avoid using the + `strncmp' most of the time. */ +char * +getenv (const char *name) +{ + size_t len = strlen (name); + char **ep; + uint16_t name_start; + + if (__environ == NULL || name[0] == '\0') + return NULL; + + if (name[1] == '\0') + { + /* The name of the variable consists of only one character. Therefore + the first two characters of the environment entry are this character + and a '=' character. */ +#if __BYTE_ORDER == __LITTLE_ENDIAN || !_STRING_ARCH_unaligned + name_start = ('=' << 8) | *(const unsigned char *) name; +#else + name_start = '=' | ((*(const unsigned char *) name) << 8); +#endif + for (ep = __environ; *ep != NULL; ++ep) + { +#if _STRING_ARCH_unaligned + uint16_t ep_start = *(uint16_t *) *ep; +#else + uint16_t ep_start = (((unsigned char *) *ep)[0] + | (((unsigned char *) *ep)[1] << 8)); +#endif + if (name_start == ep_start) + return &(*ep)[2]; + } + } + else + { +#if _STRING_ARCH_unaligned + name_start = *(const uint16_t *) name; +#else + name_start = (((const unsigned char *) name)[0] + | (((const unsigned char *) name)[1] << 8)); +#endif + len -= 2; + name += 2; + + for (ep = __environ; *ep != NULL; ++ep) + { +#if _STRING_ARCH_unaligned + uint16_t ep_start = *(uint16_t *) *ep; +#else + uint16_t ep_start = (((unsigned char *) *ep)[0] + | (((unsigned char *) *ep)[1] << 8)); +#endif + + if (name_start == ep_start && !strncmp (*ep + 2, name, len) + && (*ep)[len + 2] == '=') + return &(*ep)[len + 3]; + } + } + + return NULL; +} +libc_hidden_def (getenv) diff --git a/REORG.TODO/stdlib/getrandom.c b/REORG.TODO/stdlib/getrandom.c new file mode 100644 index 0000000000..b2a83c2db7 --- /dev/null +++ b/REORG.TODO/stdlib/getrandom.c @@ -0,0 +1,31 @@ +/* Stub for getrandom. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <sys/random.h> +#include <errno.h> + +/* Write LENGTH bytes of randomness starting at BUFFER. Return the + number of bytes written, or -1 on error. */ +ssize_t +getrandom (void *buffer, size_t length, unsigned int flags) +{ + __set_errno (ENOSYS); + return -1; +} + +stub_warning (getrandom) diff --git a/REORG.TODO/stdlib/getsubopt.c b/REORG.TODO/stdlib/getsubopt.c new file mode 100644 index 0000000000..7d6772dc1f --- /dev/null +++ b/REORG.TODO/stdlib/getsubopt.c @@ -0,0 +1,79 @@ +/* Parse comma separate list into words. + Copyright (C) 1996-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <string.h> + +#if !_LIBC +/* This code is written for inclusion in gnu-libc, and uses names in + the namespace reserved for libc. If we're compiling in gnulib, + define those names to be the normal ones instead. */ +# include "strchrnul.h" +# undef __strchrnul +# define __strchrnul strchrnul +#endif + +/* Parse comma separated suboption from *OPTIONP and match against + strings in TOKENS. If found return index and set *VALUEP to + optional value introduced by an equal sign. If the suboption is + not part of TOKENS return in *VALUEP beginning of unknown + suboption. On exit *OPTIONP is set to the beginning of the next + token or at the terminating NUL character. */ +int +getsubopt (char **optionp, char *const *tokens, char **valuep) +{ + char *endp, *vstart; + int cnt; + + if (**optionp == '\0') + return -1; + + /* Find end of next token. */ + endp = __strchrnul (*optionp, ','); + + /* Find start of value. */ + vstart = memchr (*optionp, '=', endp - *optionp); + if (vstart == NULL) + vstart = endp; + + /* Try to match the characters between *OPTIONP and VSTART against + one of the TOKENS. */ + for (cnt = 0; tokens[cnt] != NULL; ++cnt) + if (strncmp (*optionp, tokens[cnt], vstart - *optionp) == 0 + && tokens[cnt][vstart - *optionp] == '\0') + { + /* We found the current option in TOKENS. */ + *valuep = vstart != endp ? vstart + 1 : NULL; + + if (*endp != '\0') + *endp++ = '\0'; + *optionp = endp; + + return cnt; + } + + /* The current suboption does not match any option. */ + *valuep = *optionp; + + if (*endp != '\0') + *endp++ = '\0'; + *optionp = endp; + + return -1; +} diff --git a/REORG.TODO/stdlib/gmp-impl.h b/REORG.TODO/stdlib/gmp-impl.h new file mode 100644 index 0000000000..42d3e4afac --- /dev/null +++ b/REORG.TODO/stdlib/gmp-impl.h @@ -0,0 +1,367 @@ +/* Include file for internal GNU MP types and definitions. + +Copyright (C) 1991-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library; see the file COPYING.LIB. If not, see +<http://www.gnu.org/licenses/>. */ + +/* When using gcc, make sure to use its builtin alloca. */ +#if ! defined (alloca) && defined (__GNUC__) +#define alloca __builtin_alloca +#define HAVE_ALLOCA +#endif + +/* When using cc, do whatever necessary to allow use of alloca. For many + machines, this means including alloca.h. IBM's compilers need a #pragma + in "each module that needs to use alloca". */ +#if ! defined (alloca) +/* We need lots of variants for MIPS, to cover all versions and perversions + of OSes for MIPS. */ +#if defined (__mips) || defined (MIPSEL) || defined (MIPSEB) \ + || defined (_MIPSEL) || defined (_MIPSEB) || defined (__sgi) \ + || defined (__alpha) || defined (__sparc) || defined (sparc) \ + || defined (__ksr__) +#include <alloca.h> +#define HAVE_ALLOCA +#endif +#if defined (_IBMR2) +#pragma alloca +#define HAVE_ALLOCA +#endif +#if defined (__DECC) +#define alloca(x) __ALLOCA(x) +#define HAVE_ALLOCA +#endif +#endif + +#if (! defined (alloca) && ! defined (HAVE_ALLOCA)) \ + || defined (USE_STACK_ALLOC) +#include "stack-alloc.h" +#else +#define TMP_DECL(m) +#define TMP_ALLOC(x) alloca(x) +#define TMP_MARK(m) +#define TMP_FREE(m) +#endif + +#ifndef NULL +#define NULL ((void *) 0) +#endif + +#if ! defined (__GNUC__) +#define inline /* Empty */ +#endif + +/* Get MAX/MIN macros. */ +#include <sys/param.h> + +/* Field access macros. */ +#define SIZ(x) ((x)->_mp_size) +#define PTR(x) ((x)->_mp_d) +#define EXP(x) ((x)->_mp_exp) +#define PREC(x) ((x)->_mp_prec) +#define ALLOC(x) ((x)->_mp_alloc) + +#include "gmp-mparam.h" +/* #include "longlong.h" */ + +#if defined (__STDC__) || defined (__cplusplus) +void *malloc (size_t); +void *realloc (void *, size_t); +void free (void *); + +extern void * (*_mp_allocate_func) (size_t); +extern void * (*_mp_reallocate_func) (void *, size_t, size_t); +extern void (*_mp_free_func) (void *, size_t); + +void *_mp_default_allocate (size_t); +void *_mp_default_reallocate (void *, size_t, size_t); +void _mp_default_free (void *, size_t); + +#else + +#define const /* Empty */ +#define signed /* Empty */ + +void *malloc (); +void *realloc (); +void free (); + +extern void * (*_mp_allocate_func) (); +extern void * (*_mp_reallocate_func) (); +extern void (*_mp_free_func) (); + +void *_mp_default_allocate (); +void *_mp_default_reallocate (); +void _mp_default_free (); +#endif + +/* Copy NLIMBS *limbs* from SRC to DST. */ +#define MPN_COPY_INCR(DST, SRC, NLIMBS) \ + do { \ + mp_size_t __i; \ + for (__i = 0; __i < (NLIMBS); __i++) \ + (DST)[__i] = (SRC)[__i]; \ + } while (0) +#define MPN_COPY_DECR(DST, SRC, NLIMBS) \ + do { \ + mp_size_t __i; \ + for (__i = (NLIMBS) - 1; __i >= 0; __i--) \ + (DST)[__i] = (SRC)[__i]; \ + } while (0) +#define MPN_COPY MPN_COPY_INCR + +/* Zero NLIMBS *limbs* AT DST. */ +#define MPN_ZERO(DST, NLIMBS) \ + do { \ + mp_size_t __i; \ + for (__i = 0; __i < (NLIMBS); __i++) \ + (DST)[__i] = 0; \ + } while (0) + +#define MPN_NORMALIZE(DST, NLIMBS) \ + do { \ + while (NLIMBS > 0) \ + { \ + if ((DST)[(NLIMBS) - 1] != 0) \ + break; \ + NLIMBS--; \ + } \ + } while (0) +#define MPN_NORMALIZE_NOT_ZERO(DST, NLIMBS) \ + do { \ + while (1) \ + { \ + if ((DST)[(NLIMBS) - 1] != 0) \ + break; \ + NLIMBS--; \ + } \ + } while (0) + +/* Initialize the MP_INT X with space for NLIMBS limbs. + X should be a temporary variable, and it will be automatically + cleared out when the running function returns. + We use __x here to make it possible to accept both mpz_ptr and mpz_t + arguments. */ +#define MPZ_TMP_INIT(X, NLIMBS) \ + do { \ + mpz_ptr __x = (X); \ + __x->_mp_alloc = (NLIMBS); \ + __x->_mp_d = (mp_ptr) TMP_ALLOC ((NLIMBS) * BYTES_PER_MP_LIMB); \ + } while (0) + +#define MPN_MUL_N_RECURSE(prodp, up, vp, size, tspace) \ + do { \ + if ((size) < KARATSUBA_THRESHOLD) \ + impn_mul_n_basecase (prodp, up, vp, size); \ + else \ + impn_mul_n (prodp, up, vp, size, tspace); \ + } while (0); +#define MPN_SQR_N_RECURSE(prodp, up, size, tspace) \ + do { \ + if ((size) < KARATSUBA_THRESHOLD) \ + impn_sqr_n_basecase (prodp, up, size); \ + else \ + impn_sqr_n (prodp, up, size, tspace); \ + } while (0); + +/* Structure for conversion between internal binary format and + strings in base 2..36. */ +struct bases +{ + /* Number of digits in the conversion base that always fits in an mp_limb_t. + For example, for base 10 on a machine where a mp_limb_t has 32 bits this + is 9, since 10**9 is the largest number that fits into a mp_limb_t. */ + int chars_per_limb; + + /* log(2)/log(conversion_base) */ + float chars_per_bit_exactly; + + /* base**chars_per_limb, i.e. the biggest number that fits a word, built by + factors of base. Exception: For 2, 4, 8, etc, big_base is log2(base), + i.e. the number of bits used to represent each digit in the base. */ + mp_limb_t big_base; + + /* A BITS_PER_MP_LIMB bit approximation to 1/big_base, represented as a + fixed-point number. Instead of dividing by big_base an application can + choose to multiply by big_base_inverted. */ + mp_limb_t big_base_inverted; +}; + +extern const struct bases __mp_bases[]; +extern mp_size_t __gmp_default_fp_limb_precision; + +/* Divide the two-limb number in (NH,,NL) by D, with DI being the largest + limb not larger than (2**(2*BITS_PER_MP_LIMB))/D - (2**BITS_PER_MP_LIMB). + If this would yield overflow, DI should be the largest possible number + (i.e., only ones). For correct operation, the most significant bit of D + has to be set. Put the quotient in Q and the remainder in R. */ +#define udiv_qrnnd_preinv(q, r, nh, nl, d, di) \ + do { \ + mp_limb_t _ql __attribute__ ((unused)); \ + mp_limb_t _q, _r; \ + mp_limb_t _xh, _xl; \ + umul_ppmm (_q, _ql, (nh), (di)); \ + _q += (nh); /* DI is 2**BITS_PER_MP_LIMB too small */\ + umul_ppmm (_xh, _xl, _q, (d)); \ + sub_ddmmss (_xh, _r, (nh), (nl), _xh, _xl); \ + if (_xh != 0) \ + { \ + sub_ddmmss (_xh, _r, _xh, _r, 0, (d)); \ + _q += 1; \ + if (_xh != 0) \ + { \ + sub_ddmmss (_xh, _r, _xh, _r, 0, (d)); \ + _q += 1; \ + } \ + } \ + if (_r >= (d)) \ + { \ + _r -= (d); \ + _q += 1; \ + } \ + (r) = _r; \ + (q) = _q; \ + } while (0) +/* Like udiv_qrnnd_preinv, but for any value D. DNORM is D shifted left + so that its most significant bit is set. LGUP is ceil(log2(D)). */ +#define udiv_qrnnd_preinv2gen(q, r, nh, nl, d, di, dnorm, lgup) \ + do { \ + mp_limb_t n2, n10, n1, nadj, q1; \ + mp_limb_t _xh, _xl; \ + n2 = ((nh) << (BITS_PER_MP_LIMB - (lgup))) + ((nl) >> 1 >> (l - 1));\ + n10 = (nl) << (BITS_PER_MP_LIMB - (lgup)); \ + n1 = ((mp_limb_signed_t) n10 >> (BITS_PER_MP_LIMB - 1)); \ + nadj = n10 + (n1 & (dnorm)); \ + umul_ppmm (_xh, _xl, di, n2 - n1); \ + add_ssaaaa (_xh, _xl, _xh, _xl, 0, nadj); \ + q1 = ~(n2 + _xh); \ + umul_ppmm (_xh, _xl, q1, d); \ + add_ssaaaa (_xh, _xl, _xh, _xl, nh, nl); \ + _xh -= (d); \ + (r) = _xl + ((d) & _xh); \ + (q) = _xh - q1; \ + } while (0) +/* Exactly like udiv_qrnnd_preinv, but branch-free. It is not clear which + version to use. */ +#define udiv_qrnnd_preinv2norm(q, r, nh, nl, d, di) \ + do { \ + mp_limb_t n2, n10, n1, nadj, q1; \ + mp_limb_t _xh, _xl; \ + n2 = (nh); \ + n10 = (nl); \ + n1 = ((mp_limb_signed_t) n10 >> (BITS_PER_MP_LIMB - 1)); \ + nadj = n10 + (n1 & (d)); \ + umul_ppmm (_xh, _xl, di, n2 - n1); \ + add_ssaaaa (_xh, _xl, _xh, _xl, 0, nadj); \ + q1 = ~(n2 + _xh); \ + umul_ppmm (_xh, _xl, q1, d); \ + add_ssaaaa (_xh, _xl, _xh, _xl, nh, nl); \ + _xh -= (d); \ + (r) = _xl + ((d) & _xh); \ + (q) = _xh - q1; \ + } while (0) + +#if defined (__GNUC__) +/* Define stuff for longlong.h. */ +typedef unsigned int UQItype __attribute__ ((mode (QI))); +typedef int SItype __attribute__ ((mode (SI))); +typedef unsigned int USItype __attribute__ ((mode (SI))); +typedef int DItype __attribute__ ((mode (DI))); +typedef unsigned int UDItype __attribute__ ((mode (DI))); +#else +typedef unsigned char UQItype; +typedef long SItype; +typedef unsigned long USItype; +#endif + +typedef mp_limb_t UWtype; +typedef unsigned int UHWtype; +#define W_TYPE_SIZE BITS_PER_MP_LIMB + +/* Internal mpn calls */ +#define impn_mul_n_basecase __MPN(impn_mul_n_basecase) +#define impn_mul_n __MPN(impn_mul_n) +#define impn_sqr_n_basecase __MPN(impn_sqr_n_basecase) +#define impn_sqr_n __MPN(impn_sqr_n) + +#ifndef _PROTO +#if defined (__STDC__) || defined (__cplusplus) +#define _PROTO(x) x +#else +#define _PROTO(x) () +#endif +#endif + +/* Prototypes for internal mpn calls. */ +extern void impn_mul_n_basecase _PROTO ((mp_ptr prodp, mp_srcptr up, + mp_srcptr vp, mp_size_t size)); +extern void impn_mul_n _PROTO ((mp_ptr prodp, mp_srcptr up, mp_srcptr vp, + mp_size_t size, mp_ptr tspace)); +extern void impn_sqr_n_basecase _PROTO ((mp_ptr prodp, mp_srcptr up, + mp_size_t size)); +extern void impn_sqr_n _PROTO ((mp_ptr prodp, mp_srcptr up, mp_size_t size, + mp_ptr tspace)); + + + +#ifndef IEEE_DOUBLE_BIG_ENDIAN +#define IEEE_DOUBLE_BIG_ENDIAN 1 +#endif + +#ifndef IEEE_DOUBLE_MIXED_ENDIAN +#define IEEE_DOUBLE_MIXED_ENDIAN 0 +#endif + +#if IEEE_DOUBLE_MIXED_ENDIAN +union ieee_double_extract +{ + struct + { + unsigned int manh:20; + unsigned int exp:11; + unsigned int sig:1; + unsigned int manl:32; + } s; + double d; +}; +#else +#if IEEE_DOUBLE_BIG_ENDIAN +union ieee_double_extract +{ + struct + { + unsigned int sig:1; + unsigned int exp:11; + unsigned int manh:20; + unsigned int manl:32; + } s; + double d; +}; +#else +union ieee_double_extract +{ + struct + { + unsigned int manl:32; + unsigned int manh:20; + unsigned int exp:11; + unsigned int sig:1; + } s; + double d; +}; +#endif +#endif diff --git a/REORG.TODO/stdlib/gmp.h b/REORG.TODO/stdlib/gmp.h new file mode 100644 index 0000000000..821e3affd0 --- /dev/null +++ b/REORG.TODO/stdlib/gmp.h @@ -0,0 +1,623 @@ +/* gmp.h -- Definitions for GNU multiple precision functions. + +Copyright (C) 1991-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library; see the file COPYING.LIB. If not, see +<http://www.gnu.org/licenses/>. */ + +#ifndef __GMP_H__ + +#include <features.h> + +#ifndef __GNU_MP__ +#define __GNU_MP__ 2 +#define __need_size_t +#include <stddef.h> +#undef __need_size_t + +#if defined (__STDC__) || defined (__cplusplus) +#define __gmp_const const +#else +#define __gmp_const +#endif + +#if defined (__GNUC__) +#define __gmp_inline __inline__ +#else +#define __gmp_inline +#endif + +#ifndef _EXTERN_INLINE +#ifdef __GNUC__ +#define _EXTERN_INLINE __extern_inline +#else +#define _EXTERN_INLINE static +#endif +#endif + +#ifdef _SHORT_LIMB +typedef unsigned int mp_limb_t; +typedef int mp_limb_signed_t; +#else +#ifdef _LONG_LONG_LIMB +typedef unsigned long long int mp_limb_t; +typedef long long int mp_limb_signed_t; +#else +typedef unsigned long int mp_limb_t; +typedef long int mp_limb_signed_t; +#endif +#endif + +typedef mp_limb_t * mp_ptr; +typedef __gmp_const mp_limb_t * mp_srcptr; +typedef long int mp_size_t; +typedef long int mp_exp_t; + +#ifndef __MP_SMALL__ +typedef struct +{ + int _mp_alloc; /* Number of *limbs* allocated and pointed + to by the D field. */ + int _mp_size; /* abs(SIZE) is the number of limbs + the last field points to. If SIZE + is negative this is a negative + number. */ + mp_limb_t *_mp_d; /* Pointer to the limbs. */ +} __mpz_struct; +#else +typedef struct +{ + short int _mp_alloc; /* Number of *limbs* allocated and pointed + to by the D field. */ + short int _mp_size; /* abs(SIZE) is the number of limbs + the last field points to. If SIZE + is negative this is a negative + number. */ + mp_limb_t *_mp_d; /* Pointer to the limbs. */ +} __mpz_struct; +#endif +#endif /* __GNU_MP__ */ + +/* User-visible types. */ +typedef __mpz_struct MP_INT; +typedef __mpz_struct mpz_t[1]; + +/* Structure for rational numbers. Zero is represented as 0/any, i.e. + the denominator is ignored. Negative numbers have the sign in + the numerator. */ +typedef struct +{ + __mpz_struct _mp_num; + __mpz_struct _mp_den; +#if 0 + int _mp_num_alloc; /* Number of limbs allocated + for the numerator. */ + int _mp_num_size; /* The absolute value of this field is the + length of the numerator; the sign is the + sign of the entire rational number. */ + mp_ptr _mp_num; /* Pointer to the numerator limbs. */ + int _mp_den_alloc; /* Number of limbs allocated + for the denominator. */ + int _mp_den_size; /* Length of the denominator. (This field + should always be positive.) */ + mp_ptr _mp_den; /* Pointer to the denominator limbs. */ +#endif +} __mpq_struct; + +typedef __mpq_struct MP_RAT; +typedef __mpq_struct mpq_t[1]; + +typedef struct +{ + int _mp_prec; /* Max precision, in number of `mp_limb_t's. + Set by mpf_init and modified by + mpf_set_prec. The area pointed to + by the `d' field contains `prec' + 1 + limbs. */ + int _mp_size; /* abs(SIZE) is the number of limbs + the last field points to. If SIZE + is negative this is a negative + number. */ + mp_exp_t _mp_exp; /* Exponent, in the base of `mp_limb_t'. */ + mp_limb_t *_mp_d; /* Pointer to the limbs. */ +} __mpf_struct; + +/* typedef __mpf_struct MP_FLOAT; */ +typedef __mpf_struct mpf_t[1]; + +/* Types for function declarations in gmp files. */ +/* ??? Should not pollute user name space with these ??? */ +typedef __gmp_const __mpz_struct *mpz_srcptr; +typedef __mpz_struct *mpz_ptr; +typedef __gmp_const __mpf_struct *mpf_srcptr; +typedef __mpf_struct *mpf_ptr; +typedef __gmp_const __mpq_struct *mpq_srcptr; +typedef __mpq_struct *mpq_ptr; + +#ifndef _PROTO +#if defined (__STDC__) || defined (__cplusplus) +#define _PROTO(x) x +#else +#define _PROTO(x) () +#endif +#endif + +#ifndef __MPN +#if defined (__STDC__) || defined (__cplusplus) +#define __MPN(x) __mpn_##x +#else +#define __MPN(x) __mpn_/**/x +#endif +#endif + +#if defined (FILE) || defined (_STDIO_H_) || defined (__STDIO_H__) || defined (H_STDIO) +#define _GMP_H_HAVE_FILE 1 +#endif + +void mp_set_memory_functions _PROTO ((void *(*) (size_t), + void *(*) (void *, size_t, size_t), + void (*) (void *, size_t))); +extern const int mp_bits_per_limb; + +/**************** Integer (i.e. Z) routines. ****************/ + +#if defined (__cplusplus) +extern "C" { +#endif +void *_mpz_realloc _PROTO ((mpz_ptr, mp_size_t)); + +void mpz_abs _PROTO ((mpz_ptr, mpz_srcptr)); +void mpz_add _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); +void mpz_add_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); +void mpz_and _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); +void mpz_array_init _PROTO ((mpz_ptr, mp_size_t, mp_size_t)); +void mpz_cdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); +unsigned long int mpz_cdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); +void mpz_cdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); +unsigned long int mpz_cdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); +void mpz_cdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); +unsigned long int mpz_cdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); +unsigned long int mpz_cdiv_ui _PROTO ((mpz_srcptr, unsigned long int)); +void mpz_clear _PROTO ((mpz_ptr)); +void mpz_clrbit _PROTO ((mpz_ptr, unsigned long int)); +int mpz_cmp _PROTO ((mpz_srcptr, mpz_srcptr)); +int mpz_cmp_si _PROTO ((mpz_srcptr, signed long int)); +int mpz_cmp_ui _PROTO ((mpz_srcptr, unsigned long int)); +void mpz_com _PROTO ((mpz_ptr, mpz_srcptr)); +void mpz_divexact _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); +void mpz_fac_ui _PROTO ((mpz_ptr, unsigned long int)); +void mpz_fdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); +void mpz_fdiv_q_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); +unsigned long int mpz_fdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); +void mpz_fdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); +unsigned long int mpz_fdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); +void mpz_fdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); +void mpz_fdiv_r_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); +unsigned long int mpz_fdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); +unsigned long int mpz_fdiv_ui _PROTO ((mpz_srcptr, unsigned long int)); +void mpz_gcd _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); +unsigned long int mpz_gcd_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); +void mpz_gcdext _PROTO ((mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); +/* signed */ long int mpz_get_si _PROTO ((mpz_srcptr)); +char *mpz_get_str _PROTO ((char *, int, mpz_srcptr)); +unsigned long int mpz_get_ui _PROTO ((mpz_srcptr)); +mp_limb_t mpz_getlimbn _PROTO ((mpz_srcptr, mp_size_t)); +unsigned long int mpz_hamdist _PROTO ((mpz_srcptr, mpz_srcptr)); +void mpz_init _PROTO ((mpz_ptr)); +#ifdef _GMP_H_HAVE_FILE +size_t mpz_inp_binary _PROTO ((mpz_ptr, FILE *)); +size_t mpz_inp_raw _PROTO ((mpz_ptr, FILE *)); +size_t mpz_inp_str _PROTO ((mpz_ptr, FILE *, int)); +#endif +void mpz_init_set _PROTO ((mpz_ptr, mpz_srcptr)); +void mpz_init_set_d _PROTO ((mpz_ptr, double)); +void mpz_init_set_si _PROTO ((mpz_ptr, signed long int)); +int mpz_init_set_str _PROTO ((mpz_ptr, const char *, int)); +void mpz_init_set_ui _PROTO ((mpz_ptr, unsigned long int)); +int mpz_invert _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); +void mpz_ior _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); +int mpz_jacobi _PROTO ((mpz_srcptr, mpz_srcptr)); +int mpz_legendre _PROTO ((mpz_srcptr, mpz_srcptr)); +void mpz_mod _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); +void mpz_mul _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); +void mpz_mul_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); +void mpz_mul_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); +void mpz_neg _PROTO ((mpz_ptr, mpz_srcptr)); +#ifdef _GMP_H_HAVE_FILE +size_t mpz_out_binary _PROTO ((FILE *, mpz_srcptr)); +size_t mpz_out_raw _PROTO ((FILE *, mpz_srcptr)); +size_t mpz_out_str _PROTO ((FILE *, int, mpz_srcptr)); +#endif +int mpz_perfect_square_p _PROTO ((mpz_srcptr)); +unsigned long int mpz_popcount _PROTO ((mpz_srcptr)); +void mpz_pow_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); +void mpz_powm _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr)); +void mpz_powm_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int, mpz_srcptr)); +int mpz_probab_prime_p _PROTO ((mpz_srcptr, int)); +void mpz_random _PROTO ((mpz_ptr, mp_size_t)); +void mpz_random2 _PROTO ((mpz_ptr, mp_size_t)); +unsigned long int mpz_scan0 _PROTO ((mpz_srcptr, unsigned long int)); +unsigned long int mpz_scan1 _PROTO ((mpz_srcptr, unsigned long int)); +void mpz_set _PROTO ((mpz_ptr, mpz_srcptr)); +void mpz_set_d _PROTO ((mpz_ptr, double)); +void mpz_set_si _PROTO ((mpz_ptr, signed long int)); +int mpz_set_str _PROTO ((mpz_ptr, const char *, int)); +void mpz_set_ui _PROTO ((mpz_ptr, unsigned long int)); +void mpz_setbit _PROTO ((mpz_ptr, unsigned long int)); +size_t mpz_size _PROTO ((mpz_srcptr)); +size_t mpz_sizeinbase _PROTO ((mpz_srcptr, int)); +void mpz_sqrt _PROTO ((mpz_ptr, mpz_srcptr)); +void mpz_sqrtrem _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr)); +void mpz_sub _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); +void mpz_sub_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); +void mpz_tdiv_q _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); +void mpz_tdiv_q_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); +void mpz_tdiv_q_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); +void mpz_tdiv_qr _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr)); +void mpz_tdiv_qr_ui _PROTO ((mpz_ptr, mpz_ptr, mpz_srcptr, unsigned long int)); +void mpz_tdiv_r _PROTO ((mpz_ptr, mpz_srcptr, mpz_srcptr)); +void mpz_tdiv_r_2exp _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); +void mpz_tdiv_r_ui _PROTO ((mpz_ptr, mpz_srcptr, unsigned long int)); +void mpz_ui_pow_ui _PROTO ((mpz_ptr, unsigned long int, unsigned long int)); + +/**************** Rational (i.e. Q) routines. ****************/ + +void mpq_init _PROTO ((mpq_ptr)); +void mpq_clear _PROTO ((mpq_ptr)); +void mpq_set _PROTO ((mpq_ptr, mpq_srcptr)); +void mpq_set_ui _PROTO ((mpq_ptr, unsigned long int, unsigned long int)); +void mpq_set_si _PROTO ((mpq_ptr, signed long int, unsigned long int)); +void mpq_add _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); +void mpq_sub _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); +void mpq_mul _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); +void mpq_div _PROTO ((mpq_ptr, mpq_srcptr, mpq_srcptr)); +void mpq_neg _PROTO ((mpq_ptr, mpq_srcptr)); +int mpq_cmp _PROTO ((mpq_srcptr, mpq_srcptr)); +int mpq_cmp_ui _PROTO ((mpq_srcptr, unsigned long int, unsigned long int)); +void mpq_inv _PROTO ((mpq_ptr, mpq_srcptr)); +void mpq_set_num _PROTO ((mpq_ptr, mpz_srcptr)); +void mpq_set_den _PROTO ((mpq_ptr, mpz_srcptr)); +void mpq_get_num _PROTO ((mpz_ptr, mpq_srcptr)); +void mpq_get_den _PROTO ((mpz_ptr, mpq_srcptr)); +double mpq_get_d _PROTO ((mpq_srcptr)); +void mpq_canonicalize _PROTO ((mpq_ptr)); + +/**************** Float (i.e. F) routines. ****************/ + +void mpf_abs _PROTO ((mpf_ptr, mpf_srcptr)); +void mpf_add _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); +void mpf_add_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); +void mpf_clear _PROTO ((mpf_ptr)); +int mpf_cmp _PROTO ((mpf_srcptr, mpf_srcptr)); +int mpf_cmp_si _PROTO ((mpf_srcptr, signed long int)); +int mpf_cmp_ui _PROTO ((mpf_srcptr, unsigned long int)); +void mpf_div _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); +void mpf_div_2exp _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); +void mpf_div_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); +void mpf_dump _PROTO ((mpf_srcptr)); +int mpf_eq _PROTO ((mpf_srcptr, mpf_srcptr, unsigned long int)); +unsigned long int mpf_get_prec _PROTO ((mpf_srcptr)); +char *mpf_get_str _PROTO ((char *, mp_exp_t *, int, size_t, mpf_srcptr)); +void mpf_init _PROTO ((mpf_ptr)); +void mpf_init2 _PROTO ((mpf_ptr, unsigned long int)); +#ifdef _GMP_H_HAVE_FILE +size_t mpf_inp_str _PROTO ((mpf_ptr, FILE *, int)); +#endif +void mpf_init_set _PROTO ((mpf_ptr, mpf_srcptr)); +void mpf_init_set_d _PROTO ((mpf_ptr, double)); +void mpf_init_set_si _PROTO ((mpf_ptr, signed long int)); +int mpf_init_set_str _PROTO ((mpf_ptr, char *, int)); +void mpf_init_set_ui _PROTO ((mpf_ptr, unsigned long int)); +void mpf_mul _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); +void mpf_mul_2exp _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); +void mpf_mul_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); +void mpf_neg _PROTO ((mpf_ptr, mpf_srcptr)); +#ifdef _GMP_H_HAVE_FILE +size_t mpf_out_str _PROTO ((FILE *, int, size_t, mpf_srcptr)); +#endif +void mpf_random2 _PROTO ((mpf_ptr, mp_size_t, mp_exp_t)); +void mpf_reldiff _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); +void mpf_set _PROTO ((mpf_ptr, mpf_srcptr)); +void mpf_set_d _PROTO ((mpf_ptr, double)); +void mpf_set_default_prec _PROTO ((unsigned long int)); +void mpf_set_prec _PROTO ((mpf_ptr, unsigned long int)); +void mpf_set_prec_raw _PROTO ((mpf_ptr, unsigned long int)); +void mpf_set_si _PROTO ((mpf_ptr, signed long int)); +int mpf_set_str _PROTO ((mpf_ptr, const char *, int)); +void mpf_set_ui _PROTO ((mpf_ptr, unsigned long int)); +size_t mpf_size _PROTO ((mpf_srcptr)); +void mpf_sqrt _PROTO ((mpf_ptr, mpf_srcptr)); +void mpf_sqrt_ui _PROTO ((mpf_ptr, unsigned long int)); +void mpf_sub _PROTO ((mpf_ptr, mpf_srcptr, mpf_srcptr)); +void mpf_sub_ui _PROTO ((mpf_ptr, mpf_srcptr, unsigned long int)); +void mpf_ui_div _PROTO ((mpf_ptr, unsigned long int, mpf_srcptr)); +void mpf_ui_sub _PROTO ((mpf_ptr, unsigned long int, mpf_srcptr)); +#if defined (__cplusplus) +} +#endif +/************ Low level positive-integer (i.e. N) routines. ************/ + +/* This is ugly, but we need to make usr calls reach the prefixed function. */ +#define mpn_add __MPN(add) +#define mpn_add_1 __MPN(add_1) +#define mpn_add_n __MPN(add_n) +#define mpn_addmul_1 __MPN(addmul_1) +#define mpn_bdivmod __MPN(bdivmod) +#define mpn_cmp __MPN(cmp) +#define mpn_divmod_1 __MPN(divmod_1) +#define mpn_divrem __MPN(divrem) +#define mpn_divrem_1 __MPN(divrem_1) +#define mpn_dump __MPN(dump) +#define mpn_gcd __MPN(gcd) +#define mpn_gcd_1 __MPN(gcd_1) +#define mpn_gcdext __MPN(gcdext) +#define mpn_get_str __MPN(get_str) +#define mpn_hamdist __MPN(hamdist) +#define mpn_lshift __MPN(lshift) +#define mpn_mod_1 __MPN(mod_1) +#define mpn_mul __MPN(mul) +#define mpn_mul_1 __MPN(mul_1) +#define mpn_mul_n __MPN(mul_n) +#define mpn_perfect_square_p __MPN(perfect_square_p) +#define mpn_popcount __MPN(popcount) +#define mpn_preinv_mod_1 __MPN(preinv_mod_1) +#define mpn_random2 __MPN(random2) +#define mpn_rshift __MPN(rshift) +#define mpn_scan0 __MPN(scan0) +#define mpn_scan1 __MPN(scan1) +#define mpn_set_str __MPN(set_str) +#define mpn_sqrtrem __MPN(sqrtrem) +#define mpn_sub __MPN(sub) +#define mpn_sub_1 __MPN(sub_1) +#define mpn_sub_n __MPN(sub_n) +#define mpn_submul_1 __MPN(submul_1) +#define mpn_udiv_w_sdiv __MPN(udiv_w_sdiv) + +#if defined (__cplusplus) +extern "C" { +#endif +mp_limb_t mpn_add _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr,mp_size_t)); +mp_limb_t mpn_add_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); +mp_limb_t mpn_add_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); +mp_limb_t mpn_addmul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); +mp_limb_t mpn_bdivmod _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_srcptr, mp_size_t, unsigned long int)); +int mpn_cmp _PROTO ((mp_srcptr, mp_srcptr, mp_size_t)); +mp_limb_t mpn_divmod_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); +mp_limb_t mpn_divrem _PROTO ((mp_ptr, mp_size_t, mp_ptr, mp_size_t, mp_srcptr, mp_size_t)); +mp_limb_t mpn_divrem_1 _PROTO ((mp_ptr, mp_size_t, mp_srcptr, mp_size_t, mp_limb_t)); +void mpn_dump _PROTO ((mp_srcptr, mp_size_t)); +mp_size_t mpn_gcd _PROTO ((mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t)); +mp_limb_t mpn_gcd_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb_t)); +mp_size_t mpn_gcdext _PROTO ((mp_ptr, mp_ptr, mp_ptr, mp_size_t, mp_ptr, mp_size_t)); +size_t mpn_get_str _PROTO ((unsigned char *, int, mp_ptr, mp_size_t)); +unsigned long int mpn_hamdist _PROTO ((mp_srcptr, mp_srcptr, mp_size_t)); +mp_limb_t mpn_lshift _PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int)); +mp_limb_t mpn_mod_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb_t)); +mp_limb_t mpn_mul _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr, mp_size_t)); +mp_limb_t mpn_mul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); +void mpn_mul_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); +int mpn_perfect_square_p _PROTO ((mp_srcptr, mp_size_t)); +unsigned long int mpn_popcount _PROTO ((mp_srcptr, mp_size_t)); +mp_limb_t mpn_preinv_mod_1 _PROTO ((mp_srcptr, mp_size_t, mp_limb_t, mp_limb_t)); +void mpn_random2 _PROTO ((mp_ptr, mp_size_t)); +mp_limb_t mpn_rshift _PROTO ((mp_ptr, mp_srcptr, mp_size_t, unsigned int)); +unsigned long int mpn_scan0 _PROTO ((mp_srcptr, unsigned long int)); +unsigned long int mpn_scan1 _PROTO ((mp_srcptr, unsigned long int)); +mp_size_t mpn_set_str _PROTO ((mp_ptr, const unsigned char *, size_t, int)); +mp_size_t mpn_sqrtrem _PROTO ((mp_ptr, mp_ptr, mp_srcptr, mp_size_t)); +mp_limb_t mpn_sub _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_srcptr,mp_size_t)); +mp_limb_t mpn_sub_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); +mp_limb_t mpn_sub_n _PROTO ((mp_ptr, mp_srcptr, mp_srcptr, mp_size_t)); +mp_limb_t mpn_submul_1 _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t)); +#if defined (__cplusplus) +} +#endif + +#if defined (__GNUC__) || defined (_FORCE_INLINES) +_EXTERN_INLINE mp_limb_t +#if defined (__STDC__) || defined (__cplusplus) +mpn_add_1 (register mp_ptr res_ptr, + register mp_srcptr s1_ptr, + register mp_size_t s1_size, + register mp_limb_t s2_limb) +#else +mpn_add_1 (res_ptr, s1_ptr, s1_size, s2_limb) + register mp_ptr res_ptr; + register mp_srcptr s1_ptr; + register mp_size_t s1_size; + register mp_limb_t s2_limb; +#endif +{ + register mp_limb_t x; + + x = *s1_ptr++; + s2_limb = x + s2_limb; + *res_ptr++ = s2_limb; + if (s2_limb < x) + { + while (--s1_size != 0) + { + x = *s1_ptr++ + 1; + *res_ptr++ = x; + if (x != 0) + goto fin; + } + + return 1; + } + + fin: + if (res_ptr != s1_ptr) + { + mp_size_t i; + for (i = 0; i < s1_size - 1; i++) + res_ptr[i] = s1_ptr[i]; + } + return 0; +} + +_EXTERN_INLINE mp_limb_t +#if defined (__STDC__) || defined (__cplusplus) +mpn_add (register mp_ptr res_ptr, + register mp_srcptr s1_ptr, + register mp_size_t s1_size, + register mp_srcptr s2_ptr, + register mp_size_t s2_size) +#else +mpn_add (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size) + register mp_ptr res_ptr; + register mp_srcptr s1_ptr; + register mp_size_t s1_size; + register mp_srcptr s2_ptr; + register mp_size_t s2_size; +#endif +{ + mp_limb_t cy_limb = 0; + + if (s2_size != 0) + cy_limb = mpn_add_n (res_ptr, s1_ptr, s2_ptr, s2_size); + + if (s1_size - s2_size != 0) + cy_limb = mpn_add_1 (res_ptr + s2_size, + s1_ptr + s2_size, + s1_size - s2_size, + cy_limb); + return cy_limb; +} + +_EXTERN_INLINE mp_limb_t +#if defined (__STDC__) || defined (__cplusplus) +mpn_sub_1 (register mp_ptr res_ptr, + register mp_srcptr s1_ptr, + register mp_size_t s1_size, + register mp_limb_t s2_limb) +#else +mpn_sub_1 (res_ptr, s1_ptr, s1_size, s2_limb) + register mp_ptr res_ptr; + register mp_srcptr s1_ptr; + register mp_size_t s1_size; + register mp_limb_t s2_limb; +#endif +{ + register mp_limb_t x; + + x = *s1_ptr++; + s2_limb = x - s2_limb; + *res_ptr++ = s2_limb; + if (s2_limb > x) + { + while (--s1_size != 0) + { + x = *s1_ptr++; + *res_ptr++ = x - 1; + if (x != 0) + goto fin; + } + + return 1; + } + + fin: + if (res_ptr != s1_ptr) + { + mp_size_t i; + for (i = 0; i < s1_size - 1; i++) + res_ptr[i] = s1_ptr[i]; + } + return 0; +} + +_EXTERN_INLINE mp_limb_t +#if defined (__STDC__) || defined (__cplusplus) +mpn_sub (register mp_ptr res_ptr, + register mp_srcptr s1_ptr, + register mp_size_t s1_size, + register mp_srcptr s2_ptr, + register mp_size_t s2_size) +#else +mpn_sub (res_ptr, s1_ptr, s1_size, s2_ptr, s2_size) + register mp_ptr res_ptr; + register mp_srcptr s1_ptr; + register mp_size_t s1_size; + register mp_srcptr s2_ptr; + register mp_size_t s2_size; +#endif +{ + mp_limb_t cy_limb = 0; + + if (s2_size != 0) + cy_limb = mpn_sub_n (res_ptr, s1_ptr, s2_ptr, s2_size); + + if (s1_size - s2_size != 0) + cy_limb = mpn_sub_1 (res_ptr + s2_size, + s1_ptr + s2_size, + s1_size - s2_size, + cy_limb); + return cy_limb; +} +#endif /* __GNUC__ */ + +/* Allow faster testing for negative, zero, and positive. */ +#define mpz_sgn(Z) ((Z)->_mp_size < 0 ? -1 : (Z)->_mp_size > 0) +#define mpf_sgn(F) ((F)->_mp_size < 0 ? -1 : (F)->_mp_size > 0) +#define mpq_sgn(Q) ((Q)->_mp_num._mp_size < 0 ? -1 : (Q)->_mp_num._mp_size > 0) + +/* Allow direct user access to numerator and denominator of a mpq_t object. */ +#define mpq_numref(Q) (&((Q)->_mp_num)) +#define mpq_denref(Q) (&((Q)->_mp_den)) + +/* When using GCC, optimize certain common comparisons. */ +#if defined (__GNUC__) +#define mpz_cmp_ui(Z,UI) \ + (__builtin_constant_p (UI) && (UI) == 0 \ + ? mpz_sgn (Z) : mpz_cmp_ui (Z,UI)) +#define mpz_cmp_si(Z,UI) \ + (__builtin_constant_p (UI) && (UI) == 0 ? mpz_sgn (Z) \ + : __builtin_constant_p (UI) && (UI) > 0 ? mpz_cmp_ui (Z,UI) \ + : mpz_cmp_si (Z,UI)) +#define mpq_cmp_ui(Q,NUI,DUI) \ + (__builtin_constant_p (NUI) && (NUI) == 0 \ + ? mpq_sgn (Q) : mpq_cmp_ui (Q,NUI,DUI)) +#endif + +#define mpn_divmod(qp,np,nsize,dp,dsize) mpn_divrem (qp,0,np,nsize,dp,dsize) +#if 0 +#define mpn_divmod_1(qp,np,nsize,dlimb) mpn_divrem_1 (qp,0,np,nsize,dlimb) +#endif + +/* Compatibility with GMP 1. */ +#define mpz_mdiv mpz_fdiv_q +#define mpz_mdivmod mpz_fdiv_qr +#define mpz_mmod mpz_fdiv_r +#define mpz_mdiv_ui mpz_fdiv_q_ui +#define mpz_mdivmod_ui(q,r,n,d) \ + ((r == 0) ? mpz_fdiv_q_ui (q,n,d) : mpz_fdiv_qr_ui (q,r,n,d)) +#define mpz_mmod_ui(r,n,d) \ + ((r == 0) ? mpz_fdiv_ui (n,d) : mpz_fdiv_r_ui (r,n,d)) + +/* Useful synonyms, but not quite compatible with GMP 1. */ +#define mpz_div mpz_fdiv_q +#define mpz_divmod mpz_fdiv_qr +#define mpz_div_ui mpz_fdiv_q_ui +#define mpz_divmod_ui mpz_fdiv_qr_ui +#define mpz_mod_ui mpz_fdiv_r_ui +#define mpz_div_2exp mpz_fdiv_q_2exp +#define mpz_mod_2exp mpz_fdiv_r_2exp + +#define __GNU_MP_VERSION 2 +#define __GNU_MP_VERSION_MINOR 0 +#define __GMP_H__ +#endif /* __GMP_H__ */ diff --git a/REORG.TODO/stdlib/grouping.c b/REORG.TODO/stdlib/grouping.c new file mode 100644 index 0000000000..63ef4c1644 --- /dev/null +++ b/REORG.TODO/stdlib/grouping.c @@ -0,0 +1,201 @@ +/* Internal header for proving correct grouping in strings of numbers. + Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <limits.h> +#include <stddef.h> +#include <string.h> + +#ifndef MAX +#define MAX(a,b) ({ typeof(a) _a = (a); typeof(b) _b = (b); \ + _a > _b ? _a : _b; }) +#endif + +#ifdef USE_WIDE_CHAR +# include <wctype.h> +# define L_(Ch) L##Ch +# define UCHAR_TYPE wint_t +# define STRING_TYPE wchar_t +#else +# define L_(Ch) Ch +# define UCHAR_TYPE unsigned char +# define STRING_TYPE char +#endif + +#include "grouping.h" + +/* Find the maximum prefix of the string between BEGIN and END which + satisfies the grouping rules. It is assumed that at least one digit + follows BEGIN directly. */ + +const STRING_TYPE * +#ifdef USE_WIDE_CHAR +__correctly_grouped_prefixwc (const STRING_TYPE *begin, const STRING_TYPE *end, + wchar_t thousands, +#else +__correctly_grouped_prefixmb (const STRING_TYPE *begin, const STRING_TYPE *end, + const char *thousands, +#endif + const char *grouping) +{ +#ifndef USE_WIDE_CHAR + size_t thousands_len; + int cnt; +#endif + + if (grouping == NULL) + return end; + +#ifndef USE_WIDE_CHAR + thousands_len = strlen (thousands); +#endif + + while (end > begin) + { + const STRING_TYPE *cp = end - 1; + const char *gp = grouping; + + /* Check first group. */ + while (cp >= begin) + { +#ifdef USE_WIDE_CHAR + if (*cp == thousands) + break; +#else + if (cp[thousands_len - 1] == *thousands) + { + for (cnt = 1; thousands[cnt] != '\0'; ++cnt) + if (thousands[cnt] != cp[thousands_len - 1 - cnt]) + break; + if (thousands[cnt] == '\0') + break; + } +#endif + --cp; + } + + /* We allow the representation to contain no grouping at all even if + the locale specifies we can have grouping. */ + if (cp < begin) + return end; + + if (end - cp == (int) *gp + 1) + { + /* This group matches the specification. */ + + const STRING_TYPE *new_end; + + if (cp < begin) + /* There is just one complete group. We are done. */ + return end; + + /* CP points to a thousands separator character. The preceding + remainder of the string from BEGIN to NEW_END is the part we + will consider if there is a grouping error in this trailing + portion from CP to END. */ + new_end = cp - 1; + + /* Loop while the grouping is correct. */ + while (1) + { + /* Get the next grouping rule. */ + ++gp; + if (*gp == 0) + /* If end is reached use last rule. */ + --gp; + + /* Skip the thousands separator. */ + --cp; + + if (*gp == CHAR_MAX +#if CHAR_MIN < 0 + || *gp < 0 +#endif + ) + { + /* No more thousands separators are allowed to follow. */ + while (cp >= begin) + { +#ifdef USE_WIDE_CHAR + if (*cp == thousands) + break; +#else + for (cnt = 0; thousands[cnt] != '\0'; ++cnt) + if (thousands[cnt] != cp[thousands_len - cnt - 1]) + break; + if (thousands[cnt] == '\0') + break; +#endif + --cp; + } + + if (cp < begin) + /* OK, only digits followed. */ + return end; + } + else + { + /* Check the next group. */ + const STRING_TYPE *group_end = cp; + + while (cp >= begin) + { +#ifdef USE_WIDE_CHAR + if (*cp == thousands) + break; +#else + for (cnt = 0; thousands[cnt] != '\0'; ++cnt) + if (thousands[cnt] != cp[thousands_len - cnt - 1]) + break; + if (thousands[cnt] == '\0') + break; +#endif + --cp; + } + + if (cp < begin && group_end - cp <= (int) *gp) + /* Final group is correct. */ + return end; + + if (cp < begin || group_end - cp != (int) *gp) + /* Incorrect group. Punt. */ + break; + } + } + + /* The trailing portion of the string starting at NEW_END + contains a grouping error. So we will look for a correctly + grouped number in the preceding portion instead. */ + end = new_end; + } + else + { + /* Even the first group was wrong; determine maximum shift. */ + if (end - cp > (int) *gp + 1) + end = cp + (int) *gp + 1; + else if (cp < begin) + /* This number does not fill the first group, but is correct. */ + return end; + else + /* CP points to a thousands separator character. */ + end = cp; + } + } + + return MAX (begin, end); +} diff --git a/REORG.TODO/stdlib/grouping.h b/REORG.TODO/stdlib/grouping.h new file mode 100644 index 0000000000..d77b6e1105 --- /dev/null +++ b/REORG.TODO/stdlib/grouping.h @@ -0,0 +1,33 @@ +/* Internal header for proving correct grouping in strings of numbers. + Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* Find the maximum prefix of the string between BEGIN and END which + satisfies the grouping rules. It is assumed that at least one digit + follows BEGIN directly. */ +extern const wchar_t *__correctly_grouped_prefixwc (const wchar_t *begin, + const wchar_t *end, + wchar_t thousands, + const char *grouping) + attribute_hidden; + +extern const char *__correctly_grouped_prefixmb (const char *begin, + const char *end, + const char *thousands, + const char *grouping) + attribute_hidden; diff --git a/REORG.TODO/stdlib/groupingwc.c b/REORG.TODO/stdlib/groupingwc.c new file mode 100644 index 0000000000..cd9675ee58 --- /dev/null +++ b/REORG.TODO/stdlib/groupingwc.c @@ -0,0 +1,2 @@ +#define USE_WIDE_CHAR 1 +#include "grouping.c" diff --git a/REORG.TODO/stdlib/inlines.c b/REORG.TODO/stdlib/inlines.c new file mode 100644 index 0000000000..5f1065ea13 --- /dev/null +++ b/REORG.TODO/stdlib/inlines.c @@ -0,0 +1,3 @@ +#define _FORCE_INLINES +#define _EXTERN_INLINE /* empty */ +#include <gmp.h> diff --git a/REORG.TODO/stdlib/isomac.c b/REORG.TODO/stdlib/isomac.c new file mode 100644 index 0000000000..d12d1ff661 --- /dev/null +++ b/REORG.TODO/stdlib/isomac.c @@ -0,0 +1,447 @@ +/* Check system header files for ISO 9899:1990 (ISO C) compliance. + Copyright (C) 1996-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jens Schweikhardt <schweikh@noc.dfn.de>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* This is a simple minded program that tries to find illegal macro + definitions in system header files. Illegal macro definitions are + those not from the implementation namespace (i.e. not starting with + an underscore) or not matching any identifier mandated by The + Standard. Some common macro names are considered okay, e.g. all those + beginning with E (which may be defined in <errno.h>) or ending in + _MAX. See the arrays prefix[] and suffix[] below for details. + + In a compliant implementation no other macros can be defined, because + you could write strictly conforming programs that may fail to compile + due to syntax errors: suppose <stdio.h> defines PIPE_BUF, then the + conforming + + #include <assert.h> + #include <stdio.h> <- or where the bogus macro is defined + #include <string.h> + #define STR(x) #x + #define XSTR(x) STR(x) + int main (void) + { + int PIPE_BUF = 0; + assert (strcmp ("PIPE_BUF", XSTR (PIPE_BUF)) == 0); + return 0; + } + + is expected to compile and meet the assertion. If it does not, your + compiler compiles some other language than Standard C. + + REQUIREMENTS: + This program calls gcc to get the list of defined macros. If you + don't have gcc you're probably out of luck unless your compiler or + preprocessor has something similar to gcc's -dM option. Tune + PRINT_MACROS in this case. This program assumes headers are found + under /usr/include and that there is a writable /tmp directory. + Tune SYSTEM_INCLUDE if your system differs. + #define BROKEN_SYSTEM if system(NULL) bombs -- one more violation + of ISO C, by the way. + + OUTPUT: + Each header file name is printed, followed by illegal macro names + and their definition. For the above example, you would see + ... + /usr/include/stdio.h + #define PIPE_BUF 5120 + ... + If your implementation does not yet incorporate Amendment 1 you + will see messages about iso646.h, wctype.h and wchar.h not being + found. */ + +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +#include <ctype.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#define HEADER_MAX 256 + +static const char *macrofile; + +/* ISO C header names including Amendment 1 (without ".h" suffix). */ +static char *header[] = +{ + "assert", "ctype", "errno", "float", "iso646", "limits", "locale", + "math", "setjmp", "signal", "stdarg", "stddef", "stdio", "stdlib", + "string", "time", "wchar", "wctype" +}; + +/* Macros with these prefixes are considered okay. */ +static char *prefix[] = +{ + "_", "E", "is", "str", "mem", "SIG", "FLT_", "DBL_", "LDBL_", + "LC_", "wmem", "wcs" +}; + +/* Macros with these suffixes are considered okay. Will not work for + parametrized macros with arguments. */ +static char *suffix[] = +{ + "_MAX", "_MIN" +}; + +/* These macros are considered okay. In fact, these are just more prefixes. */ +static char *macros[] = +{ + "BUFSIZ", "CHAR_BIT", "CHAR_MAX", "CHAR_MIN", "CLOCKS_PER_SEC", + "DBL_DIG", "DBL_EPSILON", "DBL_MANT_DIG", "DBL_MAX", + "DBL_MAX_10_EXP", "DBL_MAX_EXP", "DBL_MIN", "DBL_MIN_10_EXP", + "DBL_MIN_EXP", "EDOM", "EILSEQ", "EOF", "ERANGE", "EXIT_FAILURE", + "EXIT_SUCCESS", "FILENAME_MAX", "FLT_DIG", "FLT_EPSILON", + "FLT_MANT_DIG", "FLT_MAX", "FLT_MAX_10_EXP", "FLT_MAX_EXP", + "FLT_MIN", "FLT_MIN_10_EXP", "FLT_MIN_EXP", "FLT_RADIX", + "FLT_ROUNDS", "FOPEN_MAX", "HUGE_VAL", "INT_MAX", "INT_MIN", + "LC_ALL", "LC_COLLATE", "LC_CTYPE", "LC_MONETARY", "LC_NUMERIC", + "LC_TIME", "LDBL_DIG", "LDBL_EPSILON", "LDBL_MANT_DIG", "LDBL_MAX", + "LDBL_MAX_10_EXP", "LDBL_MAX_EXP", "LDBL_MIN", "LDBL_MIN_10_EXP", + "LDBL_MIN_EXP", "LONG_MAX", "LONG_MIN", "L_tmpnam", "MB_CUR_MAX", + "MB_LEN_MAX", "NDEBUG", "NULL", "RAND_MAX", "SCHAR_MAX", + "SCHAR_MIN", "SEEK_CUR", "SEEK_END", "SEEK_SET", "SHRT_MAX", + "SHRT_MIN", "SIGABRT", "SIGFPE", "SIGILL", "SIGINT", "SIGSEGV", + "SIGTERM", "SIG_DFL", "SIG_ERR", "SIG_IGN", "TMP_MAX", "UCHAR_MAX", + "UINT_MAX", "ULONG_MAX", "USHRT_MAX", "WCHAR_MAX", "WCHAR_MIN", + "WEOF", "_IOFBF", "_IOLBF", "_IONBF", "abort", "abs", "acos", + "acosf", "acosl", "and", "and_eq", "asctime", "asin", "asinf", + "asinl", "assert", "atan", "atan2", "atan2f", "atan2l", "atanf", + "atanl", "atexit", "atof", "atoi", "atol", "bitand", "bitor", + "bsearch", "btowc", "calloc", "ceil", "ceilf", "ceill", "clearerr", + "clock", "clock_t", "compl", "cos", "cosf", "cosh", "coshf", + "coshl", "cosl", "ctime", "difftime", "div", "div_t", "errno", + "exit", "exp", "expf", "expl", "fabs", "fabsf", "fabsl", "fclose", + "feof", "ferror", "fflush", "fgetc", "fgetpos", "fgets", "fgetwc", + "fgetws", "floor", "floorf", "floorl", "fmod", "fmodf", "fmodl", + "fopen", "fprintf", "fputc", "fputs", "fputwc", "fputws", "fread", + "free", "freopen", "frexp", "frexpf", "frexpl", "fscanf", "fseek", + "fsetpos", "ftell", "fwide", "fwprintf", "fwrite", "fwscanf", + "getc", "getchar", "getenv", "gets", "getwc", "getwchar", "gmtime", + "isalnum", "isalpha", "iscntrl", "isdigit", "isgraph", "islower", + "isprint", "ispunct", "isspace", "isupper", "iswalnum", "iswalpha", + "iswcntrl", "iswctype", "iswdigit", "iswgraph", "iswlower", + "iswprint", "iswpunct", "iswspace", "iswupper", "iswxdigit", + "isxdigit", "labs", "ldexp", "ldexpf", "ldexpl", "ldiv", "ldiv_t", + "localeconv", "localtime", "log", "log10", "log10f", "log10l", + "logf", "logl", "longjmp", "malloc", "mblen", "mbrlen", "mbrtowc", + "mbsinit", "mbsrtowcs", "mbstate_t", "mbstowcs", "mbtowc", "memchr", + "memcmp", "memcpy", "memmove", "memset", "mktime", "modf", "modff", + "modfl", "not", "not_eq", "offsetof", "or", "or_eq", "perror", + "pow", "powf", "powl", "printf", "ptrdiff_t", "putc", "putchar", + "puts", "putwc", "putwchar", "qsort", "raise", "rand", "realloc", + "remove", "rename", "rewind", "scanf", "setbuf", "setjmp", + "setlocale", "setvbuf", "sig_atomic_t", "signal", "sin", "sinf", + "sinh", "sinhf", "sinhl", "sinl", "size_t", "sprintf", "sqrt", + "sqrtf", "sqrtl", "srand", "sscanf", "stderr", "stdin", "stdout", + "strcat", "strchr", "strcmp", "strcoll", "strcpy", "strcspn", + "strerror", "strftime", "strlen", "strncat", "strncmp", "strncpy", + "strpbrk", "strrchr", "strspn", "strstr", "strtod", "strtok", + "strtol", "strtoul", "strxfrm", "swprintf", "swscanf", "system", + "tan", "tanf", "tanh", "tanhf", "tanhl", "tanl", "time", "time_t", + "tmpfile", "tmpnam", "tolower", "toupper", "towctrans", "towlower", + "towupper", "ungetc", "ungetwc", "va_arg", "va_copy", "va_end", "va_start", + "vfprintf", "vfwprintf", "vprintf", "vsprintf", "vswprintf", + "vwprintf", "wchar_t", "wcrtomb", "wcscat", "wcschr", "wcscmp", + "wcscoll", "wcscpy", "wcscspn", "wcsftime", "wcslen", "wcsncat", + "wcsncmp", "wcsncpy", "wcspbrk", "wcsrchr", "wcsrtombs", "wcsspn", + "wcsstr", "wcstod", "wcstok", "wcstol", "wcstombs", "wcstoul", + "wcsxfrm", "wctob", "wctomb", "wctrans", "wctrans_t", "wctype", + "wctype_t", "wint_t", "wmemchr", "wmemcmp", "wmemcpy", "wmemmove", + "wmemset", "wprintf", "wscanf", "xor", "xor_eq" +}; + +#define NUMBER_OF_HEADERS (sizeof header / sizeof *header) +#define NUMBER_OF_PREFIXES (sizeof prefix / sizeof *prefix) +#define NUMBER_OF_SUFFIXES (sizeof suffix / sizeof *suffix) +#define NUMBER_OF_MACROS (sizeof macros / sizeof *macros) + + +/* Format string to build command to invoke compiler. */ +static const char fmt[] = "\ +echo \"#include <%s>\" |\ +%s -E -dM -ansi -pedantic %s -D_LIBC -D_ISOMAC \ +-DIN_MODULE=MODULE_extramodules -I. \ +-isystem `%s --print-prog-name=include` - 2> /dev/null > %s"; + + +/* The compiler we use (given on the command line). */ +char *CC; +/* The -I parameters for CC to find all headers. */ +char *INC; + +static char *xstrndup (const char *, size_t); +static const char **get_null_defines (void); +static int check_header (const char *, const char **); + +int +main (int argc, char *argv[]) +{ + int h; + int result = 0; + const char **ignore_list; + + CC = argc > 1 ? argv[1] : "gcc"; + INC = argc > 2 ? argv[2] : ""; + + if (system (NULL) == 0) + { + puts ("Sorry, no command processor."); + return EXIT_FAILURE; + } + + /* First get list of symbols which are defined by the compiler. */ + ignore_list = get_null_defines (); + + fputs ("Tested files:\n", stdout); + + for (h = 0; h < NUMBER_OF_HEADERS; ++h) + { + char file_name[HEADER_MAX]; + sprintf (file_name, "%s.h", header[h]); + result |= check_header (file_name, ignore_list); + } + + /* The test suite should return errors but for now this is not + practical. Give a warning and ask the user to correct the bugs. */ + return result; +} + + +static char * +xstrndup (const char *s, size_t n) +{ + size_t len = n; + char *new = malloc (len + 1); + + if (new == NULL) + return NULL; + + new[len] = '\0'; + return memcpy (new, s, len); +} + + +static const char ** +get_null_defines (void) +{ + char line[BUFSIZ], *command; + char **result = NULL; + size_t result_len = 0; + size_t result_max = 0; + FILE *input; + int first = 1; + + macrofile = tmpnam (NULL); + + command = malloc (sizeof fmt + sizeof "/dev/null" + 2 * strlen (CC) + + strlen (INC) + strlen (macrofile)); + + if (command == NULL) + { + puts ("No more memory."); + exit (1); + } + + sprintf (command, fmt, "/dev/null", CC, INC, CC, macrofile); + + if (system (command)) + { + puts ("system() returned nonzero"); + free (command); + return NULL; + } + free (command); + input = fopen (macrofile, "r"); + + if (input == NULL) + { + printf ("Could not read %s: ", macrofile); + perror (NULL); + return NULL; + } + + while (fgets (line, sizeof line, input) != NULL) + { + int i, okay = 0; + size_t endmac; + char *start, *end; + if (strlen (line) < 9 || line[7] != ' ') + { /* "#define A" */ + printf ("Malformed input, expected '#define MACRO'\ngot '%s'\n", + line); + continue; + } + if (line[8] == '_') + /* It's a safe identifier. */ + continue; + if (result_len == result_max) + { + result_max += 10; + result = realloc (result, result_max * sizeof (char **)); + if (result == NULL) + { + puts ("No more memory."); + exit (1); + } + } + start = &line[8]; + for (end = start + 1; !isspace (*end) && *end != '\0'; ++end) + ; + result[result_len] = xstrndup (start, end - start); + + if (strcmp (result[result_len], "IN_MODULE") != 0) + { + if (first) + { + fputs ("The following identifiers will be ignored since the compiler defines them\nby default:\n", stdout); + first = 0; + } + puts (result[result_len]); + } + ++result_len; + } + if (result_len == result_max) + { + result_max += 1; + result = realloc (result, result_max * sizeof (char **)); + if (result == NULL) + { + puts ("No more memory."); + exit (1); + } + } + result[result_len] = NULL; + fclose (input); + remove (macrofile); + + return (const char **) result; +} + + +static int +check_header (const char *file_name, const char **except) +{ + char line[BUFSIZ], *command; + FILE *input; + int result = 0; + + command = malloc (sizeof fmt + strlen (file_name) + 2 * strlen (CC) + + strlen (INC) + strlen (macrofile)); + + if (command == NULL) + { + puts ("No more memory."); + exit (1); + } + + puts (file_name); + sprintf (command, fmt, file_name, CC, INC, CC, macrofile); + + if (system (command)) + { + puts ("system() returned nonzero"); + result = 1; + } + free (command); + input = fopen (macrofile, "r"); + + if (input == NULL) + { + printf ("Could not read %s: ", macrofile); + perror (NULL); + return 1; + } + + while (fgets (line, sizeof line, input) != NULL) + { + int i, okay = 0; + size_t endmac; + const char **cpp; + if (strlen (line) < 9 || line[7] != ' ') + { /* "#define A" */ + printf ("Malformed input, expected '#define MACRO'\ngot '%s'\n", + line); + result = 1; + continue; + } + for (i = 0; i < NUMBER_OF_PREFIXES; ++i) + { + if (!strncmp (line+8, prefix[i], strlen (prefix[i]))) { + ++okay; + break; + } + } + if (okay) + continue; + for (i = 0; i < NUMBER_OF_MACROS; ++i) + { + if (!strncmp (line + 8, macros[i], strlen (macros[i]))) + { + ++okay; + break; + } + } + if (okay) + continue; + /* Find next char after the macro identifier; this can be either + a space or an open parenthesis. */ + endmac = strcspn (line + 8, " ("); + if (line[8+endmac] == '\0') + { + printf ("malformed input, expected '#define MACRO VALUE'\n" + "got '%s'\n", line); + result = 1; + continue; + } + for (i = 0; i < NUMBER_OF_SUFFIXES; ++i) + { + size_t len = strlen (suffix[i]); + if (!strncmp (line + 8 + endmac - len, suffix[i], len)) + { + ++okay; + break; + } + } + if (okay) + continue; + if (except != NULL) + for (cpp = except; *cpp != NULL; ++cpp) + { + size_t len = strlen (*cpp); + if (!strncmp (line + 8, *cpp, len) && isspace (line[8 + len])) + { + ++okay; + break; + } + } + if (!okay) + { + fputs (line, stdout); + result = 2; + } + } + fclose (input); + remove (macrofile); + + return result; +} + +/* EOF */ diff --git a/REORG.TODO/stdlib/jrand48.c b/REORG.TODO/stdlib/jrand48.c new file mode 100644 index 0000000000..4a551ed1f3 --- /dev/null +++ b/REORG.TODO/stdlib/jrand48.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + + +long int +jrand48 (unsigned short int xsubi[3]) +{ + long int result; + + (void) __jrand48_r (xsubi, &__libc_drand48_data, &result); + + return result; +} diff --git a/REORG.TODO/stdlib/jrand48_r.c b/REORG.TODO/stdlib/jrand48_r.c new file mode 100644 index 0000000000..40e6a1cb2c --- /dev/null +++ b/REORG.TODO/stdlib/jrand48_r.c @@ -0,0 +1,34 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +int +__jrand48_r (unsigned short int xsubi[3], struct drand48_data *buffer, + long int *result) +{ + /* Compute next state. */ + if (__drand48_iterate (xsubi, buffer) < 0) + return -1; + + /* Store the result. */ + *result = (int32_t) ((xsubi[2] << 16) | xsubi[1]); + + return 0; +} +weak_alias (__jrand48_r, jrand48_r) diff --git a/REORG.TODO/stdlib/l64a.c b/REORG.TODO/stdlib/l64a.c new file mode 100644 index 0000000000..fc125844ce --- /dev/null +++ b/REORG.TODO/stdlib/l64a.c @@ -0,0 +1,56 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +/* Conversion table. */ +static const char conv_table[64] = +{ + '.', '/', '0', '1', '2', '3', '4', '5', + '6', '7', '8', '9', 'A', 'B', 'C', 'D', + 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', + 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', + 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', + 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', + 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', + 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' +}; + +char * +l64a (long int n) +{ + unsigned long int m = (unsigned long int) n; + static char result[7]; + int cnt; + + /* The standard says that only 32 bits are used. */ + m &= 0xffffffff; + + if (m == 0ul) + /* The value for N == 0 is defined to be the empty string. */ + return (char *) ""; + + for (cnt = 0; m > 0ul; ++cnt) + { + result[cnt] = conv_table[m & 0x3f]; + m >>= 6; + } + result[cnt] = '\0'; + + return result; +} diff --git a/REORG.TODO/stdlib/labs.c b/REORG.TODO/stdlib/labs.c new file mode 100644 index 0000000000..506c4bb21e --- /dev/null +++ b/REORG.TODO/stdlib/labs.c @@ -0,0 +1,28 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +#undef labs + + +/* Return the absolute value of I. */ +long int +labs (long int i) +{ + return i < 0 ? -i : i; +} diff --git a/REORG.TODO/stdlib/lcong48.c b/REORG.TODO/stdlib/lcong48.c new file mode 100644 index 0000000000..b90ae1c5c2 --- /dev/null +++ b/REORG.TODO/stdlib/lcong48.c @@ -0,0 +1,26 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + + +void +lcong48 (unsigned short int param[7]) +{ + (void) __lcong48_r (param, &__libc_drand48_data); +} diff --git a/REORG.TODO/stdlib/lcong48_r.c b/REORG.TODO/stdlib/lcong48_r.c new file mode 100644 index 0000000000..d5228af8f5 --- /dev/null +++ b/REORG.TODO/stdlib/lcong48_r.c @@ -0,0 +1,36 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <limits.h> + +int +__lcong48_r (unsigned short int param[7], struct drand48_data *buffer) +{ + /* Store the given values. */ + memcpy (buffer->__x, ¶m[0], sizeof (buffer->__x)); + buffer->__a = ((uint64_t) param[5] << 32 | (uint32_t) param[4] << 16 + | param[3]); + buffer->__c = param[6]; + buffer->__init = 1; + + return 0; +} +weak_alias (__lcong48_r, lcong48_r) diff --git a/REORG.TODO/stdlib/ldbl2mpn.c b/REORG.TODO/stdlib/ldbl2mpn.c new file mode 100644 index 0000000000..450f9381cc --- /dev/null +++ b/REORG.TODO/stdlib/ldbl2mpn.c @@ -0,0 +1 @@ +/* Empty. Not needed unless ldbl support is in. */ diff --git a/REORG.TODO/stdlib/ldiv.c b/REORG.TODO/stdlib/ldiv.c new file mode 100644 index 0000000000..3951eb05f0 --- /dev/null +++ b/REORG.TODO/stdlib/ldiv.c @@ -0,0 +1,31 @@ +/* Copyright (C) 1992-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + + +/* Return the `ldiv_t' representation of NUMER over DENOM. */ +ldiv_t +ldiv (long int numer, long int denom) +{ + ldiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + return result; +} diff --git a/REORG.TODO/stdlib/llabs.c b/REORG.TODO/stdlib/llabs.c new file mode 100644 index 0000000000..39d0561c0d --- /dev/null +++ b/REORG.TODO/stdlib/llabs.c @@ -0,0 +1,29 @@ +/* `long long int' absolute value. + Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +#undef llabs + + +/* Return the absolute value of I. */ +long long int +llabs (long long int i) +{ + return i < 0 ? -i : i; +} diff --git a/REORG.TODO/stdlib/lldiv.c b/REORG.TODO/stdlib/lldiv.c new file mode 100644 index 0000000000..7109f35063 --- /dev/null +++ b/REORG.TODO/stdlib/lldiv.c @@ -0,0 +1,32 @@ +/* `long long int' divison with remainder. + Copyright (C) 1992-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + + +/* Return the `lldiv_t' representation of NUMER over DENOM. */ +lldiv_t +lldiv (long long int numer, long long int denom) +{ + lldiv_t result; + + result.quot = numer / denom; + result.rem = numer % denom; + + return result; +} diff --git a/REORG.TODO/stdlib/longlong.h b/REORG.TODO/stdlib/longlong.h new file mode 100644 index 0000000000..0ec11c5056 --- /dev/null +++ b/REORG.TODO/stdlib/longlong.h @@ -0,0 +1,1773 @@ +/* longlong.h -- definitions for mixed size 32/64 bit arithmetic. + Copyright (C) 1991-2017 Free Software Foundation, Inc. + + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file into + combinations with other programs, and to distribute those + combinations without any restriction coming from the use of this + file. (The Lesser General Public License restrictions do apply in + other respects; for example, they cover modification of the file, + and distribution when not linked into a combine executable.) + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* You have to define the following before including this file: + + UWtype -- An unsigned type, default type for operations (typically a "word") + UHWtype -- An unsigned type, at least half the size of UWtype. + UDWtype -- An unsigned type, at least twice as large a UWtype + W_TYPE_SIZE -- size in bits of UWtype + + UQItype -- Unsigned 8 bit type. + SItype, USItype -- Signed and unsigned 32 bit types. + DItype, UDItype -- Signed and unsigned 64 bit types. + + On a 32 bit machine UWtype should typically be USItype; + on a 64 bit machine, UWtype should typically be UDItype. */ + +#define __BITS4 (W_TYPE_SIZE / 4) +#define __ll_B ((UWtype) 1 << (W_TYPE_SIZE / 2)) +#define __ll_lowpart(t) ((UWtype) (t) & (__ll_B - 1)) +#define __ll_highpart(t) ((UWtype) (t) >> (W_TYPE_SIZE / 2)) + +#ifndef W_TYPE_SIZE +#define W_TYPE_SIZE 32 +#define UWtype USItype +#define UHWtype USItype +#define UDWtype UDItype +#endif + +/* Used in glibc only. */ +#ifndef attribute_hidden +#define attribute_hidden +#endif + +extern const UQItype __clz_tab[256] attribute_hidden; + +/* Define auxiliary asm macros. + + 1) umul_ppmm(high_prod, low_prod, multiplier, multiplicand) multiplies two + UWtype integers MULTIPLIER and MULTIPLICAND, and generates a two UWtype + word product in HIGH_PROD and LOW_PROD. + + 2) __umulsidi3(a,b) multiplies two UWtype integers A and B, and returns a + UDWtype product. This is just a variant of umul_ppmm. + + 3) udiv_qrnnd(quotient, remainder, high_numerator, low_numerator, + denominator) divides a UDWtype, composed by the UWtype integers + HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and places the quotient + in QUOTIENT and the remainder in REMAINDER. HIGH_NUMERATOR must be less + than DENOMINATOR for correct operation. If, in addition, the most + significant bit of DENOMINATOR must be 1, then the pre-processor symbol + UDIV_NEEDS_NORMALIZATION is defined to 1. + + 4) sdiv_qrnnd(quotient, remainder, high_numerator, low_numerator, + denominator). Like udiv_qrnnd but the numbers are signed. The quotient + is rounded towards 0. + + 5) count_leading_zeros(count, x) counts the number of zero-bits from the + msb to the first nonzero bit in the UWtype X. This is the number of + steps X needs to be shifted left to set the msb. Undefined for X == 0, + unless the symbol COUNT_LEADING_ZEROS_0 is defined to some value. + + 6) count_trailing_zeros(count, x) like count_leading_zeros, but counts + from the least significant end. + + 7) add_ssaaaa(high_sum, low_sum, high_addend_1, low_addend_1, + high_addend_2, low_addend_2) adds two UWtype integers, composed by + HIGH_ADDEND_1 and LOW_ADDEND_1, and HIGH_ADDEND_2 and LOW_ADDEND_2 + respectively. The result is placed in HIGH_SUM and LOW_SUM. Overflow + (i.e. carry out) is not stored anywhere, and is lost. + + 8) sub_ddmmss(high_difference, low_difference, high_minuend, low_minuend, + high_subtrahend, low_subtrahend) subtracts two two-word UWtype integers, + composed by HIGH_MINUEND_1 and LOW_MINUEND_1, and HIGH_SUBTRAHEND_2 and + LOW_SUBTRAHEND_2 respectively. The result is placed in HIGH_DIFFERENCE + and LOW_DIFFERENCE. Overflow (i.e. carry out) is not stored anywhere, + and is lost. + + If any of these macros are left undefined for a particular CPU, + C macros are used. */ + +/* The CPUs come in alphabetical order below. + + Please add support for more CPUs here, or improve the current support + for the CPUs below! + (E.g. WE32100, IBM360.) */ + +#if defined (__GNUC__) && !defined (NO_ASM) + +/* We sometimes need to clobber "cc" with gcc2, but that would not be + understood by gcc1. Use cpp to avoid major code duplication. */ +#if __GNUC__ < 2 +#define __CLOBBER_CC +#define __AND_CLOBBER_CC +#else /* __GNUC__ >= 2 */ +#define __CLOBBER_CC : "cc" +#define __AND_CLOBBER_CC , "cc" +#endif /* __GNUC__ < 2 */ + +#if defined (__aarch64__) + +#if W_TYPE_SIZE == 32 +#define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clz (X)) +#define count_trailing_zeros(COUNT, X) ((COUNT) = __builtin_ctz (X)) +#define COUNT_LEADING_ZEROS_0 32 +#endif /* W_TYPE_SIZE == 32 */ + +#if W_TYPE_SIZE == 64 +#define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clzll (X)) +#define count_trailing_zeros(COUNT, X) ((COUNT) = __builtin_ctzll (X)) +#define COUNT_LEADING_ZEROS_0 64 +#endif /* W_TYPE_SIZE == 64 */ + +#endif /* __aarch64__ */ + +#if defined (__alpha) && W_TYPE_SIZE == 64 +/* There is a bug in g++ before version 5 that + errors on __builtin_alpha_umulh. */ +#if !defined(__cplusplus) || __GNUC__ >= 5 +#define umul_ppmm(ph, pl, m0, m1) \ + do { \ + UDItype __m0 = (m0), __m1 = (m1); \ + (ph) = __builtin_alpha_umulh (__m0, __m1); \ + (pl) = __m0 * __m1; \ + } while (0) +#define UMUL_TIME 46 +#endif /* !c++ */ +#ifndef LONGLONG_STANDALONE +#define udiv_qrnnd(q, r, n1, n0, d) \ + do { UDItype __r; \ + (q) = __udiv_qrnnd (&__r, (n1), (n0), (d)); \ + (r) = __r; \ + } while (0) +extern UDItype __udiv_qrnnd (UDItype *, UDItype, UDItype, UDItype); +#define UDIV_TIME 220 +#endif /* LONGLONG_STANDALONE */ +#ifdef __alpha_cix__ +#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clzl (X)) +#define count_trailing_zeros(COUNT,X) ((COUNT) = __builtin_ctzl (X)) +#define COUNT_LEADING_ZEROS_0 64 +#else +#define count_leading_zeros(COUNT,X) \ + do { \ + UDItype __xr = (X), __t, __a; \ + __t = __builtin_alpha_cmpbge (0, __xr); \ + __a = __clz_tab[__t ^ 0xff] - 1; \ + __t = __builtin_alpha_extbl (__xr, __a); \ + (COUNT) = 64 - (__clz_tab[__t] + __a*8); \ + } while (0) +#define count_trailing_zeros(COUNT,X) \ + do { \ + UDItype __xr = (X), __t, __a; \ + __t = __builtin_alpha_cmpbge (0, __xr); \ + __t = ~__t & -~__t; \ + __a = ((__t & 0xCC) != 0) * 2; \ + __a += ((__t & 0xF0) != 0) * 4; \ + __a += ((__t & 0xAA) != 0); \ + __t = __builtin_alpha_extbl (__xr, __a); \ + __a <<= 3; \ + __t &= -__t; \ + __a += ((__t & 0xCC) != 0) * 2; \ + __a += ((__t & 0xF0) != 0) * 4; \ + __a += ((__t & 0xAA) != 0); \ + (COUNT) = __a; \ + } while (0) +#endif /* __alpha_cix__ */ +#endif /* __alpha */ + +#if defined (__arc__) && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("add.f %1, %4, %5\n\tadc %0, %2, %3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%r" ((USItype) (ah)), \ + "rIJ" ((USItype) (bh)), \ + "%r" ((USItype) (al)), \ + "rIJ" ((USItype) (bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("sub.f %1, %4, %5\n\tsbc %0, %2, %3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "r" ((USItype) (ah)), \ + "rIJ" ((USItype) (bh)), \ + "r" ((USItype) (al)), \ + "rIJ" ((USItype) (bl))) + +#define __umulsidi3(u,v) ((UDItype)(USItype)u*(USItype)v) +#ifdef __ARC_NORM__ +#define count_leading_zeros(count, x) \ + do \ + { \ + SItype c_; \ + \ + __asm__ ("norm.f\t%0,%1\n\tmov.mi\t%0,-1" : "=r" (c_) : "r" (x) : "cc");\ + (count) = c_ + 1; \ + } \ + while (0) +#define COUNT_LEADING_ZEROS_0 32 +#endif +#endif + +#if defined (__arm__) && (defined (__thumb2__) || !defined (__thumb__)) \ + && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("adds %1, %4, %5\n\tadc %0, %2, %3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%r" ((USItype) (ah)), \ + "rI" ((USItype) (bh)), \ + "%r" ((USItype) (al)), \ + "rI" ((USItype) (bl)) __CLOBBER_CC) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("subs %1, %4, %5\n\tsbc %0, %2, %3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "r" ((USItype) (ah)), \ + "rI" ((USItype) (bh)), \ + "r" ((USItype) (al)), \ + "rI" ((USItype) (bl)) __CLOBBER_CC) +# if defined(__ARM_ARCH_2__) || defined(__ARM_ARCH_2A__) \ + || defined(__ARM_ARCH_3__) +# define umul_ppmm(xh, xl, a, b) \ + do { \ + register USItype __t0, __t1, __t2; \ + __asm__ ("%@ Inlined umul_ppmm\n" \ + " mov %2, %5, lsr #16\n" \ + " mov %0, %6, lsr #16\n" \ + " bic %3, %5, %2, lsl #16\n" \ + " bic %4, %6, %0, lsl #16\n" \ + " mul %1, %3, %4\n" \ + " mul %4, %2, %4\n" \ + " mul %3, %0, %3\n" \ + " mul %0, %2, %0\n" \ + " adds %3, %4, %3\n" \ + " addcs %0, %0, #65536\n" \ + " adds %1, %1, %3, lsl #16\n" \ + " adc %0, %0, %3, lsr #16" \ + : "=&r" ((USItype) (xh)), \ + "=r" ((USItype) (xl)), \ + "=&r" (__t0), "=&r" (__t1), "=r" (__t2) \ + : "r" ((USItype) (a)), \ + "r" ((USItype) (b)) __CLOBBER_CC ); \ + } while (0) +# define UMUL_TIME 20 +# else +# define umul_ppmm(xh, xl, a, b) \ + do { \ + /* Generate umull, under compiler control. */ \ + register UDItype __t0 = (UDItype)(USItype)(a) * (USItype)(b); \ + (xl) = (USItype)__t0; \ + (xh) = (USItype)(__t0 >> 32); \ + } while (0) +# define UMUL_TIME 3 +# endif +# define UDIV_TIME 100 +#endif /* __arm__ */ + +#if defined(__arm__) +/* Let gcc decide how best to implement count_leading_zeros. */ +#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clz (X)) +#define count_trailing_zeros(COUNT,X) ((COUNT) = __builtin_ctz (X)) +#define COUNT_LEADING_ZEROS_0 32 +#endif + +#if defined (__AVR__) + +#if W_TYPE_SIZE == 16 +#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clz (X)) +#define count_trailing_zeros(COUNT,X) ((COUNT) = __builtin_ctz (X)) +#define COUNT_LEADING_ZEROS_0 16 +#endif /* W_TYPE_SIZE == 16 */ + +#if W_TYPE_SIZE == 32 +#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clzl (X)) +#define count_trailing_zeros(COUNT,X) ((COUNT) = __builtin_ctzl (X)) +#define COUNT_LEADING_ZEROS_0 32 +#endif /* W_TYPE_SIZE == 32 */ + +#if W_TYPE_SIZE == 64 +#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clzll (X)) +#define count_trailing_zeros(COUNT,X) ((COUNT) = __builtin_ctzll (X)) +#define COUNT_LEADING_ZEROS_0 64 +#endif /* W_TYPE_SIZE == 64 */ + +#endif /* defined (__AVR__) */ + +#if defined (__CRIS__) + +#if __CRIS_arch_version >= 3 +#define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clz (X)) +#define COUNT_LEADING_ZEROS_0 32 +#endif /* __CRIS_arch_version >= 3 */ + +#if __CRIS_arch_version >= 8 +#define count_trailing_zeros(COUNT, X) ((COUNT) = __builtin_ctz (X)) +#endif /* __CRIS_arch_version >= 8 */ + +#if __CRIS_arch_version >= 10 +#define __umulsidi3(u,v) ((UDItype)(USItype) (u) * (UDItype)(USItype) (v)) +#else +#define __umulsidi3 __umulsidi3 +extern UDItype __umulsidi3 (USItype, USItype); +#endif /* __CRIS_arch_version >= 10 */ + +#define umul_ppmm(w1, w0, u, v) \ + do { \ + UDItype __x = __umulsidi3 (u, v); \ + (w0) = (USItype) (__x); \ + (w1) = (USItype) (__x >> 32); \ + } while (0) + +/* FIXME: defining add_ssaaaa and sub_ddmmss should be advantageous for + DFmode ("double" intrinsics, avoiding two of the three insns handling + carry), but defining them as open-code C composing and doing the + operation in DImode (UDImode) shows that the DImode needs work: + register pressure from requiring neighboring registers and the + traffic to and from them come to dominate, in the 4.7 series. */ + +#endif /* defined (__CRIS__) */ + +#if defined (__hppa) && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("add %4,%5,%1\n\taddc %2,%3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%rM" ((USItype) (ah)), \ + "rM" ((USItype) (bh)), \ + "%rM" ((USItype) (al)), \ + "rM" ((USItype) (bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("sub %4,%5,%1\n\tsubb %2,%3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "rM" ((USItype) (ah)), \ + "rM" ((USItype) (bh)), \ + "rM" ((USItype) (al)), \ + "rM" ((USItype) (bl))) +#if defined (_PA_RISC1_1) +#define umul_ppmm(w1, w0, u, v) \ + do { \ + union \ + { \ + UDItype __f; \ + struct {USItype __w1, __w0;} __w1w0; \ + } __t; \ + __asm__ ("xmpyu %1,%2,%0" \ + : "=x" (__t.__f) \ + : "x" ((USItype) (u)), \ + "x" ((USItype) (v))); \ + (w1) = __t.__w1w0.__w1; \ + (w0) = __t.__w1w0.__w0; \ + } while (0) +#define UMUL_TIME 8 +#else +#define UMUL_TIME 30 +#endif +#define UDIV_TIME 40 +#define count_leading_zeros(count, x) \ + do { \ + USItype __tmp; \ + __asm__ ( \ + "ldi 1,%0\n" \ +" extru,= %1,15,16,%%r0 ; Bits 31..16 zero?\n" \ +" extru,tr %1,15,16,%1 ; No. Shift down, skip add.\n"\ +" ldo 16(%0),%0 ; Yes. Perform add.\n" \ +" extru,= %1,23,8,%%r0 ; Bits 15..8 zero?\n" \ +" extru,tr %1,23,8,%1 ; No. Shift down, skip add.\n"\ +" ldo 8(%0),%0 ; Yes. Perform add.\n" \ +" extru,= %1,27,4,%%r0 ; Bits 7..4 zero?\n" \ +" extru,tr %1,27,4,%1 ; No. Shift down, skip add.\n"\ +" ldo 4(%0),%0 ; Yes. Perform add.\n" \ +" extru,= %1,29,2,%%r0 ; Bits 3..2 zero?\n" \ +" extru,tr %1,29,2,%1 ; No. Shift down, skip add.\n"\ +" ldo 2(%0),%0 ; Yes. Perform add.\n" \ +" extru %1,30,1,%1 ; Extract bit 1.\n" \ +" sub %0,%1,%0 ; Subtract it.\n" \ + : "=r" (count), "=r" (__tmp) : "1" (x)); \ + } while (0) +#endif + +#if (defined (__i370__) || defined (__s390__) || defined (__mvs__)) && W_TYPE_SIZE == 32 +#if !defined (__zarch__) +#define smul_ppmm(xh, xl, m0, m1) \ + do { \ + union {DItype __ll; \ + struct {USItype __h, __l;} __i; \ + } __x; \ + __asm__ ("lr %N0,%1\n\tmr %0,%2" \ + : "=&r" (__x.__ll) \ + : "r" (m0), "r" (m1)); \ + (xh) = __x.__i.__h; (xl) = __x.__i.__l; \ + } while (0) +#define sdiv_qrnnd(q, r, n1, n0, d) \ + do { \ + union {DItype __ll; \ + struct {USItype __h, __l;} __i; \ + } __x; \ + __x.__i.__h = n1; __x.__i.__l = n0; \ + __asm__ ("dr %0,%2" \ + : "=r" (__x.__ll) \ + : "0" (__x.__ll), "r" (d)); \ + (q) = __x.__i.__l; (r) = __x.__i.__h; \ + } while (0) +#else +#define smul_ppmm(xh, xl, m0, m1) \ + do { \ + register SItype __r0 __asm__ ("0"); \ + register SItype __r1 __asm__ ("1") = (m0); \ + \ + __asm__ ("mr\t%%r0,%3" \ + : "=r" (__r0), "=r" (__r1) \ + : "r" (__r1), "r" (m1)); \ + (xh) = __r0; (xl) = __r1; \ + } while (0) + +#define sdiv_qrnnd(q, r, n1, n0, d) \ + do { \ + register SItype __r0 __asm__ ("0") = (n1); \ + register SItype __r1 __asm__ ("1") = (n0); \ + \ + __asm__ ("dr\t%%r0,%4" \ + : "=r" (__r0), "=r" (__r1) \ + : "r" (__r0), "r" (__r1), "r" (d)); \ + (q) = __r1; (r) = __r0; \ + } while (0) +#endif /* __zarch__ */ +#endif + +#if (defined (__i386__) || defined (__i486__)) && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("add{l} {%5,%1|%1,%5}\n\tadc{l} {%3,%0|%0,%3}" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%0" ((USItype) (ah)), \ + "g" ((USItype) (bh)), \ + "%1" ((USItype) (al)), \ + "g" ((USItype) (bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("sub{l} {%5,%1|%1,%5}\n\tsbb{l} {%3,%0|%0,%3}" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ + "g" ((USItype) (bh)), \ + "1" ((USItype) (al)), \ + "g" ((USItype) (bl))) +#define umul_ppmm(w1, w0, u, v) \ + __asm__ ("mul{l} %3" \ + : "=a" ((USItype) (w0)), \ + "=d" ((USItype) (w1)) \ + : "%0" ((USItype) (u)), \ + "rm" ((USItype) (v))) +#define udiv_qrnnd(q, r, n1, n0, dv) \ + __asm__ ("div{l} %4" \ + : "=a" ((USItype) (q)), \ + "=d" ((USItype) (r)) \ + : "0" ((USItype) (n0)), \ + "1" ((USItype) (n1)), \ + "rm" ((USItype) (dv))) +#define count_leading_zeros(count, x) ((count) = __builtin_clz (x)) +#define count_trailing_zeros(count, x) ((count) = __builtin_ctz (x)) +#define UMUL_TIME 40 +#define UDIV_TIME 40 +#endif /* 80x86 */ + +#if defined (__x86_64__) && W_TYPE_SIZE == 64 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("add{q} {%5,%1|%1,%5}\n\tadc{q} {%3,%0|%0,%3}" \ + : "=r" ((UDItype) (sh)), \ + "=&r" ((UDItype) (sl)) \ + : "%0" ((UDItype) (ah)), \ + "rme" ((UDItype) (bh)), \ + "%1" ((UDItype) (al)), \ + "rme" ((UDItype) (bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("sub{q} {%5,%1|%1,%5}\n\tsbb{q} {%3,%0|%0,%3}" \ + : "=r" ((UDItype) (sh)), \ + "=&r" ((UDItype) (sl)) \ + : "0" ((UDItype) (ah)), \ + "rme" ((UDItype) (bh)), \ + "1" ((UDItype) (al)), \ + "rme" ((UDItype) (bl))) +#define umul_ppmm(w1, w0, u, v) \ + __asm__ ("mul{q} %3" \ + : "=a" ((UDItype) (w0)), \ + "=d" ((UDItype) (w1)) \ + : "%0" ((UDItype) (u)), \ + "rm" ((UDItype) (v))) +#define udiv_qrnnd(q, r, n1, n0, dv) \ + __asm__ ("div{q} %4" \ + : "=a" ((UDItype) (q)), \ + "=d" ((UDItype) (r)) \ + : "0" ((UDItype) (n0)), \ + "1" ((UDItype) (n1)), \ + "rm" ((UDItype) (dv))) +#define count_leading_zeros(count, x) ((count) = __builtin_clzll (x)) +#define count_trailing_zeros(count, x) ((count) = __builtin_ctzll (x)) +#define UMUL_TIME 40 +#define UDIV_TIME 40 +#endif /* x86_64 */ + +#if defined (__i960__) && W_TYPE_SIZE == 32 +#define umul_ppmm(w1, w0, u, v) \ + ({union {UDItype __ll; \ + struct {USItype __l, __h;} __i; \ + } __xx; \ + __asm__ ("emul %2,%1,%0" \ + : "=d" (__xx.__ll) \ + : "%dI" ((USItype) (u)), \ + "dI" ((USItype) (v))); \ + (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;}) +#define __umulsidi3(u, v) \ + ({UDItype __w; \ + __asm__ ("emul %2,%1,%0" \ + : "=d" (__w) \ + : "%dI" ((USItype) (u)), \ + "dI" ((USItype) (v))); \ + __w; }) +#endif /* __i960__ */ + +#if defined (__ia64) && W_TYPE_SIZE == 64 +/* This form encourages gcc (pre-release 3.4 at least) to emit predicated + "sub r=r,r" and "sub r=r,r,1", giving a 2 cycle latency. The generic + code using "al<bl" arithmetically comes out making an actual 0 or 1 in a + register, which takes an extra cycle. */ +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + do { \ + UWtype __x; \ + __x = (al) - (bl); \ + if ((al) < (bl)) \ + (sh) = (ah) - (bh) - 1; \ + else \ + (sh) = (ah) - (bh); \ + (sl) = __x; \ + } while (0) + +/* Do both product parts in assembly, since that gives better code with + all gcc versions. Some callers will just use the upper part, and in + that situation we waste an instruction, but not any cycles. */ +#define umul_ppmm(ph, pl, m0, m1) \ + __asm__ ("xma.hu %0 = %2, %3, f0\n\txma.l %1 = %2, %3, f0" \ + : "=&f" (ph), "=f" (pl) \ + : "f" (m0), "f" (m1)) +#define count_leading_zeros(count, x) \ + do { \ + UWtype _x = (x), _y, _a, _c; \ + __asm__ ("mux1 %0 = %1, @rev" : "=r" (_y) : "r" (_x)); \ + __asm__ ("czx1.l %0 = %1" : "=r" (_a) : "r" (-_y | _y)); \ + _c = (_a - 1) << 3; \ + _x >>= _c; \ + if (_x >= 1 << 4) \ + _x >>= 4, _c += 4; \ + if (_x >= 1 << 2) \ + _x >>= 2, _c += 2; \ + _c += _x >> 1; \ + (count) = W_TYPE_SIZE - 1 - _c; \ + } while (0) +/* similar to what gcc does for __builtin_ffs, but 0 based rather than 1 + based, and we don't need a special case for x==0 here */ +#define count_trailing_zeros(count, x) \ + do { \ + UWtype __ctz_x = (x); \ + __asm__ ("popcnt %0 = %1" \ + : "=r" (count) \ + : "r" ((__ctz_x-1) & ~__ctz_x)); \ + } while (0) +#define UMUL_TIME 14 +#endif + +#if defined (__M32R__) && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + /* The cmp clears the condition bit. */ \ + __asm__ ("cmp %0,%0\n\taddx %1,%5\n\taddx %0,%3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ + "r" ((USItype) (bh)), \ + "1" ((USItype) (al)), \ + "r" ((USItype) (bl)) \ + : "cbit") +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + /* The cmp clears the condition bit. */ \ + __asm__ ("cmp %0,%0\n\tsubx %1,%5\n\tsubx %0,%3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ + "r" ((USItype) (bh)), \ + "1" ((USItype) (al)), \ + "r" ((USItype) (bl)) \ + : "cbit") +#endif /* __M32R__ */ + +#if defined (__mc68000__) && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("add%.l %5,%1\n\taddx%.l %3,%0" \ + : "=d" ((USItype) (sh)), \ + "=&d" ((USItype) (sl)) \ + : "%0" ((USItype) (ah)), \ + "d" ((USItype) (bh)), \ + "%1" ((USItype) (al)), \ + "g" ((USItype) (bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("sub%.l %5,%1\n\tsubx%.l %3,%0" \ + : "=d" ((USItype) (sh)), \ + "=&d" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ + "d" ((USItype) (bh)), \ + "1" ((USItype) (al)), \ + "g" ((USItype) (bl))) + +/* The '020, '030, '040, '060 and CPU32 have 32x32->64 and 64/32->32q-32r. */ +#if (defined (__mc68020__) && !defined (__mc68060__)) +#define umul_ppmm(w1, w0, u, v) \ + __asm__ ("mulu%.l %3,%1:%0" \ + : "=d" ((USItype) (w0)), \ + "=d" ((USItype) (w1)) \ + : "%0" ((USItype) (u)), \ + "dmi" ((USItype) (v))) +#define UMUL_TIME 45 +#define udiv_qrnnd(q, r, n1, n0, d) \ + __asm__ ("divu%.l %4,%1:%0" \ + : "=d" ((USItype) (q)), \ + "=d" ((USItype) (r)) \ + : "0" ((USItype) (n0)), \ + "1" ((USItype) (n1)), \ + "dmi" ((USItype) (d))) +#define UDIV_TIME 90 +#define sdiv_qrnnd(q, r, n1, n0, d) \ + __asm__ ("divs%.l %4,%1:%0" \ + : "=d" ((USItype) (q)), \ + "=d" ((USItype) (r)) \ + : "0" ((USItype) (n0)), \ + "1" ((USItype) (n1)), \ + "dmi" ((USItype) (d))) + +#elif defined (__mcoldfire__) /* not mc68020 */ + +#define umul_ppmm(xh, xl, a, b) \ + __asm__ ("| Inlined umul_ppmm\n" \ + " move%.l %2,%/d0\n" \ + " move%.l %3,%/d1\n" \ + " move%.l %/d0,%/d2\n" \ + " swap %/d0\n" \ + " move%.l %/d1,%/d3\n" \ + " swap %/d1\n" \ + " move%.w %/d2,%/d4\n" \ + " mulu %/d3,%/d4\n" \ + " mulu %/d1,%/d2\n" \ + " mulu %/d0,%/d3\n" \ + " mulu %/d0,%/d1\n" \ + " move%.l %/d4,%/d0\n" \ + " clr%.w %/d0\n" \ + " swap %/d0\n" \ + " add%.l %/d0,%/d2\n" \ + " add%.l %/d3,%/d2\n" \ + " jcc 1f\n" \ + " add%.l %#65536,%/d1\n" \ + "1: swap %/d2\n" \ + " moveq %#0,%/d0\n" \ + " move%.w %/d2,%/d0\n" \ + " move%.w %/d4,%/d2\n" \ + " move%.l %/d2,%1\n" \ + " add%.l %/d1,%/d0\n" \ + " move%.l %/d0,%0" \ + : "=g" ((USItype) (xh)), \ + "=g" ((USItype) (xl)) \ + : "g" ((USItype) (a)), \ + "g" ((USItype) (b)) \ + : "d0", "d1", "d2", "d3", "d4") +#define UMUL_TIME 100 +#define UDIV_TIME 400 +#else /* not ColdFire */ +/* %/ inserts REGISTER_PREFIX, %# inserts IMMEDIATE_PREFIX. */ +#define umul_ppmm(xh, xl, a, b) \ + __asm__ ("| Inlined umul_ppmm\n" \ + " move%.l %2,%/d0\n" \ + " move%.l %3,%/d1\n" \ + " move%.l %/d0,%/d2\n" \ + " swap %/d0\n" \ + " move%.l %/d1,%/d3\n" \ + " swap %/d1\n" \ + " move%.w %/d2,%/d4\n" \ + " mulu %/d3,%/d4\n" \ + " mulu %/d1,%/d2\n" \ + " mulu %/d0,%/d3\n" \ + " mulu %/d0,%/d1\n" \ + " move%.l %/d4,%/d0\n" \ + " eor%.w %/d0,%/d0\n" \ + " swap %/d0\n" \ + " add%.l %/d0,%/d2\n" \ + " add%.l %/d3,%/d2\n" \ + " jcc 1f\n" \ + " add%.l %#65536,%/d1\n" \ + "1: swap %/d2\n" \ + " moveq %#0,%/d0\n" \ + " move%.w %/d2,%/d0\n" \ + " move%.w %/d4,%/d2\n" \ + " move%.l %/d2,%1\n" \ + " add%.l %/d1,%/d0\n" \ + " move%.l %/d0,%0" \ + : "=g" ((USItype) (xh)), \ + "=g" ((USItype) (xl)) \ + : "g" ((USItype) (a)), \ + "g" ((USItype) (b)) \ + : "d0", "d1", "d2", "d3", "d4") +#define UMUL_TIME 100 +#define UDIV_TIME 400 + +#endif /* not mc68020 */ + +/* The '020, '030, '040 and '060 have bitfield insns. + cpu32 disguises as a 68020, but lacks them. */ +#if defined (__mc68020__) && !defined (__mcpu32__) +#define count_leading_zeros(count, x) \ + __asm__ ("bfffo %1{%b2:%b2},%0" \ + : "=d" ((USItype) (count)) \ + : "od" ((USItype) (x)), "n" (0)) +/* Some ColdFire architectures have a ff1 instruction supported via + __builtin_clz. */ +#elif defined (__mcfisaaplus__) || defined (__mcfisac__) +#define count_leading_zeros(count,x) ((count) = __builtin_clz (x)) +#define COUNT_LEADING_ZEROS_0 32 +#endif +#endif /* mc68000 */ + +#if defined (__m88000__) && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("addu.co %1,%r4,%r5\n\taddu.ci %0,%r2,%r3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%rJ" ((USItype) (ah)), \ + "rJ" ((USItype) (bh)), \ + "%rJ" ((USItype) (al)), \ + "rJ" ((USItype) (bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("subu.co %1,%r4,%r5\n\tsubu.ci %0,%r2,%r3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "rJ" ((USItype) (ah)), \ + "rJ" ((USItype) (bh)), \ + "rJ" ((USItype) (al)), \ + "rJ" ((USItype) (bl))) +#define count_leading_zeros(count, x) \ + do { \ + USItype __cbtmp; \ + __asm__ ("ff1 %0,%1" \ + : "=r" (__cbtmp) \ + : "r" ((USItype) (x))); \ + (count) = __cbtmp ^ 31; \ + } while (0) +#define COUNT_LEADING_ZEROS_0 63 /* sic */ +#if defined (__mc88110__) +#define umul_ppmm(wh, wl, u, v) \ + do { \ + union {UDItype __ll; \ + struct {USItype __h, __l;} __i; \ + } __xx; \ + __asm__ ("mulu.d %0,%1,%2" \ + : "=r" (__xx.__ll) \ + : "r" ((USItype) (u)), \ + "r" ((USItype) (v))); \ + (wh) = __xx.__i.__h; \ + (wl) = __xx.__i.__l; \ + } while (0) +#define udiv_qrnnd(q, r, n1, n0, d) \ + ({union {UDItype __ll; \ + struct {USItype __h, __l;} __i; \ + } __xx; \ + USItype __q; \ + __xx.__i.__h = (n1); __xx.__i.__l = (n0); \ + __asm__ ("divu.d %0,%1,%2" \ + : "=r" (__q) \ + : "r" (__xx.__ll), \ + "r" ((USItype) (d))); \ + (r) = (n0) - __q * (d); (q) = __q; }) +#define UMUL_TIME 5 +#define UDIV_TIME 25 +#else +#define UMUL_TIME 17 +#define UDIV_TIME 150 +#endif /* __mc88110__ */ +#endif /* __m88000__ */ + +#if defined (__mn10300__) +# if defined (__AM33__) +# define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clz (X)) +# define umul_ppmm(w1, w0, u, v) \ + asm("mulu %3,%2,%1,%0" : "=r"(w0), "=r"(w1) : "r"(u), "r"(v)) +# define smul_ppmm(w1, w0, u, v) \ + asm("mul %3,%2,%1,%0" : "=r"(w0), "=r"(w1) : "r"(u), "r"(v)) +# else +# define umul_ppmm(w1, w0, u, v) \ + asm("nop; nop; mulu %3,%0" : "=d"(w0), "=z"(w1) : "%0"(u), "d"(v)) +# define smul_ppmm(w1, w0, u, v) \ + asm("nop; nop; mul %3,%0" : "=d"(w0), "=z"(w1) : "%0"(u), "d"(v)) +# endif +# define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + do { \ + DWunion __s, __a, __b; \ + __a.s.low = (al); __a.s.high = (ah); \ + __b.s.low = (bl); __b.s.high = (bh); \ + __s.ll = __a.ll + __b.ll; \ + (sl) = __s.s.low; (sh) = __s.s.high; \ + } while (0) +# define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + do { \ + DWunion __s, __a, __b; \ + __a.s.low = (al); __a.s.high = (ah); \ + __b.s.low = (bl); __b.s.high = (bh); \ + __s.ll = __a.ll - __b.ll; \ + (sl) = __s.s.low; (sh) = __s.s.high; \ + } while (0) +# define udiv_qrnnd(q, r, nh, nl, d) \ + asm("divu %2,%0" : "=D"(q), "=z"(r) : "D"(d), "0"(nl), "1"(nh)) +# define sdiv_qrnnd(q, r, nh, nl, d) \ + asm("div %2,%0" : "=D"(q), "=z"(r) : "D"(d), "0"(nl), "1"(nh)) +# define UMUL_TIME 3 +# define UDIV_TIME 38 +#endif + +#if defined (__mips__) && W_TYPE_SIZE == 32 +#define umul_ppmm(w1, w0, u, v) \ + do { \ + UDItype __x = (UDItype) (USItype) (u) * (USItype) (v); \ + (w1) = (USItype) (__x >> 32); \ + (w0) = (USItype) (__x); \ + } while (0) +#define UMUL_TIME 10 +#define UDIV_TIME 100 + +#if (__mips == 32 || __mips == 64) && ! defined (__mips16) +#define count_leading_zeros(COUNT,X) ((COUNT) = __builtin_clz (X)) +#define COUNT_LEADING_ZEROS_0 32 +#endif +#endif /* __mips__ */ + +#if defined (__ns32000__) && W_TYPE_SIZE == 32 +#define umul_ppmm(w1, w0, u, v) \ + ({union {UDItype __ll; \ + struct {USItype __l, __h;} __i; \ + } __xx; \ + __asm__ ("meid %2,%0" \ + : "=g" (__xx.__ll) \ + : "%0" ((USItype) (u)), \ + "g" ((USItype) (v))); \ + (w1) = __xx.__i.__h; (w0) = __xx.__i.__l;}) +#define __umulsidi3(u, v) \ + ({UDItype __w; \ + __asm__ ("meid %2,%0" \ + : "=g" (__w) \ + : "%0" ((USItype) (u)), \ + "g" ((USItype) (v))); \ + __w; }) +#define udiv_qrnnd(q, r, n1, n0, d) \ + ({union {UDItype __ll; \ + struct {USItype __l, __h;} __i; \ + } __xx; \ + __xx.__i.__h = (n1); __xx.__i.__l = (n0); \ + __asm__ ("deid %2,%0" \ + : "=g" (__xx.__ll) \ + : "0" (__xx.__ll), \ + "g" ((USItype) (d))); \ + (r) = __xx.__i.__l; (q) = __xx.__i.__h; }) +#define count_trailing_zeros(count,x) \ + do { \ + __asm__ ("ffsd %2,%0" \ + : "=r" ((USItype) (count)) \ + : "0" ((USItype) 0), \ + "r" ((USItype) (x))); \ + } while (0) +#endif /* __ns32000__ */ + +/* FIXME: We should test _IBMR2 here when we add assembly support for the + system vendor compilers. + FIXME: What's needed for gcc PowerPC VxWorks? __vxworks__ is not good + enough, since that hits ARM and m68k too. */ +#if (defined (_ARCH_PPC) /* AIX */ \ + || defined (__powerpc__) /* gcc */ \ + || defined (__POWERPC__) /* BEOS */ \ + || defined (__ppc__) /* Darwin */ \ + || (defined (PPC) && ! defined (CPU_FAMILY)) /* gcc 2.7.x GNU&SysV */ \ + || (defined (PPC) && defined (CPU_FAMILY) /* VxWorks */ \ + && CPU_FAMILY == PPC) \ + ) && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + do { \ + if (__builtin_constant_p (bh) && (bh) == 0) \ + __asm__ ("add%I4c %1,%3,%4\n\taddze %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\ + else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \ + __asm__ ("add%I4c %1,%3,%4\n\taddme %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\ + else \ + __asm__ ("add%I5c %1,%4,%5\n\tadde %0,%2,%3" \ + : "=r" (sh), "=&r" (sl) \ + : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \ + } while (0) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + do { \ + if (__builtin_constant_p (ah) && (ah) == 0) \ + __asm__ ("subf%I3c %1,%4,%3\n\tsubfze %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ + else if (__builtin_constant_p (ah) && (ah) == ~(USItype) 0) \ + __asm__ ("subf%I3c %1,%4,%3\n\tsubfme %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ + else if (__builtin_constant_p (bh) && (bh) == 0) \ + __asm__ ("subf%I3c %1,%4,%3\n\taddme %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ + else if (__builtin_constant_p (bh) && (bh) == ~(USItype) 0) \ + __asm__ ("subf%I3c %1,%4,%3\n\taddze %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ + else \ + __asm__ ("subf%I4c %1,%5,%4\n\tsubfe %0,%3,%2" \ + : "=r" (sh), "=&r" (sl) \ + : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \ + } while (0) +#define count_leading_zeros(count, x) \ + __asm__ ("cntlzw %0,%1" : "=r" (count) : "r" (x)) +#define COUNT_LEADING_ZEROS_0 32 +#if defined (_ARCH_PPC) || defined (__powerpc__) || defined (__POWERPC__) \ + || defined (__ppc__) \ + || (defined (PPC) && ! defined (CPU_FAMILY)) /* gcc 2.7.x GNU&SysV */ \ + || (defined (PPC) && defined (CPU_FAMILY) /* VxWorks */ \ + && CPU_FAMILY == PPC) +#define umul_ppmm(ph, pl, m0, m1) \ + do { \ + USItype __m0 = (m0), __m1 = (m1); \ + __asm__ ("mulhwu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ + (pl) = __m0 * __m1; \ + } while (0) +#define UMUL_TIME 15 +#define smul_ppmm(ph, pl, m0, m1) \ + do { \ + SItype __m0 = (m0), __m1 = (m1); \ + __asm__ ("mulhw %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ + (pl) = __m0 * __m1; \ + } while (0) +#define SMUL_TIME 14 +#define UDIV_TIME 120 +#endif +#endif /* 32-bit POWER architecture variants. */ + +/* We should test _IBMR2 here when we add assembly support for the system + vendor compilers. */ +#if (defined (_ARCH_PPC64) || defined (__powerpc64__)) && W_TYPE_SIZE == 64 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + do { \ + if (__builtin_constant_p (bh) && (bh) == 0) \ + __asm__ ("add%I4c %1,%3,%4\n\taddze %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\ + else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \ + __asm__ ("add%I4c %1,%3,%4\n\taddme %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "%r" (al), "rI" (bl));\ + else \ + __asm__ ("add%I5c %1,%4,%5\n\tadde %0,%2,%3" \ + : "=r" (sh), "=&r" (sl) \ + : "%r" (ah), "r" (bh), "%r" (al), "rI" (bl)); \ + } while (0) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + do { \ + if (__builtin_constant_p (ah) && (ah) == 0) \ + __asm__ ("subf%I3c %1,%4,%3\n\tsubfze %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ + else if (__builtin_constant_p (ah) && (ah) == ~(UDItype) 0) \ + __asm__ ("subf%I3c %1,%4,%3\n\tsubfme %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (bh), "rI" (al), "r" (bl));\ + else if (__builtin_constant_p (bh) && (bh) == 0) \ + __asm__ ("subf%I3c %1,%4,%3\n\taddme %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ + else if (__builtin_constant_p (bh) && (bh) == ~(UDItype) 0) \ + __asm__ ("subf%I3c %1,%4,%3\n\taddze %0,%2" \ + : "=r" (sh), "=&r" (sl) : "r" (ah), "rI" (al), "r" (bl));\ + else \ + __asm__ ("subf%I4c %1,%5,%4\n\tsubfe %0,%3,%2" \ + : "=r" (sh), "=&r" (sl) \ + : "r" (ah), "r" (bh), "rI" (al), "r" (bl)); \ + } while (0) +#define count_leading_zeros(count, x) \ + __asm__ ("cntlzd %0,%1" : "=r" (count) : "r" (x)) +#define COUNT_LEADING_ZEROS_0 64 +#define umul_ppmm(ph, pl, m0, m1) \ + do { \ + UDItype __m0 = (m0), __m1 = (m1); \ + __asm__ ("mulhdu %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ + (pl) = __m0 * __m1; \ + } while (0) +#define UMUL_TIME 15 +#define smul_ppmm(ph, pl, m0, m1) \ + do { \ + DItype __m0 = (m0), __m1 = (m1); \ + __asm__ ("mulhd %0,%1,%2" : "=r" (ph) : "%r" (m0), "r" (m1)); \ + (pl) = __m0 * __m1; \ + } while (0) +#define SMUL_TIME 14 /* ??? */ +#define UDIV_TIME 120 /* ??? */ +#endif /* 64-bit PowerPC. */ + +#if defined (__ibm032__) /* RT/ROMP */ && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("a %1,%5\n\tae %0,%3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%0" ((USItype) (ah)), \ + "r" ((USItype) (bh)), \ + "%1" ((USItype) (al)), \ + "r" ((USItype) (bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("s %1,%5\n\tse %0,%3" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ + "r" ((USItype) (bh)), \ + "1" ((USItype) (al)), \ + "r" ((USItype) (bl))) +#define umul_ppmm(ph, pl, m0, m1) \ + do { \ + USItype __m0 = (m0), __m1 = (m1); \ + __asm__ ( \ + "s r2,r2\n" \ +" mts r10,%2\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" m r2,%3\n" \ +" cas %0,r2,r0\n" \ +" mfs r10,%1" \ + : "=r" ((USItype) (ph)), \ + "=r" ((USItype) (pl)) \ + : "%r" (__m0), \ + "r" (__m1) \ + : "r2"); \ + (ph) += ((((SItype) __m0 >> 31) & __m1) \ + + (((SItype) __m1 >> 31) & __m0)); \ + } while (0) +#define UMUL_TIME 20 +#define UDIV_TIME 200 +#define count_leading_zeros(count, x) \ + do { \ + if ((x) >= 0x10000) \ + __asm__ ("clz %0,%1" \ + : "=r" ((USItype) (count)) \ + : "r" ((USItype) (x) >> 16)); \ + else \ + { \ + __asm__ ("clz %0,%1" \ + : "=r" ((USItype) (count)) \ + : "r" ((USItype) (x))); \ + (count) += 16; \ + } \ + } while (0) +#endif + +#if defined(__sh__) && (!defined (__SHMEDIA__) || !__SHMEDIA__) && W_TYPE_SIZE == 32 +#ifndef __sh1__ +#define umul_ppmm(w1, w0, u, v) \ + __asm__ ( \ + "dmulu.l %2,%3\n\tsts%M1 macl,%1\n\tsts%M0 mach,%0" \ + : "=r<" ((USItype)(w1)), \ + "=r<" ((USItype)(w0)) \ + : "r" ((USItype)(u)), \ + "r" ((USItype)(v)) \ + : "macl", "mach") +#define UMUL_TIME 5 +#endif + +/* This is the same algorithm as __udiv_qrnnd_c. */ +#define UDIV_NEEDS_NORMALIZATION 1 + +#ifdef __FDPIC__ +/* FDPIC needs a special version of the asm fragment to extract the + code address from the function descriptor. __udiv_qrnnd_16 is + assumed to be local and not to use the GOT, so loading r12 is + not needed. */ +#define udiv_qrnnd(q, r, n1, n0, d) \ + do { \ + extern UWtype __udiv_qrnnd_16 (UWtype, UWtype) \ + __attribute__ ((visibility ("hidden"))); \ + /* r0: rn r1: qn */ /* r0: n1 r4: n0 r5: d r6: d1 */ /* r2: __m */ \ + __asm__ ( \ + "mov%M4 %4,r5\n" \ +" swap.w %3,r4\n" \ +" swap.w r5,r6\n" \ +" mov.l @%5,r2\n" \ +" jsr @r2\n" \ +" shll16 r6\n" \ +" swap.w r4,r4\n" \ +" mov.l @%5,r2\n" \ +" jsr @r2\n" \ +" swap.w r1,%0\n" \ +" or r1,%0" \ + : "=r" (q), "=&z" (r) \ + : "1" (n1), "r" (n0), "rm" (d), "r" (&__udiv_qrnnd_16) \ + : "r1", "r2", "r4", "r5", "r6", "pr", "t"); \ + } while (0) +#else +#define udiv_qrnnd(q, r, n1, n0, d) \ + do { \ + extern UWtype __udiv_qrnnd_16 (UWtype, UWtype) \ + __attribute__ ((visibility ("hidden"))); \ + /* r0: rn r1: qn */ /* r0: n1 r4: n0 r5: d r6: d1 */ /* r2: __m */ \ + __asm__ ( \ + "mov%M4 %4,r5\n" \ +" swap.w %3,r4\n" \ +" swap.w r5,r6\n" \ +" jsr @%5\n" \ +" shll16 r6\n" \ +" swap.w r4,r4\n" \ +" jsr @%5\n" \ +" swap.w r1,%0\n" \ +" or r1,%0" \ + : "=r" (q), "=&z" (r) \ + : "1" (n1), "r" (n0), "rm" (d), "r" (&__udiv_qrnnd_16) \ + : "r1", "r2", "r4", "r5", "r6", "pr", "t"); \ + } while (0) +#endif /* __FDPIC__ */ + +#define UDIV_TIME 80 + +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("clrt;subc %5,%1; subc %4,%0" \ + : "=r" (sh), "=r" (sl) \ + : "0" (ah), "1" (al), "r" (bh), "r" (bl) : "t") + +#endif /* __sh__ */ + +#if defined (__SH5__) && defined (__SHMEDIA__) && __SHMEDIA__ && W_TYPE_SIZE == 32 +#define __umulsidi3(u,v) ((UDItype)(USItype)u*(USItype)v) +#define count_leading_zeros(count, x) \ + do \ + { \ + UDItype x_ = (USItype)(x); \ + SItype c_; \ + \ + __asm__ ("nsb %1, %0" : "=r" (c_) : "r" (x_)); \ + (count) = c_ - 31; \ + } \ + while (0) +#define COUNT_LEADING_ZEROS_0 32 +#endif + +#if defined (__sparc__) && !defined (__arch64__) && !defined (__sparcv9) \ + && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("addcc %r4,%5,%1\n\taddx %r2,%3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "%rJ" ((USItype) (ah)), \ + "rI" ((USItype) (bh)), \ + "%rJ" ((USItype) (al)), \ + "rI" ((USItype) (bl)) \ + __CLOBBER_CC) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("subcc %r4,%5,%1\n\tsubx %r2,%3,%0" \ + : "=r" ((USItype) (sh)), \ + "=&r" ((USItype) (sl)) \ + : "rJ" ((USItype) (ah)), \ + "rI" ((USItype) (bh)), \ + "rJ" ((USItype) (al)), \ + "rI" ((USItype) (bl)) \ + __CLOBBER_CC) +#if defined (__sparc_v9__) +#define umul_ppmm(w1, w0, u, v) \ + do { \ + register USItype __g1 asm ("g1"); \ + __asm__ ("umul\t%2,%3,%1\n\t" \ + "srlx\t%1, 32, %0" \ + : "=r" ((USItype) (w1)), \ + "=r" (__g1) \ + : "r" ((USItype) (u)), \ + "r" ((USItype) (v))); \ + (w0) = __g1; \ + } while (0) +#define udiv_qrnnd(__q, __r, __n1, __n0, __d) \ + __asm__ ("mov\t%2,%%y\n\t" \ + "udiv\t%3,%4,%0\n\t" \ + "umul\t%0,%4,%1\n\t" \ + "sub\t%3,%1,%1" \ + : "=&r" ((USItype) (__q)), \ + "=&r" ((USItype) (__r)) \ + : "r" ((USItype) (__n1)), \ + "r" ((USItype) (__n0)), \ + "r" ((USItype) (__d))) +#else +#if defined (__sparc_v8__) +#define umul_ppmm(w1, w0, u, v) \ + __asm__ ("umul %2,%3,%1;rd %%y,%0" \ + : "=r" ((USItype) (w1)), \ + "=r" ((USItype) (w0)) \ + : "r" ((USItype) (u)), \ + "r" ((USItype) (v))) +#define udiv_qrnnd(__q, __r, __n1, __n0, __d) \ + __asm__ ("mov %2,%%y;nop;nop;nop;udiv %3,%4,%0;umul %0,%4,%1;sub %3,%1,%1"\ + : "=&r" ((USItype) (__q)), \ + "=&r" ((USItype) (__r)) \ + : "r" ((USItype) (__n1)), \ + "r" ((USItype) (__n0)), \ + "r" ((USItype) (__d))) +#else +#if defined (__sparclite__) +/* This has hardware multiply but not divide. It also has two additional + instructions scan (ffs from high bit) and divscc. */ +#define umul_ppmm(w1, w0, u, v) \ + __asm__ ("umul %2,%3,%1;rd %%y,%0" \ + : "=r" ((USItype) (w1)), \ + "=r" ((USItype) (w0)) \ + : "r" ((USItype) (u)), \ + "r" ((USItype) (v))) +#define udiv_qrnnd(q, r, n1, n0, d) \ + __asm__ ("! Inlined udiv_qrnnd\n" \ +" wr %%g0,%2,%%y ! Not a delayed write for sparclite\n" \ +" tst %%g0\n" \ +" divscc %3,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%%g1\n" \ +" divscc %%g1,%4,%0\n" \ +" rd %%y,%1\n" \ +" bl,a 1f\n" \ +" add %1,%4,%1\n" \ +"1: ! End of inline udiv_qrnnd" \ + : "=r" ((USItype) (q)), \ + "=r" ((USItype) (r)) \ + : "r" ((USItype) (n1)), \ + "r" ((USItype) (n0)), \ + "rI" ((USItype) (d)) \ + : "g1" __AND_CLOBBER_CC) +#define UDIV_TIME 37 +#define count_leading_zeros(count, x) \ + do { \ + __asm__ ("scan %1,1,%0" \ + : "=r" ((USItype) (count)) \ + : "r" ((USItype) (x))); \ + } while (0) +/* Early sparclites return 63 for an argument of 0, but they warn that future + implementations might change this. Therefore, leave COUNT_LEADING_ZEROS_0 + undefined. */ +#else +/* SPARC without integer multiplication and divide instructions. + (i.e. at least Sun4/20,40,60,65,75,110,260,280,330,360,380,470,490) */ +#define umul_ppmm(w1, w0, u, v) \ + __asm__ ("! Inlined umul_ppmm\n" \ +" wr %%g0,%2,%%y ! SPARC has 0-3 delay insn after a wr\n"\ +" sra %3,31,%%o5 ! Don't move this insn\n" \ +" and %2,%%o5,%%o5 ! Don't move this insn\n" \ +" andcc %%g0,0,%%g1 ! Don't move this insn\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,%3,%%g1\n" \ +" mulscc %%g1,0,%%g1\n" \ +" add %%g1,%%o5,%0\n" \ +" rd %%y,%1" \ + : "=r" ((USItype) (w1)), \ + "=r" ((USItype) (w0)) \ + : "%rI" ((USItype) (u)), \ + "r" ((USItype) (v)) \ + : "g1", "o5" __AND_CLOBBER_CC) +#define UMUL_TIME 39 /* 39 instructions */ +/* It's quite necessary to add this much assembler for the sparc. + The default udiv_qrnnd (in C) is more than 10 times slower! */ +#define udiv_qrnnd(__q, __r, __n1, __n0, __d) \ + __asm__ ("! Inlined udiv_qrnnd\n" \ +" mov 32,%%g1\n" \ +" subcc %1,%2,%%g0\n" \ +"1: bcs 5f\n" \ +" addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n" \ +" sub %1,%2,%1 ! this kills msb of n\n" \ +" addx %1,%1,%1 ! so this can't give carry\n" \ +" subcc %%g1,1,%%g1\n" \ +"2: bne 1b\n" \ +" subcc %1,%2,%%g0\n" \ +" bcs 3f\n" \ +" addxcc %0,%0,%0 ! shift n1n0 and a q-bit in lsb\n" \ +" b 3f\n" \ +" sub %1,%2,%1 ! this kills msb of n\n" \ +"4: sub %1,%2,%1\n" \ +"5: addxcc %1,%1,%1\n" \ +" bcc 2b\n" \ +" subcc %%g1,1,%%g1\n" \ +"! Got carry from n. Subtract next step to cancel this carry.\n" \ +" bne 4b\n" \ +" addcc %0,%0,%0 ! shift n1n0 and a 0-bit in lsb\n" \ +" sub %1,%2,%1\n" \ +"3: xnor %0,0,%0\n" \ +" ! End of inline udiv_qrnnd" \ + : "=&r" ((USItype) (__q)), \ + "=&r" ((USItype) (__r)) \ + : "r" ((USItype) (__d)), \ + "1" ((USItype) (__n1)), \ + "0" ((USItype) (__n0)) : "g1" __AND_CLOBBER_CC) +#define UDIV_TIME (3+7*32) /* 7 instructions/iteration. 32 iterations. */ +#endif /* __sparclite__ */ +#endif /* __sparc_v8__ */ +#endif /* __sparc_v9__ */ +#endif /* sparc32 */ + +#if ((defined (__sparc__) && defined (__arch64__)) || defined (__sparcv9)) \ + && W_TYPE_SIZE == 64 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + do { \ + UDItype __carry = 0; \ + __asm__ ("addcc\t%r5,%6,%1\n\t" \ + "add\t%r3,%4,%0\n\t" \ + "movcs\t%%xcc, 1, %2\n\t" \ + "add\t%0, %2, %0" \ + : "=r" ((UDItype)(sh)), \ + "=&r" ((UDItype)(sl)), \ + "+r" (__carry) \ + : "%rJ" ((UDItype)(ah)), \ + "rI" ((UDItype)(bh)), \ + "%rJ" ((UDItype)(al)), \ + "rI" ((UDItype)(bl)) \ + __CLOBBER_CC); \ + } while (0) + +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + do { \ + UDItype __carry = 0; \ + __asm__ ("subcc\t%r5,%6,%1\n\t" \ + "sub\t%r3,%4,%0\n\t" \ + "movcs\t%%xcc, 1, %2\n\t" \ + "sub\t%0, %2, %0" \ + : "=r" ((UDItype)(sh)), \ + "=&r" ((UDItype)(sl)), \ + "+r" (__carry) \ + : "%rJ" ((UDItype)(ah)), \ + "rI" ((UDItype)(bh)), \ + "%rJ" ((UDItype)(al)), \ + "rI" ((UDItype)(bl)) \ + __CLOBBER_CC); \ + } while (0) + +#define umul_ppmm(wh, wl, u, v) \ + do { \ + UDItype tmp1, tmp2, tmp3, tmp4; \ + __asm__ __volatile__ ( \ + "srl %7,0,%3\n\t" \ + "mulx %3,%6,%1\n\t" \ + "srlx %6,32,%2\n\t" \ + "mulx %2,%3,%4\n\t" \ + "sllx %4,32,%5\n\t" \ + "srl %6,0,%3\n\t" \ + "sub %1,%5,%5\n\t" \ + "srlx %5,32,%5\n\t" \ + "addcc %4,%5,%4\n\t" \ + "srlx %7,32,%5\n\t" \ + "mulx %3,%5,%3\n\t" \ + "mulx %2,%5,%5\n\t" \ + "sethi %%hi(0x80000000),%2\n\t" \ + "addcc %4,%3,%4\n\t" \ + "srlx %4,32,%4\n\t" \ + "add %2,%2,%2\n\t" \ + "movcc %%xcc,%%g0,%2\n\t" \ + "addcc %5,%4,%5\n\t" \ + "sllx %3,32,%3\n\t" \ + "add %1,%3,%1\n\t" \ + "add %5,%2,%0" \ + : "=r" ((UDItype)(wh)), \ + "=&r" ((UDItype)(wl)), \ + "=&r" (tmp1), "=&r" (tmp2), "=&r" (tmp3), "=&r" (tmp4) \ + : "r" ((UDItype)(u)), \ + "r" ((UDItype)(v)) \ + __CLOBBER_CC); \ + } while (0) +#define UMUL_TIME 96 +#define UDIV_TIME 230 +#endif /* sparc64 */ + +#if defined (__vax__) && W_TYPE_SIZE == 32 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("addl2 %5,%1\n\tadwc %3,%0" \ + : "=g" ((USItype) (sh)), \ + "=&g" ((USItype) (sl)) \ + : "%0" ((USItype) (ah)), \ + "g" ((USItype) (bh)), \ + "%1" ((USItype) (al)), \ + "g" ((USItype) (bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("subl2 %5,%1\n\tsbwc %3,%0" \ + : "=g" ((USItype) (sh)), \ + "=&g" ((USItype) (sl)) \ + : "0" ((USItype) (ah)), \ + "g" ((USItype) (bh)), \ + "1" ((USItype) (al)), \ + "g" ((USItype) (bl))) +#define umul_ppmm(xh, xl, m0, m1) \ + do { \ + union { \ + UDItype __ll; \ + struct {USItype __l, __h;} __i; \ + } __xx; \ + USItype __m0 = (m0), __m1 = (m1); \ + __asm__ ("emul %1,%2,$0,%0" \ + : "=r" (__xx.__ll) \ + : "g" (__m0), \ + "g" (__m1)); \ + (xh) = __xx.__i.__h; \ + (xl) = __xx.__i.__l; \ + (xh) += ((((SItype) __m0 >> 31) & __m1) \ + + (((SItype) __m1 >> 31) & __m0)); \ + } while (0) +#define sdiv_qrnnd(q, r, n1, n0, d) \ + do { \ + union {DItype __ll; \ + struct {SItype __l, __h;} __i; \ + } __xx; \ + __xx.__i.__h = n1; __xx.__i.__l = n0; \ + __asm__ ("ediv %3,%2,%0,%1" \ + : "=g" (q), "=g" (r) \ + : "g" (__xx.__ll), "g" (d)); \ + } while (0) +#endif /* __vax__ */ + +#ifdef _TMS320C6X +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + do \ + { \ + UDItype __ll; \ + __asm__ ("addu .l1 %1, %2, %0" \ + : "=a" (__ll) : "a" (al), "a" (bl)); \ + (sl) = (USItype)__ll; \ + (sh) = ((USItype)(__ll >> 32)) + (ah) + (bh); \ + } \ + while (0) + +#ifdef _TMS320C6400_PLUS +#define __umulsidi3(u,v) ((UDItype)(USItype)u*(USItype)v) +#define umul_ppmm(w1, w0, u, v) \ + do { \ + UDItype __x = (UDItype) (USItype) (u) * (USItype) (v); \ + (w1) = (USItype) (__x >> 32); \ + (w0) = (USItype) (__x); \ + } while (0) +#endif /* _TMS320C6400_PLUS */ + +#define count_leading_zeros(count, x) ((count) = __builtin_clz (x)) +#ifdef _TMS320C6400 +#define count_trailing_zeros(count, x) ((count) = __builtin_ctz (x)) +#endif +#define UMUL_TIME 4 +#define UDIV_TIME 40 +#endif /* _TMS320C6X */ + +#if defined (__xtensa__) && W_TYPE_SIZE == 32 +/* This code is not Xtensa-configuration-specific, so rely on the compiler + to expand builtin functions depending on what configuration features + are available. This avoids library calls when the operation can be + performed in-line. */ +#define umul_ppmm(w1, w0, u, v) \ + do { \ + DWunion __w; \ + __w.ll = __builtin_umulsidi3 (u, v); \ + w1 = __w.s.high; \ + w0 = __w.s.low; \ + } while (0) +#define __umulsidi3(u, v) __builtin_umulsidi3 (u, v) +#define count_leading_zeros(COUNT, X) ((COUNT) = __builtin_clz (X)) +#define count_trailing_zeros(COUNT, X) ((COUNT) = __builtin_ctz (X)) +#endif /* __xtensa__ */ + +#if defined xstormy16 +extern UHItype __stormy16_count_leading_zeros (UHItype); +#define count_leading_zeros(count, x) \ + do \ + { \ + UHItype size; \ + \ + /* We assume that W_TYPE_SIZE is a multiple of 16... */ \ + for ((count) = 0, size = W_TYPE_SIZE; size; size -= 16) \ + { \ + UHItype c; \ + \ + c = __clzhi2 ((x) >> (size - 16)); \ + (count) += c; \ + if (c != 16) \ + break; \ + } \ + } \ + while (0) +#define COUNT_LEADING_ZEROS_0 W_TYPE_SIZE +#endif + +#if defined (__z8000__) && W_TYPE_SIZE == 16 +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + __asm__ ("add %H1,%H5\n\tadc %H0,%H3" \ + : "=r" ((unsigned int)(sh)), \ + "=&r" ((unsigned int)(sl)) \ + : "%0" ((unsigned int)(ah)), \ + "r" ((unsigned int)(bh)), \ + "%1" ((unsigned int)(al)), \ + "rQR" ((unsigned int)(bl))) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + __asm__ ("sub %H1,%H5\n\tsbc %H0,%H3" \ + : "=r" ((unsigned int)(sh)), \ + "=&r" ((unsigned int)(sl)) \ + : "0" ((unsigned int)(ah)), \ + "r" ((unsigned int)(bh)), \ + "1" ((unsigned int)(al)), \ + "rQR" ((unsigned int)(bl))) +#define umul_ppmm(xh, xl, m0, m1) \ + do { \ + union {long int __ll; \ + struct {unsigned int __h, __l;} __i; \ + } __xx; \ + unsigned int __m0 = (m0), __m1 = (m1); \ + __asm__ ("mult %S0,%H3" \ + : "=r" (__xx.__i.__h), \ + "=r" (__xx.__i.__l) \ + : "%1" (__m0), \ + "rQR" (__m1)); \ + (xh) = __xx.__i.__h; (xl) = __xx.__i.__l; \ + (xh) += ((((signed int) __m0 >> 15) & __m1) \ + + (((signed int) __m1 >> 15) & __m0)); \ + } while (0) +#endif /* __z8000__ */ + +#endif /* __GNUC__ */ + +/* If this machine has no inline assembler, use C macros. */ + +#if !defined (add_ssaaaa) +#define add_ssaaaa(sh, sl, ah, al, bh, bl) \ + do { \ + UWtype __x; \ + __x = (al) + (bl); \ + (sh) = (ah) + (bh) + (__x < (al)); \ + (sl) = __x; \ + } while (0) +#endif + +#if !defined (sub_ddmmss) +#define sub_ddmmss(sh, sl, ah, al, bh, bl) \ + do { \ + UWtype __x; \ + __x = (al) - (bl); \ + (sh) = (ah) - (bh) - (__x > (al)); \ + (sl) = __x; \ + } while (0) +#endif + +/* If we lack umul_ppmm but have smul_ppmm, define umul_ppmm in terms of + smul_ppmm. */ +#if !defined (umul_ppmm) && defined (smul_ppmm) +#define umul_ppmm(w1, w0, u, v) \ + do { \ + UWtype __w1; \ + UWtype __xm0 = (u), __xm1 = (v); \ + smul_ppmm (__w1, w0, __xm0, __xm1); \ + (w1) = __w1 + (-(__xm0 >> (W_TYPE_SIZE - 1)) & __xm1) \ + + (-(__xm1 >> (W_TYPE_SIZE - 1)) & __xm0); \ + } while (0) +#endif + +/* If we still don't have umul_ppmm, define it using plain C. */ +#if !defined (umul_ppmm) +#define umul_ppmm(w1, w0, u, v) \ + do { \ + UWtype __x0, __x1, __x2, __x3; \ + UHWtype __ul, __vl, __uh, __vh; \ + \ + __ul = __ll_lowpart (u); \ + __uh = __ll_highpart (u); \ + __vl = __ll_lowpart (v); \ + __vh = __ll_highpart (v); \ + \ + __x0 = (UWtype) __ul * __vl; \ + __x1 = (UWtype) __ul * __vh; \ + __x2 = (UWtype) __uh * __vl; \ + __x3 = (UWtype) __uh * __vh; \ + \ + __x1 += __ll_highpart (__x0);/* this can't give carry */ \ + __x1 += __x2; /* but this indeed can */ \ + if (__x1 < __x2) /* did we get it? */ \ + __x3 += __ll_B; /* yes, add it in the proper pos. */ \ + \ + (w1) = __x3 + __ll_highpart (__x1); \ + (w0) = __ll_lowpart (__x1) * __ll_B + __ll_lowpart (__x0); \ + } while (0) +#endif + +#if !defined (__umulsidi3) +#define __umulsidi3(u, v) \ + ({DWunion __w; \ + umul_ppmm (__w.s.high, __w.s.low, u, v); \ + __w.ll; }) +#endif + +/* Define this unconditionally, so it can be used for debugging. */ +#define __udiv_qrnnd_c(q, r, n1, n0, d) \ + do { \ + UWtype __d1, __d0, __q1, __q0; \ + UWtype __r1, __r0, __m; \ + __d1 = __ll_highpart (d); \ + __d0 = __ll_lowpart (d); \ + \ + __r1 = (n1) % __d1; \ + __q1 = (n1) / __d1; \ + __m = (UWtype) __q1 * __d0; \ + __r1 = __r1 * __ll_B | __ll_highpart (n0); \ + if (__r1 < __m) \ + { \ + __q1--, __r1 += (d); \ + if (__r1 >= (d)) /* i.e. we didn't get carry when adding to __r1 */\ + if (__r1 < __m) \ + __q1--, __r1 += (d); \ + } \ + __r1 -= __m; \ + \ + __r0 = __r1 % __d1; \ + __q0 = __r1 / __d1; \ + __m = (UWtype) __q0 * __d0; \ + __r0 = __r0 * __ll_B | __ll_lowpart (n0); \ + if (__r0 < __m) \ + { \ + __q0--, __r0 += (d); \ + if (__r0 >= (d)) \ + if (__r0 < __m) \ + __q0--, __r0 += (d); \ + } \ + __r0 -= __m; \ + \ + (q) = (UWtype) __q1 * __ll_B | __q0; \ + (r) = __r0; \ + } while (0) + +/* If the processor has no udiv_qrnnd but sdiv_qrnnd, go through + __udiv_w_sdiv (defined in libgcc or elsewhere). */ +#if !defined (udiv_qrnnd) && defined (sdiv_qrnnd) +#define udiv_qrnnd(q, r, nh, nl, d) \ + do { \ + extern UWtype __udiv_w_sdiv (UWtype *, UWtype, UWtype, UWtype); \ + UWtype __r; \ + (q) = __udiv_w_sdiv (&__r, nh, nl, d); \ + (r) = __r; \ + } while (0) +#endif + +/* If udiv_qrnnd was not defined for this processor, use __udiv_qrnnd_c. */ +#if !defined (udiv_qrnnd) +#define UDIV_NEEDS_NORMALIZATION 1 +#define udiv_qrnnd __udiv_qrnnd_c +#endif + +#if !defined (count_leading_zeros) +#define count_leading_zeros(count, x) \ + do { \ + UWtype __xr = (x); \ + UWtype __a; \ + \ + if (W_TYPE_SIZE <= 32) \ + { \ + __a = __xr < ((UWtype)1<<2*__BITS4) \ + ? (__xr < ((UWtype)1<<__BITS4) ? 0 : __BITS4) \ + : (__xr < ((UWtype)1<<3*__BITS4) ? 2*__BITS4 : 3*__BITS4); \ + } \ + else \ + { \ + for (__a = W_TYPE_SIZE - 8; __a > 0; __a -= 8) \ + if (((__xr >> __a) & 0xff) != 0) \ + break; \ + } \ + \ + (count) = W_TYPE_SIZE - (__clz_tab[__xr >> __a] + __a); \ + } while (0) +#define COUNT_LEADING_ZEROS_0 W_TYPE_SIZE +#endif + +#if !defined (count_trailing_zeros) +/* Define count_trailing_zeros using count_leading_zeros. The latter might be + defined in asm, but if it is not, the C version above is good enough. */ +#define count_trailing_zeros(count, x) \ + do { \ + UWtype __ctz_x = (x); \ + UWtype __ctz_c; \ + count_leading_zeros (__ctz_c, __ctz_x & -__ctz_x); \ + (count) = W_TYPE_SIZE - 1 - __ctz_c; \ + } while (0) +#endif + +#ifndef UDIV_NEEDS_NORMALIZATION +#define UDIV_NEEDS_NORMALIZATION 0 +#endif diff --git a/REORG.TODO/stdlib/lrand48.c b/REORG.TODO/stdlib/lrand48.c new file mode 100644 index 0000000000..645977bb96 --- /dev/null +++ b/REORG.TODO/stdlib/lrand48.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + + +long int +lrand48 (void) +{ + long int result; + + (void) __nrand48_r (__libc_drand48_data.__x, &__libc_drand48_data, &result); + + return result; +} diff --git a/REORG.TODO/stdlib/lrand48_r.c b/REORG.TODO/stdlib/lrand48_r.c new file mode 100644 index 0000000000..445efe09b6 --- /dev/null +++ b/REORG.TODO/stdlib/lrand48_r.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.org>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +int +lrand48_r (struct drand48_data *buffer, long int *result) +{ + /* Be generous for the arguments, detect some errors. */ + if (buffer == NULL) + return -1; + + return __nrand48_r (buffer->__x, buffer, result); +} +libc_hidden_def (lrand48_r) diff --git a/REORG.TODO/stdlib/lshift.c b/REORG.TODO/stdlib/lshift.c new file mode 100644 index 0000000000..c8228f9aa6 --- /dev/null +++ b/REORG.TODO/stdlib/lshift.c @@ -0,0 +1,78 @@ +/* mpn_lshift -- Shift left low level. + +Copyright (C) 1991-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library; see the file COPYING.LIB. If not, see +<http://www.gnu.org/licenses/>. */ + +#include <gmp.h> +#include "gmp-impl.h" + +/* Shift U (pointed to by UP and USIZE digits long) CNT bits to the left + and store the USIZE least significant digits of the result at WP. + Return the bits shifted out from the most significant digit. + + Argument constraints: + 1. 0 < CNT < BITS_PER_MP_LIMB + 2. If the result is to be written over the input, WP must be >= UP. +*/ + +mp_limb_t +mpn_lshift (register mp_ptr wp, + register mp_srcptr up, mp_size_t usize, + register unsigned int cnt) +{ + register mp_limb_t high_limb, low_limb; + register unsigned sh_1, sh_2; + register mp_size_t i; + mp_limb_t retval; + +#ifdef DEBUG + if (usize == 0 || cnt == 0) + abort (); +#endif + + sh_1 = cnt; +#if 0 + if (sh_1 == 0) + { + if (wp != up) + { + /* Copy from high end to low end, to allow specified input/output + overlapping. */ + for (i = usize - 1; i >= 0; i--) + wp[i] = up[i]; + } + return 0; + } +#endif + + wp += 1; + sh_2 = BITS_PER_MP_LIMB - sh_1; + i = usize - 1; + low_limb = up[i]; + retval = low_limb >> sh_2; + high_limb = low_limb; + while (--i >= 0) + { + low_limb = up[i]; + wp[i] = (high_limb << sh_1) | (low_limb >> sh_2); + high_limb = low_limb; + } + wp[i] = high_limb << sh_1; + + return retval; +} diff --git a/REORG.TODO/stdlib/makecontext.c b/REORG.TODO/stdlib/makecontext.c new file mode 100644 index 0000000000..b699bd8a56 --- /dev/null +++ b/REORG.TODO/stdlib/makecontext.c @@ -0,0 +1,28 @@ +/* Copyright (C) 1998-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <ucontext.h> + +void +makecontext (ucontext_t *ucp, void (*func) (void), int argc, ...) +{ + __set_errno (ENOSYS); +} + + +stub_warning (makecontext) diff --git a/REORG.TODO/stdlib/mblen.c b/REORG.TODO/stdlib/mblen.c new file mode 100644 index 0000000000..b98bb915e4 --- /dev/null +++ b/REORG.TODO/stdlib/mblen.c @@ -0,0 +1,68 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <string.h> +#include <wchar.h> +#include <gconv.h> +#include <wcsmbs/wcsmbsload.h> + + +/* Internal state. */ +static mbstate_t state; + +/* Return the length of the multibyte character (if there is one) + at S which is no longer than N characters. + The ISO C standard says that the `mblen' function must not change + the state of the `mbtowc' function. */ +int +mblen (const char *s, size_t n) +{ + int result; + + /* If S is NULL the function has to return null or not null + depending on the encoding having a state depending encoding or + not. */ + if (s == NULL) + { + const struct gconv_fcts *fcts; + + /* Get the conversion functions. */ + fcts = get_gconv_fcts (_NL_CURRENT_DATA (LC_CTYPE)); + + /* Reset the state. */ + memset (&state, '\0', sizeof state); + + result = fcts->towc->__stateful; + } + else if (*s == '\0') + /* According to the ISO C 89 standard this is the expected behaviour. */ + result = 0; + else + { + memset (&state, '\0', sizeof state); + + result = __mbrtowc (NULL, s, n, &state); + + /* The `mbrtowc' functions tell us more than we need. Fold the -1 + and -2 result into -1. */ + if (result < 0) + result = -1; + } + + return result; +} diff --git a/REORG.TODO/stdlib/mbstowcs.c b/REORG.TODO/stdlib/mbstowcs.c new file mode 100644 index 0000000000..8016208e76 --- /dev/null +++ b/REORG.TODO/stdlib/mbstowcs.c @@ -0,0 +1,39 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <string.h> +#include <wchar.h> + + +/* Convert the string of multibyte characters in S to `wchar_t's in + PWCS, writing no more than N. Return the number written, + or (size_t) -1 if an invalid multibyte character is encountered. + + Attention: this function should NEVER be intentionally used. + The interface is completely stupid. The state is shared between + all conversion functions. You should use instead the restartable + version `mbsrtowcs'. */ +size_t +mbstowcs (wchar_t *pwcs, const char *s, size_t n) +{ + mbstate_t state; + + memset (&state, '\0', sizeof state); + /* Return how many we wrote (or maybe an error). */ + return __mbsrtowcs (pwcs, &s, n, &state); +} diff --git a/REORG.TODO/stdlib/mbtowc.c b/REORG.TODO/stdlib/mbtowc.c new file mode 100644 index 0000000000..c391726689 --- /dev/null +++ b/REORG.TODO/stdlib/mbtowc.c @@ -0,0 +1,72 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <string.h> +#include <wchar.h> +#include <gconv.h> +#include <wcsmbs/wcsmbsload.h> + + +/* Convert the multibyte character at S, which is no longer + than N characters, to its `wchar_t' representation, placing + this n *PWC and returning its length. + + Attention: this function should NEVER be intentionally used. + The interface is completely stupid. The state is shared between + all conversion functions. You should use instead the restartable + version `mbrtowc'. */ +int +mbtowc (wchar_t *pwc, const char *s, size_t n) +{ + int result; + static mbstate_t state; + + /* If S is NULL the function has to return null or not null + depending on the encoding having a state depending encoding or + not. */ + if (s == NULL) + { + const struct gconv_fcts *fcts; + + /* Get the conversion functions. */ + fcts = get_gconv_fcts (_NL_CURRENT_DATA (LC_CTYPE)); + + /* This is an extension in the Unix standard which does not directly + violate ISO C. */ + memset (&state, '\0', sizeof state); + + result = fcts->towc->__stateful; + } + else if (*s == '\0') + { + if (pwc != NULL) + *pwc = L'\0'; + result = 0; + } + else + { + result = __mbrtowc (pwc, s, n, &state); + + /* The `mbrtowc' functions tell us more than we need. Fold the -1 + and -2 result into -1. */ + if (result < 0) + result = -1; + } + + return result; +} diff --git a/REORG.TODO/stdlib/mod_1.c b/REORG.TODO/stdlib/mod_1.c new file mode 100644 index 0000000000..33ca193ce2 --- /dev/null +++ b/REORG.TODO/stdlib/mod_1.c @@ -0,0 +1,189 @@ +/* mpn_mod_1(dividend_ptr, dividend_size, divisor_limb) -- + Divide (DIVIDEND_PTR,,DIVIDEND_SIZE) by DIVISOR_LIMB. + Return the single-limb remainder. + There are no constraints on the value of the divisor. + +Copyright (C) 1991-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library; see the file COPYING.LIB. If not, see +<http://www.gnu.org/licenses/>. */ + +#include <gmp.h> +#include "gmp-impl.h" +#include "longlong.h" + +#ifndef UMUL_TIME +#define UMUL_TIME 1 +#endif + +#ifndef UDIV_TIME +#define UDIV_TIME UMUL_TIME +#endif + +/* FIXME: We should be using invert_limb (or invert_normalized_limb) + here (not udiv_qrnnd). */ + +mp_limb_t +mpn_mod_1 (mp_srcptr dividend_ptr, mp_size_t dividend_size, + mp_limb_t divisor_limb) +{ + mp_size_t i; + mp_limb_t n1, n0, r; + mp_limb_t dummy __attribute__ ((unused)); + + /* Botch: Should this be handled at all? Rely on callers? */ + if (dividend_size == 0) + return 0; + + /* If multiplication is much faster than division, and the + dividend is large, pre-invert the divisor, and use + only multiplications in the inner loop. */ + + /* This test should be read: + Does it ever help to use udiv_qrnnd_preinv? + && Does what we save compensate for the inversion overhead? */ + if (UDIV_TIME > (2 * UMUL_TIME + 6) + && (UDIV_TIME - (2 * UMUL_TIME + 6)) * dividend_size > UDIV_TIME) + { + int normalization_steps; + + count_leading_zeros (normalization_steps, divisor_limb); + if (normalization_steps != 0) + { + mp_limb_t divisor_limb_inverted; + + divisor_limb <<= normalization_steps; + + /* Compute (2**2N - 2**N * DIVISOR_LIMB) / DIVISOR_LIMB. The + result is a (N+1)-bit approximation to 1/DIVISOR_LIMB, with the + most significant bit (with weight 2**N) implicit. */ + + /* Special case for DIVISOR_LIMB == 100...000. */ + if (divisor_limb << 1 == 0) + divisor_limb_inverted = ~(mp_limb_t) 0; + else + udiv_qrnnd (divisor_limb_inverted, dummy, + -divisor_limb, 0, divisor_limb); + + n1 = dividend_ptr[dividend_size - 1]; + r = n1 >> (BITS_PER_MP_LIMB - normalization_steps); + + /* Possible optimization: + if (r == 0 + && divisor_limb > ((n1 << normalization_steps) + | (dividend_ptr[dividend_size - 2] >> ...))) + ...one division less... */ + + for (i = dividend_size - 2; i >= 0; i--) + { + n0 = dividend_ptr[i]; + udiv_qrnnd_preinv (dummy, r, r, + ((n1 << normalization_steps) + | (n0 >> (BITS_PER_MP_LIMB - normalization_steps))), + divisor_limb, divisor_limb_inverted); + n1 = n0; + } + udiv_qrnnd_preinv (dummy, r, r, + n1 << normalization_steps, + divisor_limb, divisor_limb_inverted); + return r >> normalization_steps; + } + else + { + mp_limb_t divisor_limb_inverted; + + /* Compute (2**2N - 2**N * DIVISOR_LIMB) / DIVISOR_LIMB. The + result is a (N+1)-bit approximation to 1/DIVISOR_LIMB, with the + most significant bit (with weight 2**N) implicit. */ + + /* Special case for DIVISOR_LIMB == 100...000. */ + if (divisor_limb << 1 == 0) + divisor_limb_inverted = ~(mp_limb_t) 0; + else + udiv_qrnnd (divisor_limb_inverted, dummy, + -divisor_limb, 0, divisor_limb); + + i = dividend_size - 1; + r = dividend_ptr[i]; + + if (r >= divisor_limb) + r = 0; + else + i--; + + for (; i >= 0; i--) + { + n0 = dividend_ptr[i]; + udiv_qrnnd_preinv (dummy, r, r, + n0, divisor_limb, divisor_limb_inverted); + } + return r; + } + } + else + { + if (UDIV_NEEDS_NORMALIZATION) + { + int normalization_steps; + + count_leading_zeros (normalization_steps, divisor_limb); + if (normalization_steps != 0) + { + divisor_limb <<= normalization_steps; + + n1 = dividend_ptr[dividend_size - 1]; + r = n1 >> (BITS_PER_MP_LIMB - normalization_steps); + + /* Possible optimization: + if (r == 0 + && divisor_limb > ((n1 << normalization_steps) + | (dividend_ptr[dividend_size - 2] >> ...))) + ...one division less... */ + + for (i = dividend_size - 2; i >= 0; i--) + { + n0 = dividend_ptr[i]; + udiv_qrnnd (dummy, r, r, + ((n1 << normalization_steps) + | (n0 >> (BITS_PER_MP_LIMB - normalization_steps))), + divisor_limb); + n1 = n0; + } + udiv_qrnnd (dummy, r, r, + n1 << normalization_steps, + divisor_limb); + return r >> normalization_steps; + } + } + /* No normalization needed, either because udiv_qrnnd doesn't require + it, or because DIVISOR_LIMB is already normalized. */ + + i = dividend_size - 1; + r = dividend_ptr[i]; + + if (r >= divisor_limb) + r = 0; + else + i--; + + for (; i >= 0; i--) + { + n0 = dividend_ptr[i]; + udiv_qrnnd (dummy, r, r, n0, divisor_limb); + } + return r; + } +} diff --git a/REORG.TODO/stdlib/monetary.h b/REORG.TODO/stdlib/monetary.h new file mode 100644 index 0000000000..dcfbfc5262 --- /dev/null +++ b/REORG.TODO/stdlib/monetary.h @@ -0,0 +1,58 @@ +/* Header file for monetary value formatting functions. + Copyright (C) 1996-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _MONETARY_H +#define _MONETARY_H 1 + +#include <features.h> + +/* Get needed types. */ +#define __need_size_t +#include <stddef.h> +#include <bits/types.h> + +#ifndef __ssize_t_defined +typedef __ssize_t ssize_t; +# define __ssize_t_defined +#endif + + +__BEGIN_DECLS + +/* Formatting a monetary value according to the current locale. */ +extern ssize_t strfmon (char *__restrict __s, size_t __maxsize, + const char *__restrict __format, ...) + __THROW __attribute_format_strfmon__ (3, 4); + +#ifdef __USE_XOPEN2K8 +# include <xlocale.h> + +/* Formatting a monetary value according to the given locale. */ +extern ssize_t strfmon_l (char *__restrict __s, size_t __maxsize, + __locale_t __loc, + const char *__restrict __format, ...) + __THROW __attribute_format_strfmon__ (4, 5); +#endif + +#ifdef __LDBL_COMPAT +# include <bits/monetary-ldbl.h> +#endif + +__END_DECLS + +#endif /* monetary.h */ diff --git a/REORG.TODO/stdlib/mp_clz_tab.c b/REORG.TODO/stdlib/mp_clz_tab.c new file mode 100644 index 0000000000..7759ce3abb --- /dev/null +++ b/REORG.TODO/stdlib/mp_clz_tab.c @@ -0,0 +1,36 @@ +/* __clz_tab -- support for longlong.h + Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. Its master source is NOT part of + the C library, however. The master source lives in the GNU MP Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#if 0 +#include <gmp.h> +#include "gmp-impl.h" +#endif + +const +unsigned char __clz_tab[] = +{ + 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, + 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, +}; diff --git a/REORG.TODO/stdlib/mpn2dbl.c b/REORG.TODO/stdlib/mpn2dbl.c new file mode 100644 index 0000000000..0196e50cad --- /dev/null +++ b/REORG.TODO/stdlib/mpn2dbl.c @@ -0,0 +1,29 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <gmp.h> +#include "gmp-impl.h" +#include <float.h> + +/* Convert a multi-precision integer of the needed number of bits and an + integral power of two to a `double'. */ + +double +__mpn_construct_double (mp_srcptr frac_ptr, int expt, int negative) +{ +#error "__mpn_construct_double not implemented for this floating point format" +} diff --git a/REORG.TODO/stdlib/mpn2flt.c b/REORG.TODO/stdlib/mpn2flt.c new file mode 100644 index 0000000000..62a208d6c7 --- /dev/null +++ b/REORG.TODO/stdlib/mpn2flt.c @@ -0,0 +1,29 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include "gmp.h" +#include "gmp-impl.h" +#include <float.h> + +/* Convert a multi-precision integer of the needed number of bits and an + integral power of two to a `float'. */ + +float +__mpn_construct_float (mp_srcptr frac_ptr, int expt, int negative) +{ +#error "__mpn_construct_float not implemented for this floating point format" +} diff --git a/REORG.TODO/stdlib/mpn2ldbl.c b/REORG.TODO/stdlib/mpn2ldbl.c new file mode 100644 index 0000000000..450f9381cc --- /dev/null +++ b/REORG.TODO/stdlib/mpn2ldbl.c @@ -0,0 +1 @@ +/* Empty. Not needed unless ldbl support is in. */ diff --git a/REORG.TODO/stdlib/mrand48.c b/REORG.TODO/stdlib/mrand48.c new file mode 100644 index 0000000000..cbc8aaf786 --- /dev/null +++ b/REORG.TODO/stdlib/mrand48.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + + +long int +mrand48 (void) +{ + long int result; + + (void) __jrand48_r (__libc_drand48_data.__x, &__libc_drand48_data, &result); + + return result; +} diff --git a/REORG.TODO/stdlib/mrand48_r.c b/REORG.TODO/stdlib/mrand48_r.c new file mode 100644 index 0000000000..a674b5b26d --- /dev/null +++ b/REORG.TODO/stdlib/mrand48_r.c @@ -0,0 +1,29 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +int +mrand48_r (struct drand48_data *buffer, long int *result) +{ + /* Be generous for the arguments, detect some errors. */ + if (buffer == NULL) + return -1; + + return __jrand48_r (buffer->__x, buffer, result); +} diff --git a/REORG.TODO/stdlib/msort.c b/REORG.TODO/stdlib/msort.c new file mode 100644 index 0000000000..c00f389601 --- /dev/null +++ b/REORG.TODO/stdlib/msort.c @@ -0,0 +1,310 @@ +/* An alternative to qsort, with an identical interface. + This file is part of the GNU C Library. + Copyright (C) 1992-2017 Free Software Foundation, Inc. + Written by Mike Haertel, September 1988. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <alloca.h> +#include <stdint.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <memcopy.h> +#include <errno.h> +#include <atomic.h> + +struct msort_param +{ + size_t s; + size_t var; + __compar_d_fn_t cmp; + void *arg; + char *t; +}; +static void msort_with_tmp (const struct msort_param *p, void *b, size_t n); + +static void +msort_with_tmp (const struct msort_param *p, void *b, size_t n) +{ + char *b1, *b2; + size_t n1, n2; + + if (n <= 1) + return; + + n1 = n / 2; + n2 = n - n1; + b1 = b; + b2 = (char *) b + (n1 * p->s); + + msort_with_tmp (p, b1, n1); + msort_with_tmp (p, b2, n2); + + char *tmp = p->t; + const size_t s = p->s; + __compar_d_fn_t cmp = p->cmp; + void *arg = p->arg; + switch (p->var) + { + case 0: + while (n1 > 0 && n2 > 0) + { + if ((*cmp) (b1, b2, arg) <= 0) + { + *(uint32_t *) tmp = *(uint32_t *) b1; + b1 += sizeof (uint32_t); + --n1; + } + else + { + *(uint32_t *) tmp = *(uint32_t *) b2; + b2 += sizeof (uint32_t); + --n2; + } + tmp += sizeof (uint32_t); + } + break; + case 1: + while (n1 > 0 && n2 > 0) + { + if ((*cmp) (b1, b2, arg) <= 0) + { + *(uint64_t *) tmp = *(uint64_t *) b1; + b1 += sizeof (uint64_t); + --n1; + } + else + { + *(uint64_t *) tmp = *(uint64_t *) b2; + b2 += sizeof (uint64_t); + --n2; + } + tmp += sizeof (uint64_t); + } + break; + case 2: + while (n1 > 0 && n2 > 0) + { + unsigned long *tmpl = (unsigned long *) tmp; + unsigned long *bl; + + tmp += s; + if ((*cmp) (b1, b2, arg) <= 0) + { + bl = (unsigned long *) b1; + b1 += s; + --n1; + } + else + { + bl = (unsigned long *) b2; + b2 += s; + --n2; + } + while (tmpl < (unsigned long *) tmp) + *tmpl++ = *bl++; + } + break; + case 3: + while (n1 > 0 && n2 > 0) + { + if ((*cmp) (*(const void **) b1, *(const void **) b2, arg) <= 0) + { + *(void **) tmp = *(void **) b1; + b1 += sizeof (void *); + --n1; + } + else + { + *(void **) tmp = *(void **) b2; + b2 += sizeof (void *); + --n2; + } + tmp += sizeof (void *); + } + break; + default: + while (n1 > 0 && n2 > 0) + { + if ((*cmp) (b1, b2, arg) <= 0) + { + tmp = (char *) __mempcpy (tmp, b1, s); + b1 += s; + --n1; + } + else + { + tmp = (char *) __mempcpy (tmp, b2, s); + b2 += s; + --n2; + } + } + break; + } + + if (n1 > 0) + memcpy (tmp, b1, n1 * s); + memcpy (b, p->t, (n - n2) * s); +} + + +void +__qsort_r (void *b, size_t n, size_t s, __compar_d_fn_t cmp, void *arg) +{ + size_t size = n * s; + char *tmp = NULL; + struct msort_param p; + + /* For large object sizes use indirect sorting. */ + if (s > 32) + size = 2 * n * sizeof (void *) + s; + + if (size < 1024) + /* The temporary array is small, so put it on the stack. */ + p.t = __alloca (size); + else + { + /* We should avoid allocating too much memory since this might + have to be backed up by swap space. */ + static long int phys_pages; + static int pagesize; + + if (pagesize == 0) + { + phys_pages = __sysconf (_SC_PHYS_PAGES); + + if (phys_pages == -1) + /* Error while determining the memory size. So let's + assume there is enough memory. Otherwise the + implementer should provide a complete implementation of + the `sysconf' function. */ + phys_pages = (long int) (~0ul >> 1); + + /* The following determines that we will never use more than + a quarter of the physical memory. */ + phys_pages /= 4; + + /* Make sure phys_pages is written to memory. */ + atomic_write_barrier (); + + pagesize = __sysconf (_SC_PAGESIZE); + } + + /* Just a comment here. We cannot compute + phys_pages * pagesize + and compare the needed amount of memory against this value. + The problem is that some systems might have more physical + memory then can be represented with a `size_t' value (when + measured in bytes. */ + + /* If the memory requirements are too high don't allocate memory. */ + if (size / pagesize > (size_t) phys_pages) + { + _quicksort (b, n, s, cmp, arg); + return; + } + + /* It's somewhat large, so malloc it. */ + int save = errno; + tmp = malloc (size); + __set_errno (save); + if (tmp == NULL) + { + /* Couldn't get space, so use the slower algorithm + that doesn't need a temporary array. */ + _quicksort (b, n, s, cmp, arg); + return; + } + p.t = tmp; + } + + p.s = s; + p.var = 4; + p.cmp = cmp; + p.arg = arg; + + if (s > 32) + { + /* Indirect sorting. */ + char *ip = (char *) b; + void **tp = (void **) (p.t + n * sizeof (void *)); + void **t = tp; + void *tmp_storage = (void *) (tp + n); + + while ((void *) t < tmp_storage) + { + *t++ = ip; + ip += s; + } + p.s = sizeof (void *); + p.var = 3; + msort_with_tmp (&p, p.t + n * sizeof (void *), n); + + /* tp[0] .. tp[n - 1] is now sorted, copy around entries of + the original array. Knuth vol. 3 (2nd ed.) exercise 5.2-10. */ + char *kp; + size_t i; + for (i = 0, ip = (char *) b; i < n; i++, ip += s) + if ((kp = tp[i]) != ip) + { + size_t j = i; + char *jp = ip; + memcpy (tmp_storage, ip, s); + + do + { + size_t k = (kp - (char *) b) / s; + tp[j] = jp; + memcpy (jp, kp, s); + j = k; + jp = kp; + kp = tp[k]; + } + while (kp != ip); + + tp[j] = jp; + memcpy (jp, tmp_storage, s); + } + } + else + { + if ((s & (sizeof (uint32_t) - 1)) == 0 + && ((char *) b - (char *) 0) % __alignof__ (uint32_t) == 0) + { + if (s == sizeof (uint32_t)) + p.var = 0; + else if (s == sizeof (uint64_t) + && ((char *) b - (char *) 0) % __alignof__ (uint64_t) == 0) + p.var = 1; + else if ((s & (sizeof (unsigned long) - 1)) == 0 + && ((char *) b - (char *) 0) + % __alignof__ (unsigned long) == 0) + p.var = 2; + } + msort_with_tmp (&p, b, n); + } + free (tmp); +} +libc_hidden_def (__qsort_r) +weak_alias (__qsort_r, qsort_r) + + +void +qsort (void *b, size_t n, size_t s, __compar_fn_t cmp) +{ + return __qsort_r (b, n, s, (__compar_d_fn_t) cmp, NULL); +} +libc_hidden_def (qsort) diff --git a/REORG.TODO/stdlib/mul.c b/REORG.TODO/stdlib/mul.c new file mode 100644 index 0000000000..88ba1c5176 --- /dev/null +++ b/REORG.TODO/stdlib/mul.c @@ -0,0 +1,142 @@ +/* mpn_mul -- Multiply two natural numbers. + +Copyright (C) 1991-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library; see the file COPYING.LIB. If not, see +<http://www.gnu.org/licenses/>. */ + +#include <gmp.h> +#include "gmp-impl.h" + +/* Multiply the natural numbers u (pointed to by UP, with USIZE limbs) + and v (pointed to by VP, with VSIZE limbs), and store the result at + PRODP. USIZE + VSIZE limbs are always stored, but if the input + operands are normalized. Return the most significant limb of the + result. + + NOTE: The space pointed to by PRODP is overwritten before finished + with U and V, so overlap is an error. + + Argument constraints: + 1. USIZE >= VSIZE. + 2. PRODP != UP and PRODP != VP, i.e. the destination + must be distinct from the multiplier and the multiplicand. */ + +/* If KARATSUBA_THRESHOLD is not already defined, define it to a + value which is good on most machines. */ +#ifndef KARATSUBA_THRESHOLD +#define KARATSUBA_THRESHOLD 32 +#endif + +mp_limb_t +mpn_mul (mp_ptr prodp, + mp_srcptr up, mp_size_t usize, + mp_srcptr vp, mp_size_t vsize) +{ + mp_ptr prod_endp = prodp + usize + vsize - 1; + mp_limb_t cy; + mp_ptr tspace; + TMP_DECL (marker); + + if (vsize < KARATSUBA_THRESHOLD) + { + /* Handle simple cases with traditional multiplication. + + This is the most critical code of the entire function. All + multiplies rely on this, both small and huge. Small ones arrive + here immediately. Huge ones arrive here as this is the base case + for Karatsuba's recursive algorithm below. */ + mp_size_t i; + mp_limb_t cy_limb; + mp_limb_t v_limb; + + if (vsize == 0) + return 0; + + /* Multiply by the first limb in V separately, as the result can be + stored (not added) to PROD. We also avoid a loop for zeroing. */ + v_limb = vp[0]; + if (v_limb <= 1) + { + if (v_limb == 1) + MPN_COPY (prodp, up, usize); + else + MPN_ZERO (prodp, usize); + cy_limb = 0; + } + else + cy_limb = mpn_mul_1 (prodp, up, usize, v_limb); + + prodp[usize] = cy_limb; + prodp++; + + /* For each iteration in the outer loop, multiply one limb from + U with one limb from V, and add it to PROD. */ + for (i = 1; i < vsize; i++) + { + v_limb = vp[i]; + if (v_limb <= 1) + { + cy_limb = 0; + if (v_limb == 1) + cy_limb = mpn_add_n (prodp, prodp, up, usize); + } + else + cy_limb = mpn_addmul_1 (prodp, up, usize, v_limb); + + prodp[usize] = cy_limb; + prodp++; + } + return cy_limb; + } + + TMP_MARK (marker); + + tspace = (mp_ptr) TMP_ALLOC (2 * vsize * BYTES_PER_MP_LIMB); + MPN_MUL_N_RECURSE (prodp, up, vp, vsize, tspace); + + prodp += vsize; + up += vsize; + usize -= vsize; + if (usize >= vsize) + { + mp_ptr tp = (mp_ptr) TMP_ALLOC (2 * vsize * BYTES_PER_MP_LIMB); + do + { + MPN_MUL_N_RECURSE (tp, up, vp, vsize, tspace); + cy = mpn_add_n (prodp, prodp, tp, vsize); + mpn_add_1 (prodp + vsize, tp + vsize, vsize, cy); + prodp += vsize; + up += vsize; + usize -= vsize; + } + while (usize >= vsize); + } + + /* True: usize < vsize. */ + + /* Make life simple: Recurse. */ + + if (usize != 0) + { + mpn_mul (tspace, vp, vsize, up, usize); + cy = mpn_add_n (prodp, prodp, tspace, vsize); + mpn_add_1 (prodp + vsize, tspace + vsize, usize, cy); + } + + TMP_FREE (marker); + return *prod_endp; +} diff --git a/REORG.TODO/stdlib/mul_1.c b/REORG.TODO/stdlib/mul_1.c new file mode 100644 index 0000000000..2c590d2741 --- /dev/null +++ b/REORG.TODO/stdlib/mul_1.c @@ -0,0 +1,55 @@ +/* mpn_mul_1 -- Multiply a limb vector with a single limb and + store the product in a second limb vector. + +Copyright (C) 1991-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library; see the file COPYING.LIB. If not, see +<http://www.gnu.org/licenses/>. */ + +#include <gmp.h> +#include "gmp-impl.h" +#include "longlong.h" + +mp_limb_t +mpn_mul_1 (register mp_ptr res_ptr, register mp_srcptr s1_ptr, + mp_size_t s1_size, register mp_limb_t s2_limb) +{ + register mp_limb_t cy_limb; + register mp_size_t j; + register mp_limb_t prod_high, prod_low; + + /* The loop counter and index J goes from -S1_SIZE to -1. This way + the loop becomes faster. */ + j = -s1_size; + + /* Offset the base pointers to compensate for the negative indices. */ + s1_ptr -= j; + res_ptr -= j; + + cy_limb = 0; + do + { + umul_ppmm (prod_high, prod_low, s1_ptr[j], s2_limb); + + prod_low += cy_limb; + cy_limb = (prod_low < cy_limb) + prod_high; + + res_ptr[j] = prod_low; + } + while (++j != 0); + + return cy_limb; +} diff --git a/REORG.TODO/stdlib/mul_n.c b/REORG.TODO/stdlib/mul_n.c new file mode 100644 index 0000000000..cf243242cc --- /dev/null +++ b/REORG.TODO/stdlib/mul_n.c @@ -0,0 +1,360 @@ +/* mpn_mul_n -- Multiply two natural numbers of length n. + +Copyright (C) 1991-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library; see the file COPYING.LIB. If not, see +<http://www.gnu.org/licenses/>. */ + +#include <gmp.h> +#include "gmp-impl.h" + +/* Multiply the natural numbers u (pointed to by UP) and v (pointed to by VP), + both with SIZE limbs, and store the result at PRODP. 2 * SIZE limbs are + always stored. Return the most significant limb. + + Argument constraints: + 1. PRODP != UP and PRODP != VP, i.e. the destination + must be distinct from the multiplier and the multiplicand. */ + +/* If KARATSUBA_THRESHOLD is not already defined, define it to a + value which is good on most machines. */ +#ifndef KARATSUBA_THRESHOLD +#define KARATSUBA_THRESHOLD 32 +#endif + +/* The code can't handle KARATSUBA_THRESHOLD smaller than 2. */ +#if KARATSUBA_THRESHOLD < 2 +#undef KARATSUBA_THRESHOLD +#define KARATSUBA_THRESHOLD 2 +#endif + +/* Handle simple cases with traditional multiplication. + + This is the most critical code of multiplication. All multiplies rely + on this, both small and huge. Small ones arrive here immediately. Huge + ones arrive here as this is the base case for Karatsuba's recursive + algorithm below. */ + +void +impn_mul_n_basecase (mp_ptr prodp, mp_srcptr up, mp_srcptr vp, mp_size_t size) +{ + mp_size_t i; + mp_limb_t cy_limb; + mp_limb_t v_limb; + + /* Multiply by the first limb in V separately, as the result can be + stored (not added) to PROD. We also avoid a loop for zeroing. */ + v_limb = vp[0]; + if (v_limb <= 1) + { + if (v_limb == 1) + MPN_COPY (prodp, up, size); + else + MPN_ZERO (prodp, size); + cy_limb = 0; + } + else + cy_limb = mpn_mul_1 (prodp, up, size, v_limb); + + prodp[size] = cy_limb; + prodp++; + + /* For each iteration in the outer loop, multiply one limb from + U with one limb from V, and add it to PROD. */ + for (i = 1; i < size; i++) + { + v_limb = vp[i]; + if (v_limb <= 1) + { + cy_limb = 0; + if (v_limb == 1) + cy_limb = mpn_add_n (prodp, prodp, up, size); + } + else + cy_limb = mpn_addmul_1 (prodp, up, size, v_limb); + + prodp[size] = cy_limb; + prodp++; + } +} + +void +impn_mul_n (mp_ptr prodp, + mp_srcptr up, mp_srcptr vp, mp_size_t size, mp_ptr tspace) +{ + if ((size & 1) != 0) + { + /* The size is odd, the code code below doesn't handle that. + Multiply the least significant (size - 1) limbs with a recursive + call, and handle the most significant limb of S1 and S2 + separately. */ + /* A slightly faster way to do this would be to make the Karatsuba + code below behave as if the size were even, and let it check for + odd size in the end. I.e., in essence move this code to the end. + Doing so would save us a recursive call, and potentially make the + stack grow a lot less. */ + + mp_size_t esize = size - 1; /* even size */ + mp_limb_t cy_limb; + + MPN_MUL_N_RECURSE (prodp, up, vp, esize, tspace); + cy_limb = mpn_addmul_1 (prodp + esize, up, esize, vp[esize]); + prodp[esize + esize] = cy_limb; + cy_limb = mpn_addmul_1 (prodp + esize, vp, size, up[esize]); + + prodp[esize + size] = cy_limb; + } + else + { + /* Anatolij Alekseevich Karatsuba's divide-and-conquer algorithm. + + Split U in two pieces, U1 and U0, such that + U = U0 + U1*(B**n), + and V in V1 and V0, such that + V = V0 + V1*(B**n). + + UV is then computed recursively using the identity + + 2n n n n + UV = (B + B )U V + B (U -U )(V -V ) + (B + 1)U V + 1 1 1 0 0 1 0 0 + + Where B = 2**BITS_PER_MP_LIMB. */ + + mp_size_t hsize = size >> 1; + mp_limb_t cy; + int negflg; + + /*** Product H. ________________ ________________ + |_____U1 x V1____||____U0 x V0_____| */ + /* Put result in upper part of PROD and pass low part of TSPACE + as new TSPACE. */ + MPN_MUL_N_RECURSE (prodp + size, up + hsize, vp + hsize, hsize, tspace); + + /*** Product M. ________________ + |_(U1-U0)(V0-V1)_| */ + if (mpn_cmp (up + hsize, up, hsize) >= 0) + { + mpn_sub_n (prodp, up + hsize, up, hsize); + negflg = 0; + } + else + { + mpn_sub_n (prodp, up, up + hsize, hsize); + negflg = 1; + } + if (mpn_cmp (vp + hsize, vp, hsize) >= 0) + { + mpn_sub_n (prodp + hsize, vp + hsize, vp, hsize); + negflg ^= 1; + } + else + { + mpn_sub_n (prodp + hsize, vp, vp + hsize, hsize); + /* No change of NEGFLG. */ + } + /* Read temporary operands from low part of PROD. + Put result in low part of TSPACE using upper part of TSPACE + as new TSPACE. */ + MPN_MUL_N_RECURSE (tspace, prodp, prodp + hsize, hsize, tspace + size); + + /*** Add/copy product H. */ + MPN_COPY (prodp + hsize, prodp + size, hsize); + cy = mpn_add_n (prodp + size, prodp + size, prodp + size + hsize, hsize); + + /*** Add product M (if NEGFLG M is a negative number). */ + if (negflg) + cy -= mpn_sub_n (prodp + hsize, prodp + hsize, tspace, size); + else + cy += mpn_add_n (prodp + hsize, prodp + hsize, tspace, size); + + /*** Product L. ________________ ________________ + |________________||____U0 x V0_____| */ + /* Read temporary operands from low part of PROD. + Put result in low part of TSPACE using upper part of TSPACE + as new TSPACE. */ + MPN_MUL_N_RECURSE (tspace, up, vp, hsize, tspace + size); + + /*** Add/copy Product L (twice). */ + + cy += mpn_add_n (prodp + hsize, prodp + hsize, tspace, size); + if (cy) + mpn_add_1 (prodp + hsize + size, prodp + hsize + size, hsize, cy); + + MPN_COPY (prodp, tspace, hsize); + cy = mpn_add_n (prodp + hsize, prodp + hsize, tspace + hsize, hsize); + if (cy) + mpn_add_1 (prodp + size, prodp + size, size, 1); + } +} + +void +impn_sqr_n_basecase (mp_ptr prodp, mp_srcptr up, mp_size_t size) +{ + mp_size_t i; + mp_limb_t cy_limb; + mp_limb_t v_limb; + + /* Multiply by the first limb in V separately, as the result can be + stored (not added) to PROD. We also avoid a loop for zeroing. */ + v_limb = up[0]; + if (v_limb <= 1) + { + if (v_limb == 1) + MPN_COPY (prodp, up, size); + else + MPN_ZERO (prodp, size); + cy_limb = 0; + } + else + cy_limb = mpn_mul_1 (prodp, up, size, v_limb); + + prodp[size] = cy_limb; + prodp++; + + /* For each iteration in the outer loop, multiply one limb from + U with one limb from V, and add it to PROD. */ + for (i = 1; i < size; i++) + { + v_limb = up[i]; + if (v_limb <= 1) + { + cy_limb = 0; + if (v_limb == 1) + cy_limb = mpn_add_n (prodp, prodp, up, size); + } + else + cy_limb = mpn_addmul_1 (prodp, up, size, v_limb); + + prodp[size] = cy_limb; + prodp++; + } +} + +void +impn_sqr_n (mp_ptr prodp, + mp_srcptr up, mp_size_t size, mp_ptr tspace) +{ + if ((size & 1) != 0) + { + /* The size is odd, the code code below doesn't handle that. + Multiply the least significant (size - 1) limbs with a recursive + call, and handle the most significant limb of S1 and S2 + separately. */ + /* A slightly faster way to do this would be to make the Karatsuba + code below behave as if the size were even, and let it check for + odd size in the end. I.e., in essence move this code to the end. + Doing so would save us a recursive call, and potentially make the + stack grow a lot less. */ + + mp_size_t esize = size - 1; /* even size */ + mp_limb_t cy_limb; + + MPN_SQR_N_RECURSE (prodp, up, esize, tspace); + cy_limb = mpn_addmul_1 (prodp + esize, up, esize, up[esize]); + prodp[esize + esize] = cy_limb; + cy_limb = mpn_addmul_1 (prodp + esize, up, size, up[esize]); + + prodp[esize + size] = cy_limb; + } + else + { + mp_size_t hsize = size >> 1; + mp_limb_t cy; + + /*** Product H. ________________ ________________ + |_____U1 x U1____||____U0 x U0_____| */ + /* Put result in upper part of PROD and pass low part of TSPACE + as new TSPACE. */ + MPN_SQR_N_RECURSE (prodp + size, up + hsize, hsize, tspace); + + /*** Product M. ________________ + |_(U1-U0)(U0-U1)_| */ + if (mpn_cmp (up + hsize, up, hsize) >= 0) + { + mpn_sub_n (prodp, up + hsize, up, hsize); + } + else + { + mpn_sub_n (prodp, up, up + hsize, hsize); + } + + /* Read temporary operands from low part of PROD. + Put result in low part of TSPACE using upper part of TSPACE + as new TSPACE. */ + MPN_SQR_N_RECURSE (tspace, prodp, hsize, tspace + size); + + /*** Add/copy product H. */ + MPN_COPY (prodp + hsize, prodp + size, hsize); + cy = mpn_add_n (prodp + size, prodp + size, prodp + size + hsize, hsize); + + /*** Add product M (if NEGFLG M is a negative number). */ + cy -= mpn_sub_n (prodp + hsize, prodp + hsize, tspace, size); + + /*** Product L. ________________ ________________ + |________________||____U0 x U0_____| */ + /* Read temporary operands from low part of PROD. + Put result in low part of TSPACE using upper part of TSPACE + as new TSPACE. */ + MPN_SQR_N_RECURSE (tspace, up, hsize, tspace + size); + + /*** Add/copy Product L (twice). */ + + cy += mpn_add_n (prodp + hsize, prodp + hsize, tspace, size); + if (cy) + mpn_add_1 (prodp + hsize + size, prodp + hsize + size, hsize, cy); + + MPN_COPY (prodp, tspace, hsize); + cy = mpn_add_n (prodp + hsize, prodp + hsize, tspace + hsize, hsize); + if (cy) + mpn_add_1 (prodp + size, prodp + size, size, 1); + } +} + +/* This should be made into an inline function in gmp.h. */ +void +mpn_mul_n (mp_ptr prodp, mp_srcptr up, mp_srcptr vp, mp_size_t size) +{ + TMP_DECL (marker); + TMP_MARK (marker); + if (up == vp) + { + if (size < KARATSUBA_THRESHOLD) + { + impn_sqr_n_basecase (prodp, up, size); + } + else + { + mp_ptr tspace; + tspace = (mp_ptr) TMP_ALLOC (2 * size * BYTES_PER_MP_LIMB); + impn_sqr_n (prodp, up, size, tspace); + } + } + else + { + if (size < KARATSUBA_THRESHOLD) + { + impn_mul_n_basecase (prodp, up, vp, size); + } + else + { + mp_ptr tspace; + tspace = (mp_ptr) TMP_ALLOC (2 * size * BYTES_PER_MP_LIMB); + impn_mul_n (prodp, up, vp, size, tspace); + } + } + TMP_FREE (marker); +} diff --git a/REORG.TODO/stdlib/nrand48.c b/REORG.TODO/stdlib/nrand48.c new file mode 100644 index 0000000000..9fdc62ff5f --- /dev/null +++ b/REORG.TODO/stdlib/nrand48.c @@ -0,0 +1,30 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + + +long int +nrand48 (unsigned short int xsubi[3]) +{ + long int result; + + (void) __nrand48_r (xsubi, &__libc_drand48_data, &result); + + return result; +} diff --git a/REORG.TODO/stdlib/nrand48_r.c b/REORG.TODO/stdlib/nrand48_r.c new file mode 100644 index 0000000000..e6f385d907 --- /dev/null +++ b/REORG.TODO/stdlib/nrand48_r.c @@ -0,0 +1,37 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +int +__nrand48_r (unsigned short int xsubi[3], struct drand48_data *buffer, + long int *result) +{ + /* Compute next state. */ + if (__drand48_iterate (xsubi, buffer) < 0) + return -1; + + /* Store the result. */ + if (sizeof (unsigned short int) == 2) + *result = xsubi[2] << 15 | xsubi[1] >> 1; + else + *result = xsubi[2] >> 1; + + return 0; +} +weak_alias (__nrand48_r, nrand48_r) diff --git a/REORG.TODO/stdlib/old_atexit.c b/REORG.TODO/stdlib/old_atexit.c new file mode 100644 index 0000000000..44bbd699bd --- /dev/null +++ b/REORG.TODO/stdlib/old_atexit.c @@ -0,0 +1,8 @@ +#include <shlib-compat.h> + +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2_2) +# define atexit attribute_compat_text_section __dyn_atexit +# include "atexit.c" +# undef atexit +compat_symbol (libc, __dyn_atexit, atexit, GLIBC_2_0); +#endif diff --git a/REORG.TODO/stdlib/on_exit.c b/REORG.TODO/stdlib/on_exit.c new file mode 100644 index 0000000000..83845e76d8 --- /dev/null +++ b/REORG.TODO/stdlib/on_exit.c @@ -0,0 +1,41 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include "exit.h" +#include <atomic.h> +#include <sysdep.h> + +/* Register a function to be called by exit. */ +int +__on_exit (void (*func) (int status, void *arg), void *arg) +{ + struct exit_function *new = __new_exitfn (&__exit_funcs); + + if (new == NULL) + return -1; + +#ifdef PTR_MANGLE + PTR_MANGLE (func); +#endif + new->func.on.fn = func; + new->func.on.arg = arg; + atomic_write_barrier (); + new->flavor = ef_on; + return 0; +} +weak_alias (__on_exit, on_exit) diff --git a/REORG.TODO/stdlib/putenv.c b/REORG.TODO/stdlib/putenv.c new file mode 100644 index 0000000000..c0488fc505 --- /dev/null +++ b/REORG.TODO/stdlib/putenv.c @@ -0,0 +1,87 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#if defined _AIX && !defined __GNUC__ + #pragma alloca +#endif + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#if _LIBC || HAVE_STDLIB_H +# include <stdlib.h> +#endif +#if _LIBC || HAVE_STRING_H +# include <string.h> +#endif + +#if !__GNU_LIBRARY__ && !HAVE_STRCHR +# define strchr index +#endif + +#ifndef _LIBC +# ifdef HAVE_ALLOCA_H +# include <alloca.h> +# else +# ifdef __GNUC__ +# define alloca __builtin_alloca +# else +extern char *alloca (); +# endif /* __GNUC__ */ +# endif /* HAVE_ALLOCA_H */ +#endif /* _LIBC */ + + +/* Put STRING, which is of the form "NAME=VALUE", in the environment. */ +int +putenv (char *string) +{ + const char *const name_end = strchr (string, '='); + + if (name_end != NULL) + { + char *name; +#ifdef _LIBC + int use_malloc = !__libc_use_alloca (name_end - string + 1); + if (__builtin_expect (use_malloc, 0)) + { + name = __strndup (string, name_end - string); + if (name == NULL) + return -1; + } + else + name = strndupa (string, name_end - string); +#else +# define use_malloc 1 + name = malloc (name_end - string + 1); + if (name == NULL) + return -1; + memcpy (name, string, name_end - string); + name[name_end - string] = '\0'; +#endif + int result = __add_to_environ (name, NULL, string, 1); + + if (__glibc_unlikely (use_malloc)) + free (name); + + return result; + } + + __unsetenv (string); + return 0; +} diff --git a/REORG.TODO/stdlib/qsort.c b/REORG.TODO/stdlib/qsort.c new file mode 100644 index 0000000000..9badf33ec0 --- /dev/null +++ b/REORG.TODO/stdlib/qsort.c @@ -0,0 +1,249 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Written by Douglas C. Schmidt (schmidt@ics.uci.edu). + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* If you consider tuning this algorithm, you should consult first: + Engineering a sort function; Jon Bentley and M. Douglas McIlroy; + Software - Practice and Experience; Vol. 23 (11), 1249-1265, 1993. */ + +#include <alloca.h> +#include <limits.h> +#include <stdlib.h> +#include <string.h> + +/* Byte-wise swap two items of size SIZE. */ +#define SWAP(a, b, size) \ + do \ + { \ + size_t __size = (size); \ + char *__a = (a), *__b = (b); \ + do \ + { \ + char __tmp = *__a; \ + *__a++ = *__b; \ + *__b++ = __tmp; \ + } while (--__size > 0); \ + } while (0) + +/* Discontinue quicksort algorithm when partition gets below this size. + This particular magic number was chosen to work best on a Sun 4/260. */ +#define MAX_THRESH 4 + +/* Stack node declarations used to store unfulfilled partition obligations. */ +typedef struct + { + char *lo; + char *hi; + } stack_node; + +/* The next 4 #defines implement a very fast in-line stack abstraction. */ +/* The stack needs log (total_elements) entries (we could even subtract + log(MAX_THRESH)). Since total_elements has type size_t, we get as + upper bound for log (total_elements): + bits per byte (CHAR_BIT) * sizeof(size_t). */ +#define STACK_SIZE (CHAR_BIT * sizeof(size_t)) +#define PUSH(low, high) ((void) ((top->lo = (low)), (top->hi = (high)), ++top)) +#define POP(low, high) ((void) (--top, (low = top->lo), (high = top->hi))) +#define STACK_NOT_EMPTY (stack < top) + + +/* Order size using quicksort. This implementation incorporates + four optimizations discussed in Sedgewick: + + 1. Non-recursive, using an explicit stack of pointer that store the + next array partition to sort. To save time, this maximum amount + of space required to store an array of SIZE_MAX is allocated on the + stack. Assuming a 32-bit (64 bit) integer for size_t, this needs + only 32 * sizeof(stack_node) == 256 bytes (for 64 bit: 1024 bytes). + Pretty cheap, actually. + + 2. Chose the pivot element using a median-of-three decision tree. + This reduces the probability of selecting a bad pivot value and + eliminates certain extraneous comparisons. + + 3. Only quicksorts TOTAL_ELEMS / MAX_THRESH partitions, leaving + insertion sort to order the MAX_THRESH items within each partition. + This is a big win, since insertion sort is faster for small, mostly + sorted array segments. + + 4. The larger of the two sub-partitions is always pushed onto the + stack first, with the algorithm then concentrating on the + smaller partition. This *guarantees* no more than log (total_elems) + stack size is needed (actually O(1) in this case)! */ + +void +_quicksort (void *const pbase, size_t total_elems, size_t size, + __compar_d_fn_t cmp, void *arg) +{ + char *base_ptr = (char *) pbase; + + const size_t max_thresh = MAX_THRESH * size; + + if (total_elems == 0) + /* Avoid lossage with unsigned arithmetic below. */ + return; + + if (total_elems > MAX_THRESH) + { + char *lo = base_ptr; + char *hi = &lo[size * (total_elems - 1)]; + stack_node stack[STACK_SIZE]; + stack_node *top = stack; + + PUSH (NULL, NULL); + + while (STACK_NOT_EMPTY) + { + char *left_ptr; + char *right_ptr; + + /* Select median value from among LO, MID, and HI. Rearrange + LO and HI so the three values are sorted. This lowers the + probability of picking a pathological pivot value and + skips a comparison for both the LEFT_PTR and RIGHT_PTR in + the while loops. */ + + char *mid = lo + size * ((hi - lo) / size >> 1); + + if ((*cmp) ((void *) mid, (void *) lo, arg) < 0) + SWAP (mid, lo, size); + if ((*cmp) ((void *) hi, (void *) mid, arg) < 0) + SWAP (mid, hi, size); + else + goto jump_over; + if ((*cmp) ((void *) mid, (void *) lo, arg) < 0) + SWAP (mid, lo, size); + jump_over:; + + left_ptr = lo + size; + right_ptr = hi - size; + + /* Here's the famous ``collapse the walls'' section of quicksort. + Gotta like those tight inner loops! They are the main reason + that this algorithm runs much faster than others. */ + do + { + while ((*cmp) ((void *) left_ptr, (void *) mid, arg) < 0) + left_ptr += size; + + while ((*cmp) ((void *) mid, (void *) right_ptr, arg) < 0) + right_ptr -= size; + + if (left_ptr < right_ptr) + { + SWAP (left_ptr, right_ptr, size); + if (mid == left_ptr) + mid = right_ptr; + else if (mid == right_ptr) + mid = left_ptr; + left_ptr += size; + right_ptr -= size; + } + else if (left_ptr == right_ptr) + { + left_ptr += size; + right_ptr -= size; + break; + } + } + while (left_ptr <= right_ptr); + + /* Set up pointers for next iteration. First determine whether + left and right partitions are below the threshold size. If so, + ignore one or both. Otherwise, push the larger partition's + bounds on the stack and continue sorting the smaller one. */ + + if ((size_t) (right_ptr - lo) <= max_thresh) + { + if ((size_t) (hi - left_ptr) <= max_thresh) + /* Ignore both small partitions. */ + POP (lo, hi); + else + /* Ignore small left partition. */ + lo = left_ptr; + } + else if ((size_t) (hi - left_ptr) <= max_thresh) + /* Ignore small right partition. */ + hi = right_ptr; + else if ((right_ptr - lo) > (hi - left_ptr)) + { + /* Push larger left partition indices. */ + PUSH (lo, right_ptr); + lo = left_ptr; + } + else + { + /* Push larger right partition indices. */ + PUSH (left_ptr, hi); + hi = right_ptr; + } + } + } + + /* Once the BASE_PTR array is partially sorted by quicksort the rest + is completely sorted using insertion sort, since this is efficient + for partitions below MAX_THRESH size. BASE_PTR points to the beginning + of the array to sort, and END_PTR points at the very last element in + the array (*not* one beyond it!). */ + +#define min(x, y) ((x) < (y) ? (x) : (y)) + + { + char *const end_ptr = &base_ptr[size * (total_elems - 1)]; + char *tmp_ptr = base_ptr; + char *thresh = min(end_ptr, base_ptr + max_thresh); + char *run_ptr; + + /* Find smallest element in first threshold and place it at the + array's beginning. This is the smallest array element, + and the operation speeds up insertion sort's inner loop. */ + + for (run_ptr = tmp_ptr + size; run_ptr <= thresh; run_ptr += size) + if ((*cmp) ((void *) run_ptr, (void *) tmp_ptr, arg) < 0) + tmp_ptr = run_ptr; + + if (tmp_ptr != base_ptr) + SWAP (tmp_ptr, base_ptr, size); + + /* Insertion sort, running from left-hand-side up to right-hand-side. */ + + run_ptr = base_ptr + size; + while ((run_ptr += size) <= end_ptr) + { + tmp_ptr = run_ptr - size; + while ((*cmp) ((void *) run_ptr, (void *) tmp_ptr, arg) < 0) + tmp_ptr -= size; + + tmp_ptr += size; + if (tmp_ptr != run_ptr) + { + char *trav; + + trav = run_ptr + size; + while (--trav >= run_ptr) + { + char c = *trav; + char *hi, *lo; + + for (hi = lo = trav; (lo -= size) >= tmp_ptr; hi = lo) + *hi = *lo; + *hi = c; + } + } + } + } +} diff --git a/REORG.TODO/stdlib/quick_exit.c b/REORG.TODO/stdlib/quick_exit.c new file mode 100644 index 0000000000..67ad043727 --- /dev/null +++ b/REORG.TODO/stdlib/quick_exit.c @@ -0,0 +1,48 @@ +/* Copyright (C) 2009-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sysdep.h> +#include <signal.h> +#include <errno.h> +#include <shlib-compat.h> +#include "exit.h" + +void +__new_quick_exit (int status) +{ + /* The new quick_exit, following C++11 18.5.12, does not run object + destructors. While C11 says nothing about object destructors, + since it has none, the intent is to run the registered + at_quick_exit handlers and then run _Exit immediately without + disturbing the state of the process and threads. */ + __run_exit_handlers (status, &__quick_exit_funcs, false, false); +} +versioned_symbol (libc, __new_quick_exit, quick_exit, GLIBC_2_24); + +#if SHLIB_COMPAT(libc, GLIBC_2_10, GLIBC_2_24) +void +attribute_compat_text_section +__old_quick_exit (int status) +{ + /* The old quick_exit runs thread_local destructors. */ + __run_exit_handlers (status, &__quick_exit_funcs, false, true); +} +compat_symbol (libc, __old_quick_exit, quick_exit, GLIBC_2_10); +#endif diff --git a/REORG.TODO/stdlib/rand.c b/REORG.TODO/stdlib/rand.c new file mode 100644 index 0000000000..a036319ce7 --- /dev/null +++ b/REORG.TODO/stdlib/rand.c @@ -0,0 +1,28 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +#undef rand + + +/* Return a random integer between 0 and RAND_MAX. */ +int +rand (void) +{ + return (int) __random (); +} diff --git a/REORG.TODO/stdlib/rand_r.c b/REORG.TODO/stdlib/rand_r.c new file mode 100644 index 0000000000..ca681e8b53 --- /dev/null +++ b/REORG.TODO/stdlib/rand_r.c @@ -0,0 +1,48 @@ +/* Reentrant random function from POSIX.1c. + Copyright (C) 1996-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + + +/* This algorithm is mentioned in the ISO C standard, here extended + for 32 bits. */ +int +rand_r (unsigned int *seed) +{ + unsigned int next = *seed; + int result; + + next *= 1103515245; + next += 12345; + result = (unsigned int) (next / 65536) % 2048; + + next *= 1103515245; + next += 12345; + result <<= 10; + result ^= (unsigned int) (next / 65536) % 1024; + + next *= 1103515245; + next += 12345; + result <<= 10; + result ^= (unsigned int) (next / 65536) % 1024; + + *seed = next; + + return result; +} diff --git a/REORG.TODO/stdlib/random.c b/REORG.TODO/stdlib/random.c new file mode 100644 index 0000000000..43bdb1232e --- /dev/null +++ b/REORG.TODO/stdlib/random.c @@ -0,0 +1,300 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* + * This is derived from the Berkeley source: + * @(#)random.c 5.5 (Berkeley) 7/6/88 + * It was reworked for the GNU C Library by Roland McGrath. + * Rewritten to use reentrant functions by Ulrich Drepper, 1995. + */ + +/* + Copyright (C) 1983 Regents of the University of California. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 4. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE.*/ + +#include <libc-lock.h> +#include <limits.h> +#include <stddef.h> +#include <stdlib.h> + + +/* An improved random number generation package. In addition to the standard + rand()/srand() like interface, this package also has a special state info + interface. The initstate() routine is called with a seed, an array of + bytes, and a count of how many bytes are being passed in; this array is + then initialized to contain information for random number generation with + that much state information. Good sizes for the amount of state + information are 32, 64, 128, and 256 bytes. The state can be switched by + calling the setstate() function with the same array as was initialized + with initstate(). By default, the package runs with 128 bytes of state + information and generates far better random numbers than a linear + congruential generator. If the amount of state information is less than + 32 bytes, a simple linear congruential R.N.G. is used. Internally, the + state information is treated as an array of longs; the zeroth element of + the array is the type of R.N.G. being used (small integer); the remainder + of the array is the state information for the R.N.G. Thus, 32 bytes of + state information will give 7 longs worth of state information, which will + allow a degree seven polynomial. (Note: The zeroth word of state + information also has some other information stored in it; see setstate + for details). The random number generation technique is a linear feedback + shift register approach, employing trinomials (since there are fewer terms + to sum up that way). In this approach, the least significant bit of all + the numbers in the state table will act as a linear feedback shift register, + and will have period 2^deg - 1 (where deg is the degree of the polynomial + being used, assuming that the polynomial is irreducible and primitive). + The higher order bits will have longer periods, since their values are + also influenced by pseudo-random carries out of the lower bits. The + total period of the generator is approximately deg*(2**deg - 1); thus + doubling the amount of state information has a vast influence on the + period of the generator. Note: The deg*(2**deg - 1) is an approximation + only good for large deg, when the period of the shift register is the + dominant factor. With deg equal to seven, the period is actually much + longer than the 7*(2**7 - 1) predicted by this formula. */ + + + +/* For each of the currently supported random number generators, we have a + break value on the amount of state information (you need at least this many + bytes of state info to support this random number generator), a degree for + the polynomial (actually a trinomial) that the R.N.G. is based on, and + separation between the two lower order coefficients of the trinomial. */ + +/* Linear congruential. */ +#define TYPE_0 0 +#define BREAK_0 8 +#define DEG_0 0 +#define SEP_0 0 + +/* x**7 + x**3 + 1. */ +#define TYPE_1 1 +#define BREAK_1 32 +#define DEG_1 7 +#define SEP_1 3 + +/* x**15 + x + 1. */ +#define TYPE_2 2 +#define BREAK_2 64 +#define DEG_2 15 +#define SEP_2 1 + +/* x**31 + x**3 + 1. */ +#define TYPE_3 3 +#define BREAK_3 128 +#define DEG_3 31 +#define SEP_3 3 + +/* x**63 + x + 1. */ +#define TYPE_4 4 +#define BREAK_4 256 +#define DEG_4 63 +#define SEP_4 1 + + +/* Array versions of the above information to make code run faster. + Relies on fact that TYPE_i == i. */ + +#define MAX_TYPES 5 /* Max number of types above. */ + + +/* Initially, everything is set up as if from: + initstate(1, randtbl, 128); + Note that this initialization takes advantage of the fact that srandom + advances the front and rear pointers 10*rand_deg times, and hence the + rear pointer which starts at 0 will also end up at zero; thus the zeroth + element of the state information, which contains info about the current + position of the rear pointer is just + (MAX_TYPES * (rptr - state)) + TYPE_3 == TYPE_3. */ + +static int32_t randtbl[DEG_3 + 1] = + { + TYPE_3, + + -1726662223, 379960547, 1735697613, 1040273694, 1313901226, + 1627687941, -179304937, -2073333483, 1780058412, -1989503057, + -615974602, 344556628, 939512070, -1249116260, 1507946756, + -812545463, 154635395, 1388815473, -1926676823, 525320961, + -1009028674, 968117788, -123449607, 1284210865, 435012392, + -2017506339, -911064859, -370259173, 1132637927, 1398500161, + -205601318, + }; + + +static struct random_data unsafe_state = + { +/* FPTR and RPTR are two pointers into the state info, a front and a rear + pointer. These two pointers are always rand_sep places apart, as they + cycle through the state information. (Yes, this does mean we could get + away with just one pointer, but the code for random is more efficient + this way). The pointers are left positioned as they would be from the call: + initstate(1, randtbl, 128); + (The position of the rear pointer, rptr, is really 0 (as explained above + in the initialization of randtbl) because the state table pointer is set + to point to randtbl[1] (as explained below).) */ + + .fptr = &randtbl[SEP_3 + 1], + .rptr = &randtbl[1], + +/* The following things are the pointer to the state information table, + the type of the current generator, the degree of the current polynomial + being used, and the separation between the two pointers. + Note that for efficiency of random, we remember the first location of + the state information, not the zeroth. Hence it is valid to access + state[-1], which is used to store the type of the R.N.G. + Also, we remember the last location, since this is more efficient than + indexing every time to find the address of the last element to see if + the front and rear pointers have wrapped. */ + + .state = &randtbl[1], + + .rand_type = TYPE_3, + .rand_deg = DEG_3, + .rand_sep = SEP_3, + + .end_ptr = &randtbl[sizeof (randtbl) / sizeof (randtbl[0])] +}; + +/* POSIX.1c requires that there is mutual exclusion for the `rand' and + `srand' functions to prevent concurrent calls from modifying common + data. */ +__libc_lock_define_initialized (static, lock) + +/* Initialize the random number generator based on the given seed. If the + type is the trivial no-state-information type, just remember the seed. + Otherwise, initializes state[] based on the given "seed" via a linear + congruential generator. Then, the pointers are set to known locations + that are exactly rand_sep places apart. Lastly, it cycles the state + information a given number of times to get rid of any initial dependencies + introduced by the L.C.R.N.G. Note that the initialization of randtbl[] + for default usage relies on values produced by this routine. */ +void +__srandom (unsigned int x) +{ + __libc_lock_lock (lock); + (void) __srandom_r (x, &unsafe_state); + __libc_lock_unlock (lock); +} + +weak_alias (__srandom, srandom) +weak_alias (__srandom, srand) + +/* Initialize the state information in the given array of N bytes for + future random number generation. Based on the number of bytes we + are given, and the break values for the different R.N.G.'s, we choose + the best (largest) one we can and set things up for it. srandom is + then called to initialize the state information. Note that on return + from srandom, we set state[-1] to be the type multiplexed with the current + value of the rear pointer; this is so successive calls to initstate won't + lose this information and will be able to restart with setstate. + Note: The first thing we do is save the current state, if any, just like + setstate so that it doesn't matter when initstate is called. + Returns a pointer to the old state. */ +char * +__initstate (unsigned int seed, char *arg_state, size_t n) +{ + int32_t *ostate; + int ret; + + __libc_lock_lock (lock); + + ostate = &unsafe_state.state[-1]; + + ret = __initstate_r (seed, arg_state, n, &unsafe_state); + + __libc_lock_unlock (lock); + + return ret == -1 ? NULL : (char *) ostate; +} + +weak_alias (__initstate, initstate) + +/* Restore the state from the given state array. + Note: It is important that we also remember the locations of the pointers + in the current state information, and restore the locations of the pointers + from the old state information. This is done by multiplexing the pointer + location into the zeroth word of the state information. Note that due + to the order in which things are done, it is OK to call setstate with the + same state as the current state + Returns a pointer to the old state information. */ +char * +__setstate (char *arg_state) +{ + int32_t *ostate; + + __libc_lock_lock (lock); + + ostate = &unsafe_state.state[-1]; + + if (__setstate_r (arg_state, &unsafe_state) < 0) + ostate = NULL; + + __libc_lock_unlock (lock); + + return (char *) ostate; +} + +weak_alias (__setstate, setstate) + +/* If we are using the trivial TYPE_0 R.N.G., just do the old linear + congruential bit. Otherwise, we do our fancy trinomial stuff, which is the + same in all the other cases due to all the global variables that have been + set up. The basic operation is to add the number at the rear pointer into + the one at the front pointer. Then both pointers are advanced to the next + location cyclically in the table. The value returned is the sum generated, + reduced to 31 bits by throwing away the "least random" low bit. + Note: The code takes advantage of the fact that both the front and + rear pointers can't wrap on the same call by not testing the rear + pointer if the front one has wrapped. Returns a 31-bit random number. */ + +long int +__random (void) +{ + int32_t retval; + + __libc_lock_lock (lock); + + (void) __random_r (&unsafe_state, &retval); + + __libc_lock_unlock (lock); + + return retval; +} + +weak_alias (__random, random) diff --git a/REORG.TODO/stdlib/random_r.c b/REORG.TODO/stdlib/random_r.c new file mode 100644 index 0000000000..c3f6f9aede --- /dev/null +++ b/REORG.TODO/stdlib/random_r.c @@ -0,0 +1,401 @@ +/* + Copyright (C) 1995-2017 Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* + Copyright (C) 1983 Regents of the University of California. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 4. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE.*/ + +/* + * This is derived from the Berkeley source: + * @(#)random.c 5.5 (Berkeley) 7/6/88 + * It was reworked for the GNU C Library by Roland McGrath. + * Rewritten to be reentrant by Ulrich Drepper, 1995 + */ + +#include <errno.h> +#include <limits.h> +#include <stddef.h> +#include <stdlib.h> + + +/* An improved random number generation package. In addition to the standard + rand()/srand() like interface, this package also has a special state info + interface. The initstate() routine is called with a seed, an array of + bytes, and a count of how many bytes are being passed in; this array is + then initialized to contain information for random number generation with + that much state information. Good sizes for the amount of state + information are 32, 64, 128, and 256 bytes. The state can be switched by + calling the setstate() function with the same array as was initialized + with initstate(). By default, the package runs with 128 bytes of state + information and generates far better random numbers than a linear + congruential generator. If the amount of state information is less than + 32 bytes, a simple linear congruential R.N.G. is used. Internally, the + state information is treated as an array of longs; the zeroth element of + the array is the type of R.N.G. being used (small integer); the remainder + of the array is the state information for the R.N.G. Thus, 32 bytes of + state information will give 7 longs worth of state information, which will + allow a degree seven polynomial. (Note: The zeroth word of state + information also has some other information stored in it; see setstate + for details). The random number generation technique is a linear feedback + shift register approach, employing trinomials (since there are fewer terms + to sum up that way). In this approach, the least significant bit of all + the numbers in the state table will act as a linear feedback shift register, + and will have period 2^deg - 1 (where deg is the degree of the polynomial + being used, assuming that the polynomial is irreducible and primitive). + The higher order bits will have longer periods, since their values are + also influenced by pseudo-random carries out of the lower bits. The + total period of the generator is approximately deg*(2**deg - 1); thus + doubling the amount of state information has a vast influence on the + period of the generator. Note: The deg*(2**deg - 1) is an approximation + only good for large deg, when the period of the shift register is the + dominant factor. With deg equal to seven, the period is actually much + longer than the 7*(2**7 - 1) predicted by this formula. */ + + + +/* For each of the currently supported random number generators, we have a + break value on the amount of state information (you need at least this many + bytes of state info to support this random number generator), a degree for + the polynomial (actually a trinomial) that the R.N.G. is based on, and + separation between the two lower order coefficients of the trinomial. */ + +/* Linear congruential. */ +#define TYPE_0 0 +#define BREAK_0 8 +#define DEG_0 0 +#define SEP_0 0 + +/* x**7 + x**3 + 1. */ +#define TYPE_1 1 +#define BREAK_1 32 +#define DEG_1 7 +#define SEP_1 3 + +/* x**15 + x + 1. */ +#define TYPE_2 2 +#define BREAK_2 64 +#define DEG_2 15 +#define SEP_2 1 + +/* x**31 + x**3 + 1. */ +#define TYPE_3 3 +#define BREAK_3 128 +#define DEG_3 31 +#define SEP_3 3 + +/* x**63 + x + 1. */ +#define TYPE_4 4 +#define BREAK_4 256 +#define DEG_4 63 +#define SEP_4 1 + + +/* Array versions of the above information to make code run faster. + Relies on fact that TYPE_i == i. */ + +#define MAX_TYPES 5 /* Max number of types above. */ + +struct random_poly_info +{ + int seps[MAX_TYPES]; + int degrees[MAX_TYPES]; +}; + +static const struct random_poly_info random_poly_info = +{ + { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 }, + { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 } +}; + + + + +/* Initialize the random number generator based on the given seed. If the + type is the trivial no-state-information type, just remember the seed. + Otherwise, initializes state[] based on the given "seed" via a linear + congruential generator. Then, the pointers are set to known locations + that are exactly rand_sep places apart. Lastly, it cycles the state + information a given number of times to get rid of any initial dependencies + introduced by the L.C.R.N.G. Note that the initialization of randtbl[] + for default usage relies on values produced by this routine. */ +int +__srandom_r (unsigned int seed, struct random_data *buf) +{ + int type; + int32_t *state; + long int i; + int32_t word; + int32_t *dst; + int kc; + + if (buf == NULL) + goto fail; + type = buf->rand_type; + if ((unsigned int) type >= MAX_TYPES) + goto fail; + + state = buf->state; + /* We must make sure the seed is not 0. Take arbitrarily 1 in this case. */ + if (seed == 0) + seed = 1; + state[0] = seed; + if (type == TYPE_0) + goto done; + + dst = state; + word = seed; + kc = buf->rand_deg; + for (i = 1; i < kc; ++i) + { + /* This does: + state[i] = (16807 * state[i - 1]) % 2147483647; + but avoids overflowing 31 bits. */ + long int hi = word / 127773; + long int lo = word % 127773; + word = 16807 * lo - 2836 * hi; + if (word < 0) + word += 2147483647; + *++dst = word; + } + + buf->fptr = &state[buf->rand_sep]; + buf->rptr = &state[0]; + kc *= 10; + while (--kc >= 0) + { + int32_t discard; + (void) __random_r (buf, &discard); + } + + done: + return 0; + + fail: + return -1; +} + +weak_alias (__srandom_r, srandom_r) + +/* Initialize the state information in the given array of N bytes for + future random number generation. Based on the number of bytes we + are given, and the break values for the different R.N.G.'s, we choose + the best (largest) one we can and set things up for it. srandom is + then called to initialize the state information. Note that on return + from srandom, we set state[-1] to be the type multiplexed with the current + value of the rear pointer; this is so successive calls to initstate won't + lose this information and will be able to restart with setstate. + Note: The first thing we do is save the current state, if any, just like + setstate so that it doesn't matter when initstate is called. + Returns 0 on success, non-zero on failure. */ +int +__initstate_r (unsigned int seed, char *arg_state, size_t n, + struct random_data *buf) +{ + if (buf == NULL) + goto fail; + + int32_t *old_state = buf->state; + if (old_state != NULL) + { + int old_type = buf->rand_type; + if (old_type == TYPE_0) + old_state[-1] = TYPE_0; + else + old_state[-1] = (MAX_TYPES * (buf->rptr - old_state)) + old_type; + } + + int type; + if (n >= BREAK_3) + type = n < BREAK_4 ? TYPE_3 : TYPE_4; + else if (n < BREAK_1) + { + if (n < BREAK_0) + goto fail; + + type = TYPE_0; + } + else + type = n < BREAK_2 ? TYPE_1 : TYPE_2; + + int degree = random_poly_info.degrees[type]; + int separation = random_poly_info.seps[type]; + + buf->rand_type = type; + buf->rand_sep = separation; + buf->rand_deg = degree; + int32_t *state = &((int32_t *) arg_state)[1]; /* First location. */ + /* Must set END_PTR before srandom. */ + buf->end_ptr = &state[degree]; + + buf->state = state; + + __srandom_r (seed, buf); + + state[-1] = TYPE_0; + if (type != TYPE_0) + state[-1] = (buf->rptr - state) * MAX_TYPES + type; + + return 0; + + fail: + __set_errno (EINVAL); + return -1; +} + +weak_alias (__initstate_r, initstate_r) + +/* Restore the state from the given state array. + Note: It is important that we also remember the locations of the pointers + in the current state information, and restore the locations of the pointers + from the old state information. This is done by multiplexing the pointer + location into the zeroth word of the state information. Note that due + to the order in which things are done, it is OK to call setstate with the + same state as the current state + Returns 0 on success, non-zero on failure. */ +int +__setstate_r (char *arg_state, struct random_data *buf) +{ + int32_t *new_state = 1 + (int32_t *) arg_state; + int type; + int old_type; + int32_t *old_state; + int degree; + int separation; + + if (arg_state == NULL || buf == NULL) + goto fail; + + old_type = buf->rand_type; + old_state = buf->state; + if (old_type == TYPE_0) + old_state[-1] = TYPE_0; + else + old_state[-1] = (MAX_TYPES * (buf->rptr - old_state)) + old_type; + + type = new_state[-1] % MAX_TYPES; + if (type < TYPE_0 || type > TYPE_4) + goto fail; + + buf->rand_deg = degree = random_poly_info.degrees[type]; + buf->rand_sep = separation = random_poly_info.seps[type]; + buf->rand_type = type; + + if (type != TYPE_0) + { + int rear = new_state[-1] / MAX_TYPES; + buf->rptr = &new_state[rear]; + buf->fptr = &new_state[(rear + separation) % degree]; + } + buf->state = new_state; + /* Set end_ptr too. */ + buf->end_ptr = &new_state[degree]; + + return 0; + + fail: + __set_errno (EINVAL); + return -1; +} + +weak_alias (__setstate_r, setstate_r) + +/* If we are using the trivial TYPE_0 R.N.G., just do the old linear + congruential bit. Otherwise, we do our fancy trinomial stuff, which is the + same in all the other cases due to all the global variables that have been + set up. The basic operation is to add the number at the rear pointer into + the one at the front pointer. Then both pointers are advanced to the next + location cyclically in the table. The value returned is the sum generated, + reduced to 31 bits by throwing away the "least random" low bit. + Note: The code takes advantage of the fact that both the front and + rear pointers can't wrap on the same call by not testing the rear + pointer if the front one has wrapped. Returns a 31-bit random number. */ + +int +__random_r (struct random_data *buf, int32_t *result) +{ + int32_t *state; + + if (buf == NULL || result == NULL) + goto fail; + + state = buf->state; + + if (buf->rand_type == TYPE_0) + { + int32_t val = state[0]; + val = ((state[0] * 1103515245) + 12345) & 0x7fffffff; + state[0] = val; + *result = val; + } + else + { + int32_t *fptr = buf->fptr; + int32_t *rptr = buf->rptr; + int32_t *end_ptr = buf->end_ptr; + int32_t val; + + val = *fptr += *rptr; + /* Chucking least random bit. */ + *result = (val >> 1) & 0x7fffffff; + ++fptr; + if (fptr >= end_ptr) + { + fptr = state; + ++rptr; + } + else + { + ++rptr; + if (rptr >= end_ptr) + rptr = state; + } + buf->fptr = fptr; + buf->rptr = rptr; + } + return 0; + + fail: + __set_errno (EINVAL); + return -1; +} + +weak_alias (__random_r, random_r) diff --git a/REORG.TODO/stdlib/rpmatch.c b/REORG.TODO/stdlib/rpmatch.c new file mode 100644 index 0000000000..965c2999d8 --- /dev/null +++ b/REORG.TODO/stdlib/rpmatch.c @@ -0,0 +1,61 @@ +/* Determine whether string value is affirmation or negative response + according to current locale's data. + This file is part of the GNU C Library. + Copyright (C) 1996-2017 Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <langinfo.h> +#include <stdlib.h> +#include <regex.h> + + +/* Match against one of the response patterns, compiling the pattern + first if necessary. */ +static int +try (const char *response, + const int tag, const int match, const int nomatch, + const char **lastp, regex_t *re) +{ + const char *pattern = nl_langinfo (tag); + if (pattern != *lastp) + { + /* The pattern has changed. */ + if (*lastp != NULL) + { + /* Free the old compiled pattern. */ + __regfree (re); + *lastp = NULL; + } + /* Compile the pattern and cache it for future runs. */ + if (__regcomp (re, pattern, REG_EXTENDED) != 0) + return -1; + *lastp = pattern; + } + + /* Try the pattern. */ + return __regexec (re, response, 0, NULL, 0) == 0 ? match : nomatch; +} + +int +rpmatch (const char *response) +{ + /* We cache the response patterns and compiled regexps here. */ + static const char *yesexpr, *noexpr; + static regex_t yesre, nore; + + return (try (response, YESEXPR, 1, 0, &yesexpr, &yesre) ?: + try (response, NOEXPR, 0, -1, &noexpr, &nore)); +} diff --git a/REORG.TODO/stdlib/rshift.c b/REORG.TODO/stdlib/rshift.c new file mode 100644 index 0000000000..d4c7f77769 --- /dev/null +++ b/REORG.TODO/stdlib/rshift.c @@ -0,0 +1,78 @@ +/* mpn_rshift -- Shift right a low-level natural-number integer. + +Copyright (C) 1991-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library; see the file COPYING.LIB. If not, see +<http://www.gnu.org/licenses/>. */ + +#include <gmp.h> +#include "gmp-impl.h" + +#include <assert.h> + +/* Shift U (pointed to by UP and USIZE limbs long) CNT bits to the right + and store the USIZE least significant limbs of the result at WP. + The bits shifted out to the right are returned. + + Argument constraints: + 1. 0 < CNT < BITS_PER_MP_LIMB + 2. If the result is to be written over the input, WP must be <= UP. +*/ + +mp_limb_t +mpn_rshift (register mp_ptr wp, + register mp_srcptr up, mp_size_t usize, + register unsigned int cnt) +{ + register mp_limb_t high_limb, low_limb; + register unsigned sh_1, sh_2; + register mp_size_t i; + mp_limb_t retval; + + assert (usize != 0 && cnt != 0); + + sh_1 = cnt; + +#if 0 + if (sh_1 == 0) + { + if (wp != up) + { + /* Copy from low end to high end, to allow specified input/output + overlapping. */ + for (i = 0; i < usize; i++) + wp[i] = up[i]; + } + return usize; + } +#endif + + wp -= 1; + sh_2 = BITS_PER_MP_LIMB - sh_1; + high_limb = up[0]; + retval = high_limb << sh_2; + low_limb = high_limb; + + for (i = 1; i < usize; i++) + { + high_limb = up[i]; + wp[i] = (low_limb >> sh_1) | (high_limb << sh_2); + low_limb = high_limb; + } + wp[i] = low_limb >> sh_1; + + return retval; +} diff --git a/REORG.TODO/stdlib/secure-getenv.c b/REORG.TODO/stdlib/secure-getenv.c new file mode 100644 index 0000000000..8d6a7e39a6 --- /dev/null +++ b/REORG.TODO/stdlib/secure-getenv.c @@ -0,0 +1,36 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <unistd.h> + +#include <shlib-compat.h> + +/* Some programs and especially the libc itself have to be careful + what values to accept from the environment. This special version + checks for SUID or SGID first before doing any work. */ +char * +__libc_secure_getenv (const char *name) +{ + return __libc_enable_secure ? NULL : getenv (name); +} +weak_alias (__libc_secure_getenv, secure_getenv) +libc_hidden_weak (__libc_secure_getenv) + +#if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_17) +compat_symbol (libc, __libc_secure_getenv, __secure_getenv, GLIBC_2_0); +#endif diff --git a/REORG.TODO/stdlib/seed48.c b/REORG.TODO/stdlib/seed48.c new file mode 100644 index 0000000000..3108b0ca76 --- /dev/null +++ b/REORG.TODO/stdlib/seed48.c @@ -0,0 +1,28 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + + +unsigned short int * +seed48 (unsigned short int seed16v[3]) +{ + (void) __seed48_r (seed16v, &__libc_drand48_data); + + return __libc_drand48_data.__old_x; +} diff --git a/REORG.TODO/stdlib/seed48_r.c b/REORG.TODO/stdlib/seed48_r.c new file mode 100644 index 0000000000..3cdf351dfd --- /dev/null +++ b/REORG.TODO/stdlib/seed48_r.c @@ -0,0 +1,39 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <string.h> +#include <limits.h> + +int +__seed48_r (unsigned short int seed16v[3], struct drand48_data *buffer) +{ + /* Save old value at a private place to be used as return value. */ + memcpy (buffer->__old_x, buffer->__x, sizeof (buffer->__x)); + + /* Install new state. */ + buffer->__x[2] = seed16v[2]; + buffer->__x[1] = seed16v[1]; + buffer->__x[0] = seed16v[0]; + buffer->__a = 0x5deece66dull; + buffer->__c = 0xb; + buffer->__init = 1; + + return 0; +} +weak_alias (__seed48_r, seed48_r) diff --git a/REORG.TODO/stdlib/setcontext.c b/REORG.TODO/stdlib/setcontext.c new file mode 100644 index 0000000000..3fe77177a2 --- /dev/null +++ b/REORG.TODO/stdlib/setcontext.c @@ -0,0 +1,29 @@ +/* Copyright (C) 1998-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <ucontext.h> + +int +setcontext (const ucontext_t *ucp) +{ + __set_errno (ENOSYS); + return -1; +} + + +stub_warning (setcontext) diff --git a/REORG.TODO/stdlib/setenv.c b/REORG.TODO/stdlib/setenv.c new file mode 100644 index 0000000000..f3c0220045 --- /dev/null +++ b/REORG.TODO/stdlib/setenv.c @@ -0,0 +1,340 @@ +/* Copyright (C) 1992-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +/* Pacify GCC; see the commentary about VALLEN below. This is needed + at least through GCC 4.9.2. Pacify GCC for the entire file, as + there seems to be no way to pacify GCC selectively, only for the + place where it's needed. Do not use DIAG_IGNORE_NEEDS_COMMENT + here, as it's not defined yet. */ +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" + +#include <errno.h> +#if !_LIBC +# if !defined errno && !defined HAVE_ERRNO_DECL +extern int errno; +# endif +# define __set_errno(ev) ((errno) = (ev)) +#endif + +#if _LIBC || HAVE_STDLIB_H +# include <stdlib.h> +#endif +#if _LIBC || HAVE_STRING_H +# include <string.h> +#endif +#if _LIBC || HAVE_UNISTD_H +# include <unistd.h> +#endif + +#if !_LIBC +# define __environ environ +# ifndef HAVE_ENVIRON_DECL +extern char **environ; +# endif +#endif + +#if _LIBC +/* This lock protects against simultaneous modifications of `environ'. */ +# include <libc-lock.h> +__libc_lock_define_initialized (static, envlock) +# define LOCK __libc_lock_lock (envlock) +# define UNLOCK __libc_lock_unlock (envlock) +#else +# define LOCK +# define UNLOCK +#endif + +/* In the GNU C library we must keep the namespace clean. */ +#ifdef _LIBC +# define setenv __setenv +# define unsetenv __unsetenv +# define clearenv __clearenv +# define tfind __tfind +# define tsearch __tsearch +#endif + +/* In the GNU C library implementation we try to be more clever and + allow arbitrarily many changes of the environment given that the used + values are from a small set. Outside glibc this will eat up all + memory after a while. */ +#if defined _LIBC || (defined HAVE_SEARCH_H && defined HAVE_TSEARCH \ + && defined __GNUC__) +# define USE_TSEARCH 1 +# include <search.h> + +/* This is a pointer to the root of the search tree with the known + values. */ +static void *known_values; + +# define KNOWN_VALUE(Str) \ + ({ \ + void *value = tfind (Str, &known_values, (__compar_fn_t) strcmp); \ + value != NULL ? *(char **) value : NULL; \ + }) +# define STORE_VALUE(Str) \ + tsearch (Str, &known_values, (__compar_fn_t) strcmp) + +#else +# undef USE_TSEARCH + +# define KNOWN_VALUE(Str) NULL +# define STORE_VALUE(Str) do { } while (0) + +#endif + + +/* If this variable is not a null pointer we allocated the current + environment. */ +static char **last_environ; + + +/* This function is used by `setenv' and `putenv'. The difference between + the two functions is that for the former must create a new string which + is then placed in the environment, while the argument of `putenv' + must be used directly. This is all complicated by the fact that we try + to reuse values once generated for a `setenv' call since we can never + free the strings. */ +int +__add_to_environ (const char *name, const char *value, const char *combined, + int replace) +{ + char **ep; + size_t size; + + /* Compute lengths before locking, so that the critical section is + less of a performance bottleneck. VALLEN is needed only if + COMBINED is null (unfortunately GCC is not smart enough to deduce + this; see the #pragma at the start of this file). Testing + COMBINED instead of VALUE causes setenv (..., NULL, ...) to dump + core now instead of corrupting memory later. */ + const size_t namelen = strlen (name); + size_t vallen; + if (combined == NULL) + vallen = strlen (value) + 1; + + LOCK; + + /* We have to get the pointer now that we have the lock and not earlier + since another thread might have created a new environment. */ + ep = __environ; + + size = 0; + if (ep != NULL) + { + for (; *ep != NULL; ++ep) + if (!strncmp (*ep, name, namelen) && (*ep)[namelen] == '=') + break; + else + ++size; + } + + if (ep == NULL || __builtin_expect (*ep == NULL, 1)) + { + char **new_environ; + + /* We allocated this space; we can extend it. */ + new_environ = (char **) realloc (last_environ, + (size + 2) * sizeof (char *)); + if (new_environ == NULL) + { + UNLOCK; + return -1; + } + + if (__environ != last_environ) + memcpy ((char *) new_environ, (char *) __environ, + size * sizeof (char *)); + + new_environ[size] = NULL; + new_environ[size + 1] = NULL; + ep = new_environ + size; + + last_environ = __environ = new_environ; + } + if (*ep == NULL || replace) + { + char *np; + + /* Use the user string if given. */ + if (combined != NULL) + np = (char *) combined; + else + { + const size_t varlen = namelen + 1 + vallen; +#ifdef USE_TSEARCH + char *new_value; + int use_alloca = __libc_use_alloca (varlen); + if (__builtin_expect (use_alloca, 1)) + new_value = (char *) alloca (varlen); + else + { + new_value = malloc (varlen); + if (new_value == NULL) + { + UNLOCK; + return -1; + } + } +# ifdef _LIBC + __mempcpy (__mempcpy (__mempcpy (new_value, name, namelen), "=", 1), + value, vallen); +# else + memcpy (new_value, name, namelen); + new_value[namelen] = '='; + memcpy (&new_value[namelen + 1], value, vallen); +# endif + + np = KNOWN_VALUE (new_value); + if (__glibc_likely (np == NULL)) +#endif + { +#ifdef USE_TSEARCH + if (__glibc_unlikely (! use_alloca)) + np = new_value; + else +#endif + { + np = malloc (varlen); + if (__glibc_unlikely (np == NULL)) + { + UNLOCK; + return -1; + } + +#ifdef USE_TSEARCH + memcpy (np, new_value, varlen); +#else + memcpy (np, name, namelen); + np[namelen] = '='; + memcpy (&np[namelen + 1], value, vallen); +#endif + } + /* And remember the value. */ + STORE_VALUE (np); + } +#ifdef USE_TSEARCH + else + { + if (__glibc_unlikely (! use_alloca)) + free (new_value); + } +#endif + } + + *ep = np; + } + + UNLOCK; + + return 0; +} + +int +setenv (const char *name, const char *value, int replace) +{ + if (name == NULL || *name == '\0' || strchr (name, '=') != NULL) + { + __set_errno (EINVAL); + return -1; + } + + return __add_to_environ (name, value, NULL, replace); +} + +int +unsetenv (const char *name) +{ + size_t len; + char **ep; + + if (name == NULL || *name == '\0' || strchr (name, '=') != NULL) + { + __set_errno (EINVAL); + return -1; + } + + len = strlen (name); + + LOCK; + + ep = __environ; + if (ep != NULL) + while (*ep != NULL) + { + if (!strncmp (*ep, name, len) && (*ep)[len] == '=') + { + /* Found it. Remove this pointer by moving later ones back. */ + char **dp = ep; + + do + dp[0] = dp[1]; + while (*dp++); + /* Continue the loop in case NAME appears again. */ + } + else + ++ep; + } + + UNLOCK; + + return 0; +} + +/* The `clearenv' was planned to be added to POSIX.1 but probably + never made it. Nevertheless the POSIX.9 standard (POSIX bindings + for Fortran 77) requires this function. */ +int +clearenv (void) +{ + LOCK; + + if (__environ == last_environ && __environ != NULL) + { + /* We allocated this environment so we can free it. */ + free (__environ); + last_environ = NULL; + } + + /* Clear the environment pointer removes the whole environment. */ + __environ = NULL; + + UNLOCK; + + return 0; +} +#ifdef _LIBC +libc_freeres_fn (free_mem) +{ + /* Remove all traces. */ + clearenv (); + + /* Now remove the search tree. */ + __tdestroy (known_values, free); + known_values = NULL; +} + +# undef setenv +# undef unsetenv +# undef clearenv +weak_alias (__setenv, setenv) +weak_alias (__unsetenv, unsetenv) +weak_alias (__clearenv, clearenv) +#endif diff --git a/REORG.TODO/stdlib/srand48.c b/REORG.TODO/stdlib/srand48.c new file mode 100644 index 0000000000..9d665055a0 --- /dev/null +++ b/REORG.TODO/stdlib/srand48.c @@ -0,0 +1,26 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + + +void +srand48 (long seedval) +{ + (void) __srand48_r (seedval, &__libc_drand48_data); +} diff --git a/REORG.TODO/stdlib/srand48_r.c b/REORG.TODO/stdlib/srand48_r.c new file mode 100644 index 0000000000..43bca37062 --- /dev/null +++ b/REORG.TODO/stdlib/srand48_r.c @@ -0,0 +1,39 @@ +/* Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <limits.h> + +int +__srand48_r (long int seedval, struct drand48_data *buffer) +{ + /* The standards say we only have 32 bits. */ + if (sizeof (long int) > 4) + seedval &= 0xffffffffl; + + buffer->__x[2] = seedval >> 16; + buffer->__x[1] = seedval & 0xffffl; + buffer->__x[0] = 0x330e; + + buffer->__a = 0x5deece66dull; + buffer->__c = 0xb; + buffer->__init = 1; + + return 0; +} +weak_alias (__srand48_r, srand48_r) diff --git a/REORG.TODO/stdlib/stdlib.h b/REORG.TODO/stdlib/stdlib.h new file mode 100644 index 0000000000..0a693c2b41 --- /dev/null +++ b/REORG.TODO/stdlib/stdlib.h @@ -0,0 +1,911 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* + * ISO C99 Standard: 7.20 General utilities <stdlib.h> + */ + +#ifndef _STDLIB_H + +#define __GLIBC_INTERNAL_STARTING_HEADER_IMPLEMENTATION +#include <bits/libc-header-start.h> + +/* Get size_t, wchar_t and NULL from <stddef.h>. */ +#define __need_size_t +#define __need_wchar_t +#define __need_NULL +#include <stddef.h> + +__BEGIN_DECLS + +#define _STDLIB_H 1 + +#if (defined __USE_XOPEN || defined __USE_XOPEN2K8) && !defined _SYS_WAIT_H +/* XPG requires a few symbols from <sys/wait.h> being defined. */ +# include <bits/waitflags.h> +# include <bits/waitstatus.h> + +/* Define the macros <sys/wait.h> also would define this way. */ +# define WEXITSTATUS(status) __WEXITSTATUS (status) +# define WTERMSIG(status) __WTERMSIG (status) +# define WSTOPSIG(status) __WSTOPSIG (status) +# define WIFEXITED(status) __WIFEXITED (status) +# define WIFSIGNALED(status) __WIFSIGNALED (status) +# define WIFSTOPPED(status) __WIFSTOPPED (status) +# ifdef __WIFCONTINUED +# define WIFCONTINUED(status) __WIFCONTINUED (status) +# endif +#endif /* X/Open or XPG7 and <sys/wait.h> not included. */ + +/* _FloatN API tests for enablement. */ +#include <bits/floatn.h> + +/* Returned by `div'. */ +typedef struct + { + int quot; /* Quotient. */ + int rem; /* Remainder. */ + } div_t; + +/* Returned by `ldiv'. */ +#ifndef __ldiv_t_defined +typedef struct + { + long int quot; /* Quotient. */ + long int rem; /* Remainder. */ + } ldiv_t; +# define __ldiv_t_defined 1 +#endif + +#if defined __USE_ISOC99 && !defined __lldiv_t_defined +/* Returned by `lldiv'. */ +__extension__ typedef struct + { + long long int quot; /* Quotient. */ + long long int rem; /* Remainder. */ + } lldiv_t; +# define __lldiv_t_defined 1 +#endif + + +/* The largest number rand will return (same as INT_MAX). */ +#define RAND_MAX 2147483647 + + +/* We define these the same for all machines. + Changes from this to the outside world should be done in `_exit'. */ +#define EXIT_FAILURE 1 /* Failing exit status. */ +#define EXIT_SUCCESS 0 /* Successful exit status. */ + + +/* Maximum length of a multibyte character in the current locale. */ +#define MB_CUR_MAX (__ctype_get_mb_cur_max ()) +extern size_t __ctype_get_mb_cur_max (void) __THROW __wur; + + +/* Convert a string to a floating-point number. */ +extern double atof (const char *__nptr) + __THROW __attribute_pure__ __nonnull ((1)) __wur; +/* Convert a string to an integer. */ +extern int atoi (const char *__nptr) + __THROW __attribute_pure__ __nonnull ((1)) __wur; +/* Convert a string to a long integer. */ +extern long int atol (const char *__nptr) + __THROW __attribute_pure__ __nonnull ((1)) __wur; + +#ifdef __USE_ISOC99 +/* Convert a string to a long long integer. */ +__extension__ extern long long int atoll (const char *__nptr) + __THROW __attribute_pure__ __nonnull ((1)) __wur; +#endif + +/* Convert a string to a floating-point number. */ +extern double strtod (const char *__restrict __nptr, + char **__restrict __endptr) + __THROW __nonnull ((1)); + +#ifdef __USE_ISOC99 +/* Likewise for `float' and `long double' sizes of floating-point numbers. */ +extern float strtof (const char *__restrict __nptr, + char **__restrict __endptr) __THROW __nonnull ((1)); + +extern long double strtold (const char *__restrict __nptr, + char **__restrict __endptr) + __THROW __nonnull ((1)); +#endif + +/* Convert a string to a long integer. */ +extern long int strtol (const char *__restrict __nptr, + char **__restrict __endptr, int __base) + __THROW __nonnull ((1)); +/* Convert a string to an unsigned long integer. */ +extern unsigned long int strtoul (const char *__restrict __nptr, + char **__restrict __endptr, int __base) + __THROW __nonnull ((1)); + +#ifdef __USE_MISC +/* Convert a string to a quadword integer. */ +__extension__ +extern long long int strtoq (const char *__restrict __nptr, + char **__restrict __endptr, int __base) + __THROW __nonnull ((1)); +/* Convert a string to an unsigned quadword integer. */ +__extension__ +extern unsigned long long int strtouq (const char *__restrict __nptr, + char **__restrict __endptr, int __base) + __THROW __nonnull ((1)); +#endif /* Use misc. */ + +#ifdef __USE_ISOC99 +/* Convert a string to a quadword integer. */ +__extension__ +extern long long int strtoll (const char *__restrict __nptr, + char **__restrict __endptr, int __base) + __THROW __nonnull ((1)); +/* Convert a string to an unsigned quadword integer. */ +__extension__ +extern unsigned long long int strtoull (const char *__restrict __nptr, + char **__restrict __endptr, int __base) + __THROW __nonnull ((1)); +#endif /* ISO C99 or use MISC. */ + +/* Convert a floating-point number to a string. */ +#if __GLIBC_USE (IEC_60559_BFP_EXT) +extern int strfromd (char *__dest, size_t __size, const char *__format, + double __f) + __THROW __nonnull ((3)); + +extern int strfromf (char *__dest, size_t __size, const char *__format, + float __f) + __THROW __nonnull ((3)); + +extern int strfroml (char *__dest, size_t __size, const char *__format, + long double __f) + __THROW __nonnull ((3)); +#endif + +#if __HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT) +extern int strfromf128 (char *__dest, size_t __size, const char * __format, + _Float128 __f) + __THROW __nonnull ((3)); +#endif + + +#ifdef __USE_GNU +/* The concept of one static locale per category is not very well + thought out. Many applications will need to process its data using + information from several different locales. Another problem is + the implementation of the internationalization handling in the + ISO C++ standard library. To support this another set of + the functions using locale data exist which take an additional + argument. + + Attention: even though several *_l interfaces are part of POSIX:2008, + these are not. */ + +/* Structure for reentrant locale using functions. This is an + (almost) opaque type for the user level programs. */ +# include <xlocale.h> + +/* Special versions of the functions above which take the locale to + use as an additional parameter. */ +extern long int strtol_l (const char *__restrict __nptr, + char **__restrict __endptr, int __base, + __locale_t __loc) __THROW __nonnull ((1, 4)); + +extern unsigned long int strtoul_l (const char *__restrict __nptr, + char **__restrict __endptr, + int __base, __locale_t __loc) + __THROW __nonnull ((1, 4)); + +__extension__ +extern long long int strtoll_l (const char *__restrict __nptr, + char **__restrict __endptr, int __base, + __locale_t __loc) + __THROW __nonnull ((1, 4)); + +__extension__ +extern unsigned long long int strtoull_l (const char *__restrict __nptr, + char **__restrict __endptr, + int __base, __locale_t __loc) + __THROW __nonnull ((1, 4)); + +extern double strtod_l (const char *__restrict __nptr, + char **__restrict __endptr, __locale_t __loc) + __THROW __nonnull ((1, 3)); + +extern float strtof_l (const char *__restrict __nptr, + char **__restrict __endptr, __locale_t __loc) + __THROW __nonnull ((1, 3)); + +extern long double strtold_l (const char *__restrict __nptr, + char **__restrict __endptr, + __locale_t __loc) + __THROW __nonnull ((1, 3)); +#endif /* GNU */ + + +#ifdef __USE_EXTERN_INLINES +__extern_inline int +__NTH (atoi (const char *__nptr)) +{ + return (int) strtol (__nptr, (char **) NULL, 10); +} +__extern_inline long int +__NTH (atol (const char *__nptr)) +{ + return strtol (__nptr, (char **) NULL, 10); +} + +# ifdef __USE_ISOC99 +__extension__ __extern_inline long long int +__NTH (atoll (const char *__nptr)) +{ + return strtoll (__nptr, (char **) NULL, 10); +} +# endif +#endif /* Optimizing and Inlining. */ + + +#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED +/* Convert N to base 64 using the digits "./0-9A-Za-z", least-significant + digit first. Returns a pointer to static storage overwritten by the + next call. */ +extern char *l64a (long int __n) __THROW __wur; + +/* Read a number from a string S in base 64 as above. */ +extern long int a64l (const char *__s) + __THROW __attribute_pure__ __nonnull ((1)) __wur; + +#endif /* Use misc || extended X/Open. */ + +#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED +# include <sys/types.h> /* we need int32_t... */ + +/* These are the functions that actually do things. The `random', `srandom', + `initstate' and `setstate' functions are those from BSD Unices. + The `rand' and `srand' functions are required by the ANSI standard. + We provide both interfaces to the same random number generator. */ +/* Return a random long integer between 0 and RAND_MAX inclusive. */ +extern long int random (void) __THROW; + +/* Seed the random number generator with the given number. */ +extern void srandom (unsigned int __seed) __THROW; + +/* Initialize the random number generator to use state buffer STATEBUF, + of length STATELEN, and seed it with SEED. Optimal lengths are 8, 16, + 32, 64, 128 and 256, the bigger the better; values less than 8 will + cause an error and values greater than 256 will be rounded down. */ +extern char *initstate (unsigned int __seed, char *__statebuf, + size_t __statelen) __THROW __nonnull ((2)); + +/* Switch the random number generator to state buffer STATEBUF, + which should have been previously initialized by `initstate'. */ +extern char *setstate (char *__statebuf) __THROW __nonnull ((1)); + + +# ifdef __USE_MISC +/* Reentrant versions of the `random' family of functions. + These functions all use the following data structure to contain + state, rather than global state variables. */ + +struct random_data + { + int32_t *fptr; /* Front pointer. */ + int32_t *rptr; /* Rear pointer. */ + int32_t *state; /* Array of state values. */ + int rand_type; /* Type of random number generator. */ + int rand_deg; /* Degree of random number generator. */ + int rand_sep; /* Distance between front and rear. */ + int32_t *end_ptr; /* Pointer behind state table. */ + }; + +extern int random_r (struct random_data *__restrict __buf, + int32_t *__restrict __result) __THROW __nonnull ((1, 2)); + +extern int srandom_r (unsigned int __seed, struct random_data *__buf) + __THROW __nonnull ((2)); + +extern int initstate_r (unsigned int __seed, char *__restrict __statebuf, + size_t __statelen, + struct random_data *__restrict __buf) + __THROW __nonnull ((2, 4)); + +extern int setstate_r (char *__restrict __statebuf, + struct random_data *__restrict __buf) + __THROW __nonnull ((1, 2)); +# endif /* Use misc. */ +#endif /* Use extended X/Open || misc. */ + + +/* Return a random integer between 0 and RAND_MAX inclusive. */ +extern int rand (void) __THROW; +/* Seed the random number generator with the given number. */ +extern void srand (unsigned int __seed) __THROW; + +#ifdef __USE_POSIX199506 +/* Reentrant interface according to POSIX.1. */ +extern int rand_r (unsigned int *__seed) __THROW; +#endif + + +#if defined __USE_MISC || defined __USE_XOPEN +/* System V style 48-bit random number generator functions. */ + +/* Return non-negative, double-precision floating-point value in [0.0,1.0). */ +extern double drand48 (void) __THROW; +extern double erand48 (unsigned short int __xsubi[3]) __THROW __nonnull ((1)); + +/* Return non-negative, long integer in [0,2^31). */ +extern long int lrand48 (void) __THROW; +extern long int nrand48 (unsigned short int __xsubi[3]) + __THROW __nonnull ((1)); + +/* Return signed, long integers in [-2^31,2^31). */ +extern long int mrand48 (void) __THROW; +extern long int jrand48 (unsigned short int __xsubi[3]) + __THROW __nonnull ((1)); + +/* Seed random number generator. */ +extern void srand48 (long int __seedval) __THROW; +extern unsigned short int *seed48 (unsigned short int __seed16v[3]) + __THROW __nonnull ((1)); +extern void lcong48 (unsigned short int __param[7]) __THROW __nonnull ((1)); + +# ifdef __USE_MISC +/* Data structure for communication with thread safe versions. This + type is to be regarded as opaque. It's only exported because users + have to allocate objects of this type. */ +struct drand48_data + { + unsigned short int __x[3]; /* Current state. */ + unsigned short int __old_x[3]; /* Old state. */ + unsigned short int __c; /* Additive const. in congruential formula. */ + unsigned short int __init; /* Flag for initializing. */ + __extension__ unsigned long long int __a; /* Factor in congruential + formula. */ + }; + +/* Return non-negative, double-precision floating-point value in [0.0,1.0). */ +extern int drand48_r (struct drand48_data *__restrict __buffer, + double *__restrict __result) __THROW __nonnull ((1, 2)); +extern int erand48_r (unsigned short int __xsubi[3], + struct drand48_data *__restrict __buffer, + double *__restrict __result) __THROW __nonnull ((1, 2)); + +/* Return non-negative, long integer in [0,2^31). */ +extern int lrand48_r (struct drand48_data *__restrict __buffer, + long int *__restrict __result) + __THROW __nonnull ((1, 2)); +extern int nrand48_r (unsigned short int __xsubi[3], + struct drand48_data *__restrict __buffer, + long int *__restrict __result) + __THROW __nonnull ((1, 2)); + +/* Return signed, long integers in [-2^31,2^31). */ +extern int mrand48_r (struct drand48_data *__restrict __buffer, + long int *__restrict __result) + __THROW __nonnull ((1, 2)); +extern int jrand48_r (unsigned short int __xsubi[3], + struct drand48_data *__restrict __buffer, + long int *__restrict __result) + __THROW __nonnull ((1, 2)); + +/* Seed random number generator. */ +extern int srand48_r (long int __seedval, struct drand48_data *__buffer) + __THROW __nonnull ((2)); + +extern int seed48_r (unsigned short int __seed16v[3], + struct drand48_data *__buffer) __THROW __nonnull ((1, 2)); + +extern int lcong48_r (unsigned short int __param[7], + struct drand48_data *__buffer) + __THROW __nonnull ((1, 2)); +# endif /* Use misc. */ +#endif /* Use misc or X/Open. */ + +/* Allocate SIZE bytes of memory. */ +extern void *malloc (size_t __size) __THROW __attribute_malloc__ __wur; +/* Allocate NMEMB elements of SIZE bytes each, all initialized to 0. */ +extern void *calloc (size_t __nmemb, size_t __size) + __THROW __attribute_malloc__ __wur; + +/* Re-allocate the previously allocated block + in PTR, making the new block SIZE bytes long. */ +/* __attribute_malloc__ is not used, because if realloc returns + the same pointer that was passed to it, aliasing needs to be allowed + between objects pointed by the old and new pointers. */ +extern void *realloc (void *__ptr, size_t __size) + __THROW __attribute_warn_unused_result__; + +#ifdef __USE_GNU +/* Re-allocate the previously allocated block in PTR, making the new + block large enough for NMEMB elements of SIZE bytes each. */ +/* __attribute_malloc__ is not used, because if reallocarray returns + the same pointer that was passed to it, aliasing needs to be allowed + between objects pointed by the old and new pointers. */ +extern void *reallocarray (void *__ptr, size_t __nmemb, size_t __size) + __THROW __attribute_warn_unused_result__; +#endif + +/* Free a block allocated by `malloc', `realloc' or `calloc'. */ +extern void free (void *__ptr) __THROW; + +#ifdef __USE_MISC +# include <alloca.h> +#endif /* Use misc. */ + +#if (defined __USE_XOPEN_EXTENDED && !defined __USE_XOPEN2K) \ + || defined __USE_MISC +/* Allocate SIZE bytes on a page boundary. The storage cannot be freed. */ +extern void *valloc (size_t __size) __THROW __attribute_malloc__ __wur; +#endif + +#ifdef __USE_XOPEN2K +/* Allocate memory of SIZE bytes with an alignment of ALIGNMENT. */ +extern int posix_memalign (void **__memptr, size_t __alignment, size_t __size) + __THROW __nonnull ((1)) __wur; +#endif + +#ifdef __USE_ISOC11 +/* ISO C variant of aligned allocation. */ +extern void *aligned_alloc (size_t __alignment, size_t __size) + __THROW __attribute_malloc__ __attribute_alloc_size__ ((2)) __wur; +#endif + +/* Abort execution and generate a core-dump. */ +extern void abort (void) __THROW __attribute__ ((__noreturn__)); + + +/* Register a function to be called when `exit' is called. */ +extern int atexit (void (*__func) (void)) __THROW __nonnull ((1)); + +#if defined __USE_ISOC11 || defined __USE_ISOCXX11 +/* Register a function to be called when `quick_exit' is called. */ +# ifdef __cplusplus +extern "C++" int at_quick_exit (void (*__func) (void)) + __THROW __asm ("at_quick_exit") __nonnull ((1)); +# else +extern int at_quick_exit (void (*__func) (void)) __THROW __nonnull ((1)); +# endif +#endif + +#ifdef __USE_MISC +/* Register a function to be called with the status + given to `exit' and the given argument. */ +extern int on_exit (void (*__func) (int __status, void *__arg), void *__arg) + __THROW __nonnull ((1)); +#endif + +/* Call all functions registered with `atexit' and `on_exit', + in the reverse of the order in which they were registered, + perform stdio cleanup, and terminate program execution with STATUS. */ +extern void exit (int __status) __THROW __attribute__ ((__noreturn__)); + +#if defined __USE_ISOC11 || defined __USE_ISOCXX11 +/* Call all functions registered with `at_quick_exit' in the reverse + of the order in which they were registered and terminate program + execution with STATUS. */ +extern void quick_exit (int __status) __THROW __attribute__ ((__noreturn__)); +#endif + +#ifdef __USE_ISOC99 +/* Terminate the program with STATUS without calling any of the + functions registered with `atexit' or `on_exit'. */ +extern void _Exit (int __status) __THROW __attribute__ ((__noreturn__)); +#endif + + +/* Return the value of envariable NAME, or NULL if it doesn't exist. */ +extern char *getenv (const char *__name) __THROW __nonnull ((1)) __wur; + +#ifdef __USE_GNU +/* This function is similar to the above but returns NULL if the + programs is running with SUID or SGID enabled. */ +extern char *secure_getenv (const char *__name) + __THROW __nonnull ((1)) __wur; +#endif + +#if defined __USE_MISC || defined __USE_XOPEN +/* The SVID says this is in <stdio.h>, but this seems a better place. */ +/* Put STRING, which is of the form "NAME=VALUE", in the environment. + If there is no `=', remove NAME from the environment. */ +extern int putenv (char *__string) __THROW __nonnull ((1)); +#endif + +#ifdef __USE_XOPEN2K +/* Set NAME to VALUE in the environment. + If REPLACE is nonzero, overwrite an existing value. */ +extern int setenv (const char *__name, const char *__value, int __replace) + __THROW __nonnull ((2)); + +/* Remove the variable NAME from the environment. */ +extern int unsetenv (const char *__name) __THROW __nonnull ((1)); +#endif + +#ifdef __USE_MISC +/* The `clearenv' was planned to be added to POSIX.1 but probably + never made it. Nevertheless the POSIX.9 standard (POSIX bindings + for Fortran 77) requires this function. */ +extern int clearenv (void) __THROW; +#endif + + +#if defined __USE_MISC \ + || (defined __USE_XOPEN_EXTENDED && !defined __USE_XOPEN2K8) +/* Generate a unique temporary file name from TEMPLATE. + The last six characters of TEMPLATE must be "XXXXXX"; + they are replaced with a string that makes the file name unique. + Always returns TEMPLATE, it's either a temporary file name or a null + string if it cannot get a unique file name. */ +extern char *mktemp (char *__template) __THROW __nonnull ((1)); +#endif + +#if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8 +/* Generate a unique temporary file name from TEMPLATE. + The last six characters of TEMPLATE must be "XXXXXX"; + they are replaced with a string that makes the filename unique. + Returns a file descriptor open on the file for reading and writing, + or -1 if it cannot create a uniquely-named file. + + This function is a possible cancellation point and therefore not + marked with __THROW. */ +# ifndef __USE_FILE_OFFSET64 +extern int mkstemp (char *__template) __nonnull ((1)) __wur; +# else +# ifdef __REDIRECT +extern int __REDIRECT (mkstemp, (char *__template), mkstemp64) + __nonnull ((1)) __wur; +# else +# define mkstemp mkstemp64 +# endif +# endif +# ifdef __USE_LARGEFILE64 +extern int mkstemp64 (char *__template) __nonnull ((1)) __wur; +# endif +#endif + +#ifdef __USE_MISC +/* Similar to mkstemp, but the template can have a suffix after the + XXXXXX. The length of the suffix is specified in the second + parameter. + + This function is a possible cancellation point and therefore not + marked with __THROW. */ +# ifndef __USE_FILE_OFFSET64 +extern int mkstemps (char *__template, int __suffixlen) __nonnull ((1)) __wur; +# else +# ifdef __REDIRECT +extern int __REDIRECT (mkstemps, (char *__template, int __suffixlen), + mkstemps64) __nonnull ((1)) __wur; +# else +# define mkstemps mkstemps64 +# endif +# endif +# ifdef __USE_LARGEFILE64 +extern int mkstemps64 (char *__template, int __suffixlen) + __nonnull ((1)) __wur; +# endif +#endif + +#ifdef __USE_XOPEN2K8 +/* Create a unique temporary directory from TEMPLATE. + The last six characters of TEMPLATE must be "XXXXXX"; + they are replaced with a string that makes the directory name unique. + Returns TEMPLATE, or a null pointer if it cannot get a unique name. + The directory is created mode 700. */ +extern char *mkdtemp (char *__template) __THROW __nonnull ((1)) __wur; +#endif + +#ifdef __USE_GNU +/* Generate a unique temporary file name from TEMPLATE similar to + mkstemp. But allow the caller to pass additional flags which are + used in the open call to create the file.. + + This function is a possible cancellation point and therefore not + marked with __THROW. */ +# ifndef __USE_FILE_OFFSET64 +extern int mkostemp (char *__template, int __flags) __nonnull ((1)) __wur; +# else +# ifdef __REDIRECT +extern int __REDIRECT (mkostemp, (char *__template, int __flags), mkostemp64) + __nonnull ((1)) __wur; +# else +# define mkostemp mkostemp64 +# endif +# endif +# ifdef __USE_LARGEFILE64 +extern int mkostemp64 (char *__template, int __flags) __nonnull ((1)) __wur; +# endif + +/* Similar to mkostemp, but the template can have a suffix after the + XXXXXX. The length of the suffix is specified in the second + parameter. + + This function is a possible cancellation point and therefore not + marked with __THROW. */ +# ifndef __USE_FILE_OFFSET64 +extern int mkostemps (char *__template, int __suffixlen, int __flags) + __nonnull ((1)) __wur; +# else +# ifdef __REDIRECT +extern int __REDIRECT (mkostemps, (char *__template, int __suffixlen, + int __flags), mkostemps64) + __nonnull ((1)) __wur; +# else +# define mkostemps mkostemps64 +# endif +# endif +# ifdef __USE_LARGEFILE64 +extern int mkostemps64 (char *__template, int __suffixlen, int __flags) + __nonnull ((1)) __wur; +# endif +#endif + + +/* Execute the given line as a shell command. + + This function is a cancellation point and therefore not marked with + __THROW. */ +extern int system (const char *__command) __wur; + + +#ifdef __USE_GNU +/* Return a malloc'd string containing the canonical absolute name of the + existing named file. */ +extern char *canonicalize_file_name (const char *__name) + __THROW __nonnull ((1)) __wur; +#endif + +#if defined __USE_MISC || defined __USE_XOPEN_EXTENDED +/* Return the canonical absolute name of file NAME. If RESOLVED is + null, the result is malloc'd; otherwise, if the canonical name is + PATH_MAX chars or more, returns null with `errno' set to + ENAMETOOLONG; if the name fits in fewer than PATH_MAX chars, + returns the name in RESOLVED. */ +extern char *realpath (const char *__restrict __name, + char *__restrict __resolved) __THROW __wur; +#endif + + +/* Shorthand for type of comparison functions. */ +#ifndef __COMPAR_FN_T +# define __COMPAR_FN_T +typedef int (*__compar_fn_t) (const void *, const void *); + +# ifdef __USE_GNU +typedef __compar_fn_t comparison_fn_t; +# endif +#endif +#ifdef __USE_GNU +typedef int (*__compar_d_fn_t) (const void *, const void *, void *); +#endif + +/* Do a binary search for KEY in BASE, which consists of NMEMB elements + of SIZE bytes each, using COMPAR to perform the comparisons. */ +extern void *bsearch (const void *__key, const void *__base, + size_t __nmemb, size_t __size, __compar_fn_t __compar) + __nonnull ((1, 2, 5)) __wur; + +#ifdef __USE_EXTERN_INLINES +# include <bits/stdlib-bsearch.h> +#endif + +/* Sort NMEMB elements of BASE, of SIZE bytes each, + using COMPAR to perform the comparisons. */ +extern void qsort (void *__base, size_t __nmemb, size_t __size, + __compar_fn_t __compar) __nonnull ((1, 4)); +#ifdef __USE_GNU +extern void qsort_r (void *__base, size_t __nmemb, size_t __size, + __compar_d_fn_t __compar, void *__arg) + __nonnull ((1, 4)); +#endif + + +/* Return the absolute value of X. */ +extern int abs (int __x) __THROW __attribute__ ((__const__)) __wur; +extern long int labs (long int __x) __THROW __attribute__ ((__const__)) __wur; + +#ifdef __USE_ISOC99 +__extension__ extern long long int llabs (long long int __x) + __THROW __attribute__ ((__const__)) __wur; +#endif + + +/* Return the `div_t', `ldiv_t' or `lldiv_t' representation + of the value of NUMER over DENOM. */ +/* GCC may have built-ins for these someday. */ +extern div_t div (int __numer, int __denom) + __THROW __attribute__ ((__const__)) __wur; +extern ldiv_t ldiv (long int __numer, long int __denom) + __THROW __attribute__ ((__const__)) __wur; + +#ifdef __USE_ISOC99 +__extension__ extern lldiv_t lldiv (long long int __numer, + long long int __denom) + __THROW __attribute__ ((__const__)) __wur; +#endif + + +#if (defined __USE_XOPEN_EXTENDED && !defined __USE_XOPEN2K8) \ + || defined __USE_MISC +/* Convert floating point numbers to strings. The returned values are + valid only until another call to the same function. */ + +/* Convert VALUE to a string with NDIGIT digits and return a pointer to + this. Set *DECPT with the position of the decimal character and *SIGN + with the sign of the number. */ +extern char *ecvt (double __value, int __ndigit, int *__restrict __decpt, + int *__restrict __sign) __THROW __nonnull ((3, 4)) __wur; + +/* Convert VALUE to a string rounded to NDIGIT decimal digits. Set *DECPT + with the position of the decimal character and *SIGN with the sign of + the number. */ +extern char *fcvt (double __value, int __ndigit, int *__restrict __decpt, + int *__restrict __sign) __THROW __nonnull ((3, 4)) __wur; + +/* If possible convert VALUE to a string with NDIGIT significant digits. + Otherwise use exponential representation. The resulting string will + be written to BUF. */ +extern char *gcvt (double __value, int __ndigit, char *__buf) + __THROW __nonnull ((3)) __wur; +#endif + +#ifdef __USE_MISC +/* Long double versions of above functions. */ +extern char *qecvt (long double __value, int __ndigit, + int *__restrict __decpt, int *__restrict __sign) + __THROW __nonnull ((3, 4)) __wur; +extern char *qfcvt (long double __value, int __ndigit, + int *__restrict __decpt, int *__restrict __sign) + __THROW __nonnull ((3, 4)) __wur; +extern char *qgcvt (long double __value, int __ndigit, char *__buf) + __THROW __nonnull ((3)) __wur; + + +/* Reentrant version of the functions above which provide their own + buffers. */ +extern int ecvt_r (double __value, int __ndigit, int *__restrict __decpt, + int *__restrict __sign, char *__restrict __buf, + size_t __len) __THROW __nonnull ((3, 4, 5)); +extern int fcvt_r (double __value, int __ndigit, int *__restrict __decpt, + int *__restrict __sign, char *__restrict __buf, + size_t __len) __THROW __nonnull ((3, 4, 5)); + +extern int qecvt_r (long double __value, int __ndigit, + int *__restrict __decpt, int *__restrict __sign, + char *__restrict __buf, size_t __len) + __THROW __nonnull ((3, 4, 5)); +extern int qfcvt_r (long double __value, int __ndigit, + int *__restrict __decpt, int *__restrict __sign, + char *__restrict __buf, size_t __len) + __THROW __nonnull ((3, 4, 5)); +#endif /* misc */ + + +/* Return the length of the multibyte character + in S, which is no longer than N. */ +extern int mblen (const char *__s, size_t __n) __THROW; +/* Return the length of the given multibyte character, + putting its `wchar_t' representation in *PWC. */ +extern int mbtowc (wchar_t *__restrict __pwc, + const char *__restrict __s, size_t __n) __THROW; +/* Put the multibyte character represented + by WCHAR in S, returning its length. */ +extern int wctomb (char *__s, wchar_t __wchar) __THROW; + + +/* Convert a multibyte string to a wide char string. */ +extern size_t mbstowcs (wchar_t *__restrict __pwcs, + const char *__restrict __s, size_t __n) __THROW; +/* Convert a wide char string to multibyte string. */ +extern size_t wcstombs (char *__restrict __s, + const wchar_t *__restrict __pwcs, size_t __n) + __THROW; + + +#ifdef __USE_MISC +/* Determine whether the string value of RESPONSE matches the affirmation + or negative response expression as specified by the LC_MESSAGES category + in the program's current locale. Returns 1 if affirmative, 0 if + negative, and -1 if not matching. */ +extern int rpmatch (const char *__response) __THROW __nonnull ((1)) __wur; +#endif + + +#if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8 +/* Parse comma separated suboption from *OPTIONP and match against + strings in TOKENS. If found return index and set *VALUEP to + optional value introduced by an equal sign. If the suboption is + not part of TOKENS return in *VALUEP beginning of unknown + suboption. On exit *OPTIONP is set to the beginning of the next + token or at the terminating NUL character. */ +extern int getsubopt (char **__restrict __optionp, + char *const *__restrict __tokens, + char **__restrict __valuep) + __THROW __nonnull ((1, 2, 3)) __wur; +#endif + + +#ifdef __USE_XOPEN +/* Setup DES tables according KEY. */ +extern void setkey (const char *__key) __THROW __nonnull ((1)); +#endif + + +/* X/Open pseudo terminal handling. */ + +#ifdef __USE_XOPEN2KXSI +/* Return a master pseudo-terminal handle. */ +extern int posix_openpt (int __oflag) __wur; +#endif + +#ifdef __USE_XOPEN_EXTENDED +/* The next four functions all take a master pseudo-tty fd and + perform an operation on the associated slave: */ + +/* Chown the slave to the calling user. */ +extern int grantpt (int __fd) __THROW; + +/* Release an internal lock so the slave can be opened. + Call after grantpt(). */ +extern int unlockpt (int __fd) __THROW; + +/* Return the pathname of the pseudo terminal slave associated with + the master FD is open on, or NULL on errors. + The returned storage is good until the next call to this function. */ +extern char *ptsname (int __fd) __THROW __wur; +#endif + +#ifdef __USE_GNU +/* Store at most BUFLEN characters of the pathname of the slave pseudo + terminal associated with the master FD is open on in BUF. + Return 0 on success, otherwise an error number. */ +extern int ptsname_r (int __fd, char *__buf, size_t __buflen) + __THROW __nonnull ((2)); + +/* Open a master pseudo terminal and return its file descriptor. */ +extern int getpt (void); +#endif + +#ifdef __USE_MISC +/* Put the 1 minute, 5 minute and 15 minute load averages into the first + NELEM elements of LOADAVG. Return the number written (never more than + three, but may be less than NELEM), or -1 if an error occurred. */ +extern int getloadavg (double __loadavg[], int __nelem) + __THROW __nonnull ((1)); +#endif + +#if defined __USE_XOPEN_EXTENDED && !defined __USE_XOPEN2K +/* Return the index into the active-logins file (utmp) for + the controlling terminal. */ +extern int ttyslot (void) __THROW; +#endif + +#include <bits/stdlib-float.h> + +/* Define some macros helping to catch buffer overflows. */ +#if __USE_FORTIFY_LEVEL > 0 && defined __fortify_function +# include <bits/stdlib.h> +#endif +#ifdef __LDBL_COMPAT +# include <bits/stdlib-ldbl.h> +#endif + +__END_DECLS + +#endif /* stdlib.h */ diff --git a/REORG.TODO/stdlib/strfmon.c b/REORG.TODO/stdlib/strfmon.c new file mode 100644 index 0000000000..dfaa9e0d9c --- /dev/null +++ b/REORG.TODO/stdlib/strfmon.c @@ -0,0 +1,39 @@ +/* Formatting a monetary value according to the current locale. + Copyright (C) 1996-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com> + and Jochen Hein <Jochen.Hein@informatik.TU-Clausthal.de>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <monetary.h> +#include <stdarg.h> +#include <locale/localeinfo.h> +#include <math_ldbl_opt.h> + +ssize_t +__strfmon (char *s, size_t maxsize, const char *format, ...) +{ + va_list ap; + + va_start (ap, format); + + ssize_t res = __vstrfmon_l (s, maxsize, _NL_CURRENT_LOCALE, format, ap); + + va_end (ap); + + return res; +} +ldbl_strong_alias (__strfmon, strfmon) diff --git a/REORG.TODO/stdlib/strfmon_l.c b/REORG.TODO/stdlib/strfmon_l.c new file mode 100644 index 0000000000..af64173800 --- /dev/null +++ b/REORG.TODO/stdlib/strfmon_l.c @@ -0,0 +1,625 @@ +/* Formatting a monetary value according to the given locale. + Copyright (C) 1996-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <ctype.h> +#include <errno.h> +#include <langinfo.h> +#include <locale.h> +#include <monetary.h> +#include "../libio/libioP.h" +#include "../libio/strfile.h" +#include <printf.h> +#include <stdarg.h> +#include <stdio.h> +#include <string.h> +#include "../locale/localeinfo.h" + + +#define out_char(Ch) \ + do { \ + if (dest >= s + maxsize - 1) \ + { \ + __set_errno (E2BIG); \ + va_end (ap); \ + return -1; \ + } \ + *dest++ = (Ch); \ + } while (0) + +#define out_string(String) \ + do { \ + const char *_s = (String); \ + while (*_s) \ + out_char (*_s++); \ + } while (0) + +#define out_nstring(String, N) \ + do { \ + int _n = (N); \ + const char *_s = (String); \ + while (_n-- > 0) \ + out_char (*_s++); \ + } while (0) + +#define to_digit(Ch) ((Ch) - '0') + + +/* We use this code also for the extended locale handling where the + function gets as an additional argument the locale which has to be + used. To access the values we have to redefine the _NL_CURRENT + macro. */ +#undef _NL_CURRENT +#define _NL_CURRENT(category, item) \ + (current->values[_NL_ITEM_INDEX (item)].string) + +/* This function determines the number of digit groups in the output. + The definition is in printf_fp.c. */ +extern unsigned int __guess_grouping (unsigned int intdig_max, + const char *grouping, wchar_t sepchar); + + +/* We have to overcome some problems with this implementation. On the + one hand the strfmon() function is specified in XPG4 and of course + it has to follow this. But on the other hand POSIX.2 specifies + some information in the LC_MONETARY category which should be used, + too. Some of the information contradicts the information which can + be specified in format string. */ +ssize_t +__vstrfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, + va_list ap) +{ + struct __locale_data *current = loc->__locales[LC_MONETARY]; + _IO_strfile f; + struct printf_info info; + char *dest; /* Pointer so copy the output. */ + const char *fmt; /* Pointer that walks through format. */ + + dest = s; + fmt = format; + + /* Loop through the format-string. */ + while (*fmt != '\0') + { + /* The floating-point value to output. */ + union + { + double dbl; + __long_double_t ldbl; + } + fpnum; + int int_format; + int print_curr_symbol; + int left_prec; + int left_pad; + int right_prec; + int group; + char pad; + int is_long_double; + int p_sign_posn; + int n_sign_posn; + int sign_posn; + int other_sign_posn; + int left; + int is_negative; + int sep_by_space; + int other_sep_by_space; + int cs_precedes; + int other_cs_precedes; + const char *sign_string; + const char *other_sign_string; + int done; + const char *currency_symbol; + size_t currency_symbol_len; + long int width; + char *startp; + const void *ptr; + char space_char; + + /* Process all character which do not introduce a format + specification. */ + if (*fmt != '%') + { + out_char (*fmt++); + continue; + } + + /* "%%" means a single '%' character. */ + if (fmt[1] == '%') + { + out_char (*++fmt); + ++fmt; + continue; + } + + /* Defaults for formatting. */ + int_format = 0; /* Use international curr. symbol */ + print_curr_symbol = 1; /* Print the currency symbol. */ + left_prec = -1; /* No left precision specified. */ + right_prec = -1; /* No right precision specified. */ + group = 1; /* Print digits grouped. */ + pad = ' '; /* Fill character is <SP>. */ + is_long_double = 0; /* Double argument by default. */ + p_sign_posn = -2; /* This indicates whether the */ + n_sign_posn = -2; /* '(' flag is given. */ + width = -1; /* No width specified so far. */ + left = 0; /* Right justified by default. */ + + /* Parse group characters. */ + while (1) + { + switch (*++fmt) + { + case '=': /* Set fill character. */ + pad = *++fmt; + if (pad == '\0') + { + /* Premature EOS. */ + __set_errno (EINVAL); + return -1; + } + continue; + case '^': /* Don't group digits. */ + group = 0; + continue; + case '+': /* Use +/- for sign of number. */ + if (n_sign_posn != -2) + { + __set_errno (EINVAL); + return -1; + } + p_sign_posn = *_NL_CURRENT (LC_MONETARY, P_SIGN_POSN); + n_sign_posn = *_NL_CURRENT (LC_MONETARY, N_SIGN_POSN); + continue; + case '(': /* Use ( ) for negative sign. */ + if (n_sign_posn != -2) + { + __set_errno (EINVAL); + return -1; + } + p_sign_posn = 0; + n_sign_posn = 0; + continue; + case '!': /* Don't print the currency symbol. */ + print_curr_symbol = 0; + continue; + case '-': /* Print left justified. */ + left = 1; + continue; + default: + /* Will stop the loop. */; + } + break; + } + + if (isdigit (*fmt)) + { + /* Parse field width. */ + width = to_digit (*fmt); + + while (isdigit (*++fmt)) + { + int val = to_digit (*fmt); + + if (width > LONG_MAX / 10 + || (width == LONG_MAX && val > LONG_MAX % 10)) + { + __set_errno (E2BIG); + return -1; + } + + width = width * 10 + val; + } + + /* If we don't have enough room for the demanded width we + can stop now and return an error. */ + if (width >= maxsize - (dest - s)) + { + __set_errno (E2BIG); + return -1; + } + } + + /* Recognize left precision. */ + if (*fmt == '#') + { + if (!isdigit (*++fmt)) + { + __set_errno (EINVAL); + return -1; + } + left_prec = to_digit (*fmt); + + while (isdigit (*++fmt)) + { + left_prec *= 10; + left_prec += to_digit (*fmt); + } + } + + /* Recognize right precision. */ + if (*fmt == '.') + { + if (!isdigit (*++fmt)) + { + __set_errno (EINVAL); + return -1; + } + right_prec = to_digit (*fmt); + + while (isdigit (*++fmt)) + { + right_prec *= 10; + right_prec += to_digit (*fmt); + } + } + + /* Handle modifier. This is an extension. */ + if (*fmt == 'L') + { + ++fmt; + if (!__ldbl_is_dbl) + is_long_double = 1; + } + + /* Handle format specifier. */ + char int_symbol[4]; + switch (*fmt++) + { + case 'i': { /* Use international currency symbol. */ + const char *int_curr_symbol; + + int_curr_symbol = _NL_CURRENT (LC_MONETARY, INT_CURR_SYMBOL); + strncpy(int_symbol, int_curr_symbol, 3); + int_symbol[3] = '\0'; + + currency_symbol_len = 3; + currency_symbol = &int_symbol[0]; + space_char = int_curr_symbol[3]; + int_format = 1; + break; + } + case 'n': /* Use national currency symbol. */ + currency_symbol = _NL_CURRENT (LC_MONETARY, CURRENCY_SYMBOL); + currency_symbol_len = strlen (currency_symbol); + space_char = ' '; + int_format = 0; + break; + default: /* Any unrecognized format is an error. */ + __set_errno (EINVAL); + return -1; + } + + /* If not specified by the format string now find the values for + the format specification. */ + if (p_sign_posn == -2) + p_sign_posn = *_NL_CURRENT (LC_MONETARY, int_format ? INT_P_SIGN_POSN : P_SIGN_POSN); + if (n_sign_posn == -2) + n_sign_posn = *_NL_CURRENT (LC_MONETARY, int_format ? INT_N_SIGN_POSN : N_SIGN_POSN); + + if (right_prec == -1) + { + right_prec = *_NL_CURRENT (LC_MONETARY, int_format ? INT_FRAC_DIGITS : FRAC_DIGITS); + + if (right_prec == '\377') + right_prec = 2; + } + + /* If we have to print the digits grouped determine how many + extra characters this means. */ + if (group && left_prec != -1) + left_prec += __guess_grouping (left_prec, + _NL_CURRENT (LC_MONETARY, MON_GROUPING), + *_NL_CURRENT (LC_MONETARY, + MON_THOUSANDS_SEP)); + + /* Now it's time to get the value. */ + if (is_long_double == 1) + { + fpnum.ldbl = va_arg (ap, long double); + is_negative = fpnum.ldbl < 0; + if (is_negative) + fpnum.ldbl = -fpnum.ldbl; + } + else + { + fpnum.dbl = va_arg (ap, double); + is_negative = fpnum.dbl < 0; + if (is_negative) + fpnum.dbl = -fpnum.dbl; + } + + /* We now know the sign of the value and can determine the format. */ + if (is_negative) + { + sign_string = _NL_CURRENT (LC_MONETARY, NEGATIVE_SIGN); + /* If the locale does not specify a character for the + negative sign we use a '-'. */ + if (*sign_string == '\0') + sign_string = (const char *) "-"; + cs_precedes = *_NL_CURRENT (LC_MONETARY, int_format ? INT_N_CS_PRECEDES : N_CS_PRECEDES); + sep_by_space = *_NL_CURRENT (LC_MONETARY, int_format ? INT_N_SEP_BY_SPACE : N_SEP_BY_SPACE); + sign_posn = n_sign_posn; + + other_sign_string = _NL_CURRENT (LC_MONETARY, POSITIVE_SIGN); + other_cs_precedes = *_NL_CURRENT (LC_MONETARY, int_format ? INT_P_CS_PRECEDES : P_CS_PRECEDES); + other_sep_by_space = *_NL_CURRENT (LC_MONETARY, int_format ? INT_P_SEP_BY_SPACE : P_SEP_BY_SPACE); + other_sign_posn = p_sign_posn; + } + else + { + sign_string = _NL_CURRENT (LC_MONETARY, POSITIVE_SIGN); + cs_precedes = *_NL_CURRENT (LC_MONETARY, int_format ? INT_P_CS_PRECEDES : P_CS_PRECEDES); + sep_by_space = *_NL_CURRENT (LC_MONETARY, int_format ? INT_P_SEP_BY_SPACE : P_SEP_BY_SPACE); + sign_posn = p_sign_posn; + + other_sign_string = _NL_CURRENT (LC_MONETARY, NEGATIVE_SIGN); + if (*other_sign_string == '\0') + other_sign_string = (const char *) "-"; + other_cs_precedes = *_NL_CURRENT (LC_MONETARY, int_format ? INT_N_CS_PRECEDES : N_CS_PRECEDES); + other_sep_by_space = *_NL_CURRENT (LC_MONETARY, int_format ? INT_N_SEP_BY_SPACE : N_SEP_BY_SPACE); + other_sign_posn = n_sign_posn; + } + + /* Set default values for unspecified information. */ + if (cs_precedes != 0) + cs_precedes = 1; + if (other_cs_precedes != 0) + other_cs_precedes = 1; + if (sep_by_space == '\377') + sep_by_space = 0; + if (other_sep_by_space == '\377') + other_sep_by_space = 0; + if (sign_posn == '\377') + sign_posn = 1; + if (other_sign_posn == '\377') + other_sign_posn = 1; + + /* Check for degenerate cases */ + if (sep_by_space == 2) + { + if (sign_posn == 0 || + (sign_posn == 1 && !cs_precedes) || + (sign_posn == 2 && cs_precedes)) + /* sign and symbol are not adjacent, so no separator */ + sep_by_space = 0; + } + if (other_sep_by_space == 2) + { + if (other_sign_posn == 0 || + (other_sign_posn == 1 && !other_cs_precedes) || + (other_sign_posn == 2 && other_cs_precedes)) + /* sign and symbol are not adjacent, so no separator */ + other_sep_by_space = 0; + } + + /* Set the left precision and padding needed for alignment */ + if (left_prec == -1) + { + left_prec = 0; + left_pad = 0; + } + else + { + /* Set left_pad to number of spaces needed to align positive + and negative formats */ + + int left_bytes = 0; + int other_left_bytes = 0; + + /* Work out number of bytes for currency string and separator + preceding the value */ + if (cs_precedes) + { + left_bytes += currency_symbol_len; + if (sep_by_space != 0) + ++left_bytes; + } + + if (other_cs_precedes) + { + other_left_bytes += currency_symbol_len; + if (other_sep_by_space != 0) + ++other_left_bytes; + } + + /* Work out number of bytes for the sign (or left parenthesis) + preceding the value */ + if (sign_posn == 0 && is_negative) + ++left_bytes; + else if (sign_posn == 1) + left_bytes += strlen (sign_string); + else if (cs_precedes && (sign_posn == 3 || sign_posn == 4)) + left_bytes += strlen (sign_string); + + if (other_sign_posn == 0 && !is_negative) + ++other_left_bytes; + else if (other_sign_posn == 1) + other_left_bytes += strlen (other_sign_string); + else if (other_cs_precedes && + (other_sign_posn == 3 || other_sign_posn == 4)) + other_left_bytes += strlen (other_sign_string); + + /* Compare the number of bytes preceding the value for + each format, and set the padding accordingly */ + if (other_left_bytes > left_bytes) + left_pad = other_left_bytes - left_bytes; + else + left_pad = 0; + } + + /* Perhaps we'll someday make these things configurable so + better start using symbolic names now. */ +#define left_paren '(' +#define right_paren ')' + + startp = dest; /* Remember start so we can compute length. */ + + while (left_pad-- > 0) + out_char (' '); + + if (sign_posn == 0 && is_negative) + out_char (left_paren); + + if (cs_precedes) + { + if (sign_posn != 0 && sign_posn != 2 && sign_posn != 4 + && sign_posn != 5) + { + out_string (sign_string); + if (sep_by_space == 2) + out_char (' '); + } + + if (print_curr_symbol) + out_string (currency_symbol); + + if (sign_posn == 4) + { + if (print_curr_symbol && sep_by_space == 2) + out_char (space_char); + out_string (sign_string); + if (sep_by_space == 1) + /* POSIX.2 and SUS are not clear on this case, but C99 + says a space follows the adjacent-symbol-and-sign */ + out_char (' '); + } + else + if (print_curr_symbol && sep_by_space == 1) + out_char (space_char); + } + else + if (sign_posn != 0 && sign_posn != 2 && sign_posn != 3 + && sign_posn != 4 && sign_posn != 5) + out_string (sign_string); + + /* Print the number. */ +#ifdef _IO_MTSAFE_IO + f._sbf._f._lock = NULL; +#endif + _IO_init_internal (&f._sbf._f, 0); + _IO_JUMPS (&f._sbf) = &_IO_str_jumps; + _IO_str_init_static_internal (&f, dest, (s + maxsize) - dest, dest); + /* We clear the last available byte so we can find out whether + the numeric representation is too long. */ + s[maxsize - 1] = '\0'; + + memset (&info, '\0', sizeof (info)); + info.prec = right_prec; + info.width = left_prec + (right_prec ? (right_prec + 1) : 0); + info.spec = 'f'; + info.is_long_double = is_long_double; + info.group = group; + info.pad = pad; + info.extra = 1; /* This means use values from LC_MONETARY. */ + + ptr = &fpnum; + done = __printf_fp_l (&f._sbf._f, loc, &info, &ptr); + if (done < 0) + return -1; + + if (s[maxsize - 1] != '\0') + { + __set_errno (E2BIG); + return -1; + } + + dest += done; + + if (!cs_precedes) + { + if (sign_posn == 3) + { + if (sep_by_space == 1) + out_char (' '); + out_string (sign_string); + } + + if (print_curr_symbol) + { + if ((sign_posn == 3 && sep_by_space == 2) + || (sign_posn == 4 && sep_by_space == 1) + || (sign_posn == 2 && sep_by_space == 1) + || (sign_posn == 1 && sep_by_space == 1) + || (sign_posn == 0 && sep_by_space == 1)) + out_char (space_char); + out_nstring (currency_symbol, currency_symbol_len); + } + + if (sign_posn == 4) + { + if (sep_by_space == 2) + out_char (' '); + out_string (sign_string); + } + } + + if (sign_posn == 2) + { + if (sep_by_space == 2) + out_char (' '); + out_string (sign_string); + } + + if (sign_posn == 0 && is_negative) + out_char (right_paren); + + /* Now test whether the output width is filled. */ + if (dest - startp < width) + { + if (left) + /* We simply have to fill using spaces. */ + do + out_char (' '); + while (dest - startp < width); + else + { + long int dist = width - (dest - startp); + for (char *cp = dest - 1; cp >= startp; --cp) + cp[dist] = cp[0]; + + dest += dist; + + do + startp[--dist] = ' '; + while (dist > 0); + } + } + } + + /* Terminate the string. */ + *dest = '\0'; + + return dest - s; +} + +ssize_t +___strfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, ...) +{ + va_list ap; + + va_start (ap, format); + + ssize_t res = __vstrfmon_l (s, maxsize, loc, format, ap); + + va_end (ap); + + return res; +} +ldbl_strong_alias (___strfmon_l, __strfmon_l) +ldbl_weak_alias (___strfmon_l, strfmon_l) diff --git a/REORG.TODO/stdlib/strfrom-skeleton.c b/REORG.TODO/stdlib/strfrom-skeleton.c new file mode 100644 index 0000000000..5841919fe4 --- /dev/null +++ b/REORG.TODO/stdlib/strfrom-skeleton.c @@ -0,0 +1,155 @@ +/* Convert a floating-point number to string. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* Generic implementation for strfrom functions. The implementation is generic + for several floating-point types (e.g.: float, double), so that each + function, such as strfromf and strfroml, share the same code, thus avoiding + code duplication. */ + +#include <ctype.h> +#include "../libio/libioP.h" +#include "../libio/strfile.h" +#include <printf.h> +#include <string.h> +#include <locale/localeinfo.h> + +#define UCHAR_T char +#define L_(Str) Str +#define ISDIGIT(Ch) isdigit (Ch) +#include "stdio-common/printf-parse.h" + +int +STRFROM (char *dest, size_t size, const char *format, FLOAT f) +{ + _IO_strnfile sfile; +#ifdef _IO_MTSAFE_IO + sfile.f._sbf._f._lock = NULL; +#endif + + int done; + + /* Single-precision values need to be stored in a double type, because + __printf_fp_l and __printf_fphex do not accept the float type. */ + union { + double flt; + FLOAT value; + } fpnum; + const void *fpptr; + fpptr = &fpnum; + + /* Variables to control the output format. */ + int precision = -1; /* printf_fp and printf_fphex treat this internally. */ + int specifier; + struct printf_info info; + + /* Single-precision values need to be converted into double-precision, + because __printf_fp and __printf_fphex only accept double and long double + as the floating-point argument. */ + if (__builtin_types_compatible_p (FLOAT, float)) + fpnum.flt = f; + else + fpnum.value = f; + + /* Check if the first character in the format string is indeed the '%' + character. Otherwise, abort. */ + if (*format == '%') + format++; + else + abort (); + + /* The optional precision specification always starts with a '.'. If such + character is present, read the precision. */ + if (*format == '.') + { + format++; + + /* Parse the precision. */ + if (ISDIGIT (*format)) + precision = read_int (&format); + /* If only the period is specified, the precision is taken as zero, as + described in ISO/IEC 9899:2011, section 7.21.6.1, 4th paragraph, 3rd + item. */ + else + precision = 0; + } + + /* Now there is only the conversion specifier to be read. */ + switch (*format) + { + case 'a': + case 'A': + case 'e': + case 'E': + case 'f': + case 'F': + case 'g': + case 'G': + specifier = *format; + break; + default: + abort (); + } + + /* The following code to prepare the virtual file has been adapted from the + function _IO_vsnprintf from libio. */ + + if (size == 0) + { + /* When size is zero, nothing is written and dest may be a null pointer. + This is specified for snprintf in ISO/IEC 9899:2011, Section 7.21.6.5, + in the second paragraph. Thus, if size is zero, prepare to use the + overflow buffer right from the start. */ + dest = sfile.overflow_buf; + size = sizeof (sfile.overflow_buf); + } + + /* Prepare the virtual string file. */ + _IO_no_init (&sfile.f._sbf._f, _IO_USER_LOCK, -1, NULL, NULL); + _IO_JUMPS (&sfile.f._sbf) = &_IO_strn_jumps; + _IO_str_init_static_internal (&sfile.f, dest, size - 1, dest); + + /* Prepare the format specification for printf_fp. */ + memset (&info, '\0', sizeof (info)); + + /* The functions strfromd and strfromf pass a floating-point number with + double precision to printf_fp, whereas strfroml passes a floating-point + number with long double precision. The following line informs printf_fp + which type of floating-point number is being passed. */ + info.is_long_double = __builtin_types_compatible_p (FLOAT, long double); + + /* Similarly, the function strfromf128 passes a floating-point number in + _Float128 format to printf_fp. */ +#if __HAVE_DISTINCT_FLOAT128 + info.is_binary128 = __builtin_types_compatible_p (FLOAT, _Float128); +#endif + + /* Set info according to the format string. */ + info.prec = precision; + info.spec = specifier; + + if (info.spec != 'a' && info.spec != 'A') + done = __printf_fp_l (&sfile.f._sbf._f, _NL_CURRENT_LOCALE, &info, &fpptr); + else + done = __printf_fphex (&sfile.f._sbf._f, &info, &fpptr); + + /* Terminate the string. */ + if (sfile.f._sbf._f._IO_buf_base != sfile.overflow_buf) + *sfile.f._sbf._f._IO_write_ptr = '\0'; + + return done; +} diff --git a/REORG.TODO/stdlib/strfromd.c b/REORG.TODO/stdlib/strfromd.c new file mode 100644 index 0000000000..5342059008 --- /dev/null +++ b/REORG.TODO/stdlib/strfromd.c @@ -0,0 +1,22 @@ +/* Definitions for strfromd. Implementation in stdlib/strfrom-skeleton.c. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define FLOAT double +#define STRFROM strfromd + +#include "strfrom-skeleton.c" diff --git a/REORG.TODO/stdlib/strfromf.c b/REORG.TODO/stdlib/strfromf.c new file mode 100644 index 0000000000..20c674414d --- /dev/null +++ b/REORG.TODO/stdlib/strfromf.c @@ -0,0 +1,22 @@ +/* Definitions for strfromf. Implementation in stdlib/strfrom-skeleton.c. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define FLOAT float +#define STRFROM strfromf + +#include "strfrom-skeleton.c" diff --git a/REORG.TODO/stdlib/strfroml.c b/REORG.TODO/stdlib/strfroml.c new file mode 100644 index 0000000000..f8c8a4fcc5 --- /dev/null +++ b/REORG.TODO/stdlib/strfroml.c @@ -0,0 +1,22 @@ +/* Definitions for strfroml. Implementation in stdlib/strfrom-skeleton.c. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define FLOAT long double +#define STRFROM strfroml + +#include "strfrom-skeleton.c" diff --git a/REORG.TODO/stdlib/strtod.c b/REORG.TODO/stdlib/strtod.c new file mode 100644 index 0000000000..2ac1b2e57a --- /dev/null +++ b/REORG.TODO/stdlib/strtod.c @@ -0,0 +1,80 @@ +/* Read decimal floating point numbers. + This file is part of the GNU C Library. + Copyright (C) 1995-2017 Free Software Foundation, Inc. + Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <wchar.h> +#include <locale/localeinfo.h> + + +#ifndef FLOAT +# include <math_ldbl_opt.h> +# define FLOAT double +# ifdef USE_WIDE_CHAR +# define STRTOF wcstod +# define STRTOF_L __wcstod_l +# else +# define STRTOF strtod +# define STRTOF_L __strtod_l +# endif +#endif + +#ifdef USE_WIDE_CHAR +# include <wctype.h> +# define STRING_TYPE wchar_t +#else +# define STRING_TYPE char +#endif + +#define INTERNAL(x) INTERNAL1(x) +#define INTERNAL1(x) __##x##_internal + + +FLOAT +INTERNAL (STRTOF) (const STRING_TYPE *nptr, STRING_TYPE **endptr, int group) +{ + return INTERNAL(STRTOF_L) (nptr, endptr, group, _NL_CURRENT_LOCALE); +} +#if defined _LIBC +libc_hidden_def (INTERNAL (STRTOF)) +#endif + + +FLOAT +#ifdef weak_function +weak_function +#endif +STRTOF (const STRING_TYPE *nptr, STRING_TYPE **endptr) +{ + return INTERNAL(STRTOF_L) (nptr, endptr, 0, _NL_CURRENT_LOCALE); +} +#if defined _LIBC +libc_hidden_def (STRTOF) +#endif + +#ifdef LONG_DOUBLE_COMPAT +# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_0) +# ifdef USE_WIDE_CHAR +compat_symbol (libc, wcstod, wcstold, GLIBC_2_0); +compat_symbol (libc, __wcstod_internal, __wcstold_internal, GLIBC_2_0); +# else +compat_symbol (libc, strtod, strtold, GLIBC_2_0); +compat_symbol (libc, __strtod_internal, __strtold_internal, GLIBC_2_0); +# endif +# endif +#endif diff --git a/REORG.TODO/stdlib/strtod_l.c b/REORG.TODO/stdlib/strtod_l.c new file mode 100644 index 0000000000..99c2af357e --- /dev/null +++ b/REORG.TODO/stdlib/strtod_l.c @@ -0,0 +1,1787 @@ +/* Convert string representing a number to float value, using given locale. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <xlocale.h> + +extern double ____strtod_l_internal (const char *, char **, int, __locale_t); + +/* Configuration part. These macros are defined by `strtold.c', + `strtof.c', `wcstod.c', `wcstold.c', and `wcstof.c' to produce the + `long double' and `float' versions of the reader. */ +#ifndef FLOAT +# include <math_ldbl_opt.h> +# define FLOAT double +# define FLT DBL +# ifdef USE_WIDE_CHAR +# define STRTOF wcstod_l +# define __STRTOF __wcstod_l +# define STRTOF_NAN __wcstod_nan +# else +# define STRTOF strtod_l +# define __STRTOF __strtod_l +# define STRTOF_NAN __strtod_nan +# endif +# define MPN2FLOAT __mpn_construct_double +# define FLOAT_HUGE_VAL HUGE_VAL +#endif +/* End of configuration part. */ + +#include <ctype.h> +#include <errno.h> +#include <float.h> +#include "../locale/localeinfo.h" +#include <locale.h> +#include <math.h> +#include <math_private.h> +#include <stdlib.h> +#include <string.h> +#include <stdint.h> +#include <rounding-mode.h> +#include <tininess.h> + +/* The gmp headers need some configuration frobs. */ +#define HAVE_ALLOCA 1 + +/* Include gmp-mparam.h first, such that definitions of _SHORT_LIMB + and _LONG_LONG_LIMB in it can take effect into gmp.h. */ +#include <gmp-mparam.h> +#include <gmp.h> +#include "gmp-impl.h" +#include "longlong.h" +#include "fpioconst.h" + +#include <assert.h> + + +/* We use this code for the extended locale handling where the + function gets as an additional argument the locale which has to be + used. To access the values we have to redefine the _NL_CURRENT and + _NL_CURRENT_WORD macros. */ +#undef _NL_CURRENT +#define _NL_CURRENT(category, item) \ + (current->values[_NL_ITEM_INDEX (item)].string) +#undef _NL_CURRENT_WORD +#define _NL_CURRENT_WORD(category, item) \ + ((uint32_t) current->values[_NL_ITEM_INDEX (item)].word) + +#if defined _LIBC || defined HAVE_WCHAR_H +# include <wchar.h> +#endif + +#ifdef USE_WIDE_CHAR +# include <wctype.h> +# define STRING_TYPE wchar_t +# define CHAR_TYPE wint_t +# define L_(Ch) L##Ch +# define ISSPACE(Ch) __iswspace_l ((Ch), loc) +# define ISDIGIT(Ch) __iswdigit_l ((Ch), loc) +# define ISXDIGIT(Ch) __iswxdigit_l ((Ch), loc) +# define TOLOWER(Ch) __towlower_l ((Ch), loc) +# define TOLOWER_C(Ch) __towlower_l ((Ch), _nl_C_locobj_ptr) +# define STRNCASECMP(S1, S2, N) \ + __wcsncasecmp_l ((S1), (S2), (N), _nl_C_locobj_ptr) +#else +# define STRING_TYPE char +# define CHAR_TYPE char +# define L_(Ch) Ch +# define ISSPACE(Ch) __isspace_l ((Ch), loc) +# define ISDIGIT(Ch) __isdigit_l ((Ch), loc) +# define ISXDIGIT(Ch) __isxdigit_l ((Ch), loc) +# define TOLOWER(Ch) __tolower_l ((Ch), loc) +# define TOLOWER_C(Ch) __tolower_l ((Ch), _nl_C_locobj_ptr) +# define STRNCASECMP(S1, S2, N) \ + __strncasecmp_l ((S1), (S2), (N), _nl_C_locobj_ptr) +#endif + + +/* Constants we need from float.h; select the set for the FLOAT precision. */ +#define MANT_DIG PASTE(FLT,_MANT_DIG) +#define DIG PASTE(FLT,_DIG) +#define MAX_EXP PASTE(FLT,_MAX_EXP) +#define MIN_EXP PASTE(FLT,_MIN_EXP) +#define MAX_10_EXP PASTE(FLT,_MAX_10_EXP) +#define MIN_10_EXP PASTE(FLT,_MIN_10_EXP) +#define MAX_VALUE PASTE(FLT,_MAX) +#define MIN_VALUE PASTE(FLT,_MIN) + +/* Extra macros required to get FLT expanded before the pasting. */ +#define PASTE(a,b) PASTE1(a,b) +#define PASTE1(a,b) a##b + +/* Function to construct a floating point number from an MP integer + containing the fraction bits, a base 2 exponent, and a sign flag. */ +extern FLOAT MPN2FLOAT (mp_srcptr mpn, int exponent, int negative); + +/* Definitions according to limb size used. */ +#if BITS_PER_MP_LIMB == 32 +# define MAX_DIG_PER_LIMB 9 +# define MAX_FAC_PER_LIMB 1000000000UL +#elif BITS_PER_MP_LIMB == 64 +# define MAX_DIG_PER_LIMB 19 +# define MAX_FAC_PER_LIMB 10000000000000000000ULL +#else +# error "mp_limb_t size " BITS_PER_MP_LIMB "not accounted for" +#endif + +extern const mp_limb_t _tens_in_limb[MAX_DIG_PER_LIMB + 1]; + +#ifndef howmany +#define howmany(x,y) (((x)+((y)-1))/(y)) +#endif +#define SWAP(x, y) ({ typeof(x) _tmp = x; x = y; y = _tmp; }) + +#define RETURN_LIMB_SIZE howmany (MANT_DIG, BITS_PER_MP_LIMB) + +#define RETURN(val,end) \ + do { if (endptr != NULL) *endptr = (STRING_TYPE *) (end); \ + return val; } while (0) + +/* Maximum size necessary for mpn integers to hold floating point + numbers. The largest number we need to hold is 10^n where 2^-n is + 1/4 ulp of the smallest representable value (that is, n = MANT_DIG + - MIN_EXP + 2). Approximate using 10^3 < 2^10. */ +#define MPNSIZE (howmany (1 + ((MANT_DIG - MIN_EXP + 2) * 10) / 3, \ + BITS_PER_MP_LIMB) + 2) +/* Declare an mpn integer variable that big. */ +#define MPN_VAR(name) mp_limb_t name[MPNSIZE]; mp_size_t name##size +/* Copy an mpn integer value. */ +#define MPN_ASSIGN(dst, src) \ + memcpy (dst, src, (dst##size = src##size) * sizeof (mp_limb_t)) + + +/* Set errno and return an overflowing value with sign specified by + NEGATIVE. */ +static FLOAT +overflow_value (int negative) +{ + __set_errno (ERANGE); + FLOAT result = math_narrow_eval ((negative ? -MAX_VALUE : MAX_VALUE) + * MAX_VALUE); + return result; +} + + +/* Set errno and return an underflowing value with sign specified by + NEGATIVE. */ +static FLOAT +underflow_value (int negative) +{ + __set_errno (ERANGE); + FLOAT result = math_narrow_eval ((negative ? -MIN_VALUE : MIN_VALUE) + * MIN_VALUE); + return result; +} + + +/* Return a floating point number of the needed type according to the given + multi-precision number after possible rounding. */ +static FLOAT +round_and_return (mp_limb_t *retval, intmax_t exponent, int negative, + mp_limb_t round_limb, mp_size_t round_bit, int more_bits) +{ + int mode = get_rounding_mode (); + + if (exponent < MIN_EXP - 1) + { + if (exponent < MIN_EXP - 1 - MANT_DIG) + return underflow_value (negative); + + mp_size_t shift = MIN_EXP - 1 - exponent; + bool is_tiny = true; + + more_bits |= (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0; + if (shift == MANT_DIG) + /* This is a special case to handle the very seldom case where + the mantissa will be empty after the shift. */ + { + int i; + + round_limb = retval[RETURN_LIMB_SIZE - 1]; + round_bit = (MANT_DIG - 1) % BITS_PER_MP_LIMB; + for (i = 0; i < RETURN_LIMB_SIZE - 1; ++i) + more_bits |= retval[i] != 0; + MPN_ZERO (retval, RETURN_LIMB_SIZE); + } + else if (shift >= BITS_PER_MP_LIMB) + { + int i; + + round_limb = retval[(shift - 1) / BITS_PER_MP_LIMB]; + round_bit = (shift - 1) % BITS_PER_MP_LIMB; + for (i = 0; i < (shift - 1) / BITS_PER_MP_LIMB; ++i) + more_bits |= retval[i] != 0; + more_bits |= ((round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) + != 0); + + /* __mpn_rshift requires 0 < shift < BITS_PER_MP_LIMB. */ + if ((shift % BITS_PER_MP_LIMB) != 0) + (void) __mpn_rshift (retval, &retval[shift / BITS_PER_MP_LIMB], + RETURN_LIMB_SIZE - (shift / BITS_PER_MP_LIMB), + shift % BITS_PER_MP_LIMB); + else + for (i = 0; i < RETURN_LIMB_SIZE - (shift / BITS_PER_MP_LIMB); i++) + retval[i] = retval[i + (shift / BITS_PER_MP_LIMB)]; + MPN_ZERO (&retval[RETURN_LIMB_SIZE - (shift / BITS_PER_MP_LIMB)], + shift / BITS_PER_MP_LIMB); + } + else if (shift > 0) + { + if (TININESS_AFTER_ROUNDING && shift == 1) + { + /* Whether the result counts as tiny depends on whether, + after rounding to the normal precision, it still has + a subnormal exponent. */ + mp_limb_t retval_normal[RETURN_LIMB_SIZE]; + if (round_away (negative, + (retval[0] & 1) != 0, + (round_limb + & (((mp_limb_t) 1) << round_bit)) != 0, + (more_bits + || ((round_limb + & ((((mp_limb_t) 1) << round_bit) - 1)) + != 0)), + mode)) + { + mp_limb_t cy = __mpn_add_1 (retval_normal, retval, + RETURN_LIMB_SIZE, 1); + + if (((MANT_DIG % BITS_PER_MP_LIMB) == 0 && cy) || + ((MANT_DIG % BITS_PER_MP_LIMB) != 0 && + ((retval_normal[RETURN_LIMB_SIZE - 1] + & (((mp_limb_t) 1) << (MANT_DIG % BITS_PER_MP_LIMB))) + != 0))) + is_tiny = false; + } + } + round_limb = retval[0]; + round_bit = shift - 1; + (void) __mpn_rshift (retval, retval, RETURN_LIMB_SIZE, shift); + } + /* This is a hook for the m68k long double format, where the + exponent bias is the same for normalized and denormalized + numbers. */ +#ifndef DENORM_EXP +# define DENORM_EXP (MIN_EXP - 2) +#endif + exponent = DENORM_EXP; + if (is_tiny + && ((round_limb & (((mp_limb_t) 1) << round_bit)) != 0 + || more_bits + || (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0)) + { + __set_errno (ERANGE); + FLOAT force_underflow = MIN_VALUE * MIN_VALUE; + math_force_eval (force_underflow); + } + } + + if (exponent > MAX_EXP) + goto overflow; + + bool half_bit = (round_limb & (((mp_limb_t) 1) << round_bit)) != 0; + bool more_bits_nonzero + = (more_bits + || (round_limb & ((((mp_limb_t) 1) << round_bit) - 1)) != 0); + if (round_away (negative, + (retval[0] & 1) != 0, + half_bit, + more_bits_nonzero, + mode)) + { + mp_limb_t cy = __mpn_add_1 (retval, retval, RETURN_LIMB_SIZE, 1); + + if (((MANT_DIG % BITS_PER_MP_LIMB) == 0 && cy) || + ((MANT_DIG % BITS_PER_MP_LIMB) != 0 && + (retval[RETURN_LIMB_SIZE - 1] + & (((mp_limb_t) 1) << (MANT_DIG % BITS_PER_MP_LIMB))) != 0)) + { + ++exponent; + (void) __mpn_rshift (retval, retval, RETURN_LIMB_SIZE, 1); + retval[RETURN_LIMB_SIZE - 1] + |= ((mp_limb_t) 1) << ((MANT_DIG - 1) % BITS_PER_MP_LIMB); + } + else if (exponent == DENORM_EXP + && (retval[RETURN_LIMB_SIZE - 1] + & (((mp_limb_t) 1) << ((MANT_DIG - 1) % BITS_PER_MP_LIMB))) + != 0) + /* The number was denormalized but now normalized. */ + exponent = MIN_EXP - 1; + } + + if (exponent > MAX_EXP) + overflow: + return overflow_value (negative); + + if (half_bit || more_bits_nonzero) + { + FLOAT force_inexact = (FLOAT) 1 + MIN_VALUE; + math_force_eval (force_inexact); + } + return MPN2FLOAT (retval, exponent, negative); +} + + +/* Read a multi-precision integer starting at STR with exactly DIGCNT digits + into N. Return the size of the number limbs in NSIZE at the first + character od the string that is not part of the integer as the function + value. If the EXPONENT is small enough to be taken as an additional + factor for the resulting number (see code) multiply by it. */ +static const STRING_TYPE * +str_to_mpn (const STRING_TYPE *str, int digcnt, mp_limb_t *n, mp_size_t *nsize, + intmax_t *exponent +#ifndef USE_WIDE_CHAR + , const char *decimal, size_t decimal_len, const char *thousands +#endif + + ) +{ + /* Number of digits for actual limb. */ + int cnt = 0; + mp_limb_t low = 0; + mp_limb_t start; + + *nsize = 0; + assert (digcnt > 0); + do + { + if (cnt == MAX_DIG_PER_LIMB) + { + if (*nsize == 0) + { + n[0] = low; + *nsize = 1; + } + else + { + mp_limb_t cy; + cy = __mpn_mul_1 (n, n, *nsize, MAX_FAC_PER_LIMB); + cy += __mpn_add_1 (n, n, *nsize, low); + if (cy != 0) + { + assert (*nsize < MPNSIZE); + n[*nsize] = cy; + ++(*nsize); + } + } + cnt = 0; + low = 0; + } + + /* There might be thousands separators or radix characters in + the string. But these all can be ignored because we know the + format of the number is correct and we have an exact number + of characters to read. */ +#ifdef USE_WIDE_CHAR + if (*str < L'0' || *str > L'9') + ++str; +#else + if (*str < '0' || *str > '9') + { + int inner = 0; + if (thousands != NULL && *str == *thousands + && ({ for (inner = 1; thousands[inner] != '\0'; ++inner) + if (thousands[inner] != str[inner]) + break; + thousands[inner] == '\0'; })) + str += inner; + else + str += decimal_len; + } +#endif + low = low * 10 + *str++ - L_('0'); + ++cnt; + } + while (--digcnt > 0); + + if (*exponent > 0 && *exponent <= MAX_DIG_PER_LIMB - cnt) + { + low *= _tens_in_limb[*exponent]; + start = _tens_in_limb[cnt + *exponent]; + *exponent = 0; + } + else + start = _tens_in_limb[cnt]; + + if (*nsize == 0) + { + n[0] = low; + *nsize = 1; + } + else + { + mp_limb_t cy; + cy = __mpn_mul_1 (n, n, *nsize, start); + cy += __mpn_add_1 (n, n, *nsize, low); + if (cy != 0) + { + assert (*nsize < MPNSIZE); + n[(*nsize)++] = cy; + } + } + + return str; +} + + +/* Shift {PTR, SIZE} COUNT bits to the left, and fill the vacated bits + with the COUNT most significant bits of LIMB. + + Implemented as a macro, so that __builtin_constant_p works even at -O0. + + Tege doesn't like this macro so I have to write it here myself. :) + --drepper */ +#define __mpn_lshift_1(ptr, size, count, limb) \ + do \ + { \ + mp_limb_t *__ptr = (ptr); \ + if (__builtin_constant_p (count) && count == BITS_PER_MP_LIMB) \ + { \ + mp_size_t i; \ + for (i = (size) - 1; i > 0; --i) \ + __ptr[i] = __ptr[i - 1]; \ + __ptr[0] = (limb); \ + } \ + else \ + { \ + /* We assume count > 0 && count < BITS_PER_MP_LIMB here. */ \ + unsigned int __count = (count); \ + (void) __mpn_lshift (__ptr, __ptr, size, __count); \ + __ptr[0] |= (limb) >> (BITS_PER_MP_LIMB - __count); \ + } \ + } \ + while (0) + + +#define INTERNAL(x) INTERNAL1(x) +#define INTERNAL1(x) __##x##_internal +#ifndef ____STRTOF_INTERNAL +# define ____STRTOF_INTERNAL INTERNAL (__STRTOF) +#endif + +/* This file defines a function to check for correct grouping. */ +#include "grouping.h" + + +/* Return a floating point number with the value of the given string NPTR. + Set *ENDPTR to the character after the last used one. If the number is + smaller than the smallest representable number, set `errno' to ERANGE and + return 0.0. If the number is too big to be represented, set `errno' to + ERANGE and return HUGE_VAL with the appropriate sign. */ +FLOAT +____STRTOF_INTERNAL (const STRING_TYPE *nptr, STRING_TYPE **endptr, int group, + __locale_t loc) +{ + int negative; /* The sign of the number. */ + MPN_VAR (num); /* MP representation of the number. */ + intmax_t exponent; /* Exponent of the number. */ + + /* Numbers starting `0X' or `0x' have to be processed with base 16. */ + int base = 10; + + /* When we have to compute fractional digits we form a fraction with a + second multi-precision number (and we sometimes need a second for + temporary results). */ + MPN_VAR (den); + + /* Representation for the return value. */ + mp_limb_t retval[RETURN_LIMB_SIZE]; + /* Number of bits currently in result value. */ + int bits; + + /* Running pointer after the last character processed in the string. */ + const STRING_TYPE *cp, *tp; + /* Start of significant part of the number. */ + const STRING_TYPE *startp, *start_of_digits; + /* Points at the character following the integer and fractional digits. */ + const STRING_TYPE *expp; + /* Total number of digit and number of digits in integer part. */ + size_t dig_no, int_no, lead_zero; + /* Contains the last character read. */ + CHAR_TYPE c; + +/* We should get wint_t from <stddef.h>, but not all GCC versions define it + there. So define it ourselves if it remains undefined. */ +#ifndef _WINT_T + typedef unsigned int wint_t; +#endif + /* The radix character of the current locale. */ +#ifdef USE_WIDE_CHAR + wchar_t decimal; +#else + const char *decimal; + size_t decimal_len; +#endif + /* The thousands character of the current locale. */ +#ifdef USE_WIDE_CHAR + wchar_t thousands = L'\0'; +#else + const char *thousands = NULL; +#endif + /* The numeric grouping specification of the current locale, + in the format described in <locale.h>. */ + const char *grouping; + /* Used in several places. */ + int cnt; + + struct __locale_data *current = loc->__locales[LC_NUMERIC]; + + if (__glibc_unlikely (group)) + { + grouping = _NL_CURRENT (LC_NUMERIC, GROUPING); + if (*grouping <= 0 || *grouping == CHAR_MAX) + grouping = NULL; + else + { + /* Figure out the thousands separator character. */ +#ifdef USE_WIDE_CHAR + thousands = _NL_CURRENT_WORD (LC_NUMERIC, + _NL_NUMERIC_THOUSANDS_SEP_WC); + if (thousands == L'\0') + grouping = NULL; +#else + thousands = _NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP); + if (*thousands == '\0') + { + thousands = NULL; + grouping = NULL; + } +#endif + } + } + else + grouping = NULL; + + /* Find the locale's decimal point character. */ +#ifdef USE_WIDE_CHAR + decimal = _NL_CURRENT_WORD (LC_NUMERIC, _NL_NUMERIC_DECIMAL_POINT_WC); + assert (decimal != L'\0'); +# define decimal_len 1 +#else + decimal = _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT); + decimal_len = strlen (decimal); + assert (decimal_len > 0); +#endif + + /* Prepare number representation. */ + exponent = 0; + negative = 0; + bits = 0; + + /* Parse string to get maximal legal prefix. We need the number of + characters of the integer part, the fractional part and the exponent. */ + cp = nptr - 1; + /* Ignore leading white space. */ + do + c = *++cp; + while (ISSPACE (c)); + + /* Get sign of the result. */ + if (c == L_('-')) + { + negative = 1; + c = *++cp; + } + else if (c == L_('+')) + c = *++cp; + + /* Return 0.0 if no legal string is found. + No character is used even if a sign was found. */ +#ifdef USE_WIDE_CHAR + if (c == (wint_t) decimal + && (wint_t) cp[1] >= L'0' && (wint_t) cp[1] <= L'9') + { + /* We accept it. This funny construct is here only to indent + the code correctly. */ + } +#else + for (cnt = 0; decimal[cnt] != '\0'; ++cnt) + if (cp[cnt] != decimal[cnt]) + break; + if (decimal[cnt] == '\0' && cp[cnt] >= '0' && cp[cnt] <= '9') + { + /* We accept it. This funny construct is here only to indent + the code correctly. */ + } +#endif + else if (c < L_('0') || c > L_('9')) + { + /* Check for `INF' or `INFINITY'. */ + CHAR_TYPE lowc = TOLOWER_C (c); + + if (lowc == L_('i') && STRNCASECMP (cp, L_("inf"), 3) == 0) + { + /* Return +/- infinity. */ + if (endptr != NULL) + *endptr = (STRING_TYPE *) + (cp + (STRNCASECMP (cp + 3, L_("inity"), 5) == 0 + ? 8 : 3)); + + return negative ? -FLOAT_HUGE_VAL : FLOAT_HUGE_VAL; + } + + if (lowc == L_('n') && STRNCASECMP (cp, L_("nan"), 3) == 0) + { + /* Return NaN. */ + FLOAT retval = NAN; + + cp += 3; + + /* Match `(n-char-sequence-digit)'. */ + if (*cp == L_('(')) + { + const STRING_TYPE *startp = cp; + STRING_TYPE *endp; + retval = STRTOF_NAN (cp + 1, &endp, L_(')')); + if (*endp == L_(')')) + /* Consume the closing parenthesis. */ + cp = endp + 1; + else + /* Only match the NAN part. */ + cp = startp; + } + + if (endptr != NULL) + *endptr = (STRING_TYPE *) cp; + + return retval; + } + + /* It is really a text we do not recognize. */ + RETURN (0.0, nptr); + } + + /* First look whether we are faced with a hexadecimal number. */ + if (c == L_('0') && TOLOWER (cp[1]) == L_('x')) + { + /* Okay, it is a hexa-decimal number. Remember this and skip + the characters. BTW: hexadecimal numbers must not be + grouped. */ + base = 16; + cp += 2; + c = *cp; + grouping = NULL; + } + + /* Record the start of the digits, in case we will check their grouping. */ + start_of_digits = startp = cp; + + /* Ignore leading zeroes. This helps us to avoid useless computations. */ +#ifdef USE_WIDE_CHAR + while (c == L'0' || ((wint_t) thousands != L'\0' && c == (wint_t) thousands)) + c = *++cp; +#else + if (__glibc_likely (thousands == NULL)) + while (c == '0') + c = *++cp; + else + { + /* We also have the multibyte thousands string. */ + while (1) + { + if (c != '0') + { + for (cnt = 0; thousands[cnt] != '\0'; ++cnt) + if (thousands[cnt] != cp[cnt]) + break; + if (thousands[cnt] != '\0') + break; + cp += cnt - 1; + } + c = *++cp; + } + } +#endif + + /* If no other digit but a '0' is found the result is 0.0. + Return current read pointer. */ + CHAR_TYPE lowc = TOLOWER (c); + if (!((c >= L_('0') && c <= L_('9')) + || (base == 16 && lowc >= L_('a') && lowc <= L_('f')) + || ( +#ifdef USE_WIDE_CHAR + c == (wint_t) decimal +#else + ({ for (cnt = 0; decimal[cnt] != '\0'; ++cnt) + if (decimal[cnt] != cp[cnt]) + break; + decimal[cnt] == '\0'; }) +#endif + /* '0x.' alone is not a valid hexadecimal number. + '.' alone is not valid either, but that has been checked + already earlier. */ + && (base != 16 + || cp != start_of_digits + || (cp[decimal_len] >= L_('0') && cp[decimal_len] <= L_('9')) + || ({ CHAR_TYPE lo = TOLOWER (cp[decimal_len]); + lo >= L_('a') && lo <= L_('f'); }))) + || (base == 16 && (cp != start_of_digits + && lowc == L_('p'))) + || (base != 16 && lowc == L_('e')))) + { +#ifdef USE_WIDE_CHAR + tp = __correctly_grouped_prefixwc (start_of_digits, cp, thousands, + grouping); +#else + tp = __correctly_grouped_prefixmb (start_of_digits, cp, thousands, + grouping); +#endif + /* If TP is at the start of the digits, there was no correctly + grouped prefix of the string; so no number found. */ + RETURN (negative ? -0.0 : 0.0, + tp == start_of_digits ? (base == 16 ? cp - 1 : nptr) : tp); + } + + /* Remember first significant digit and read following characters until the + decimal point, exponent character or any non-FP number character. */ + startp = cp; + dig_no = 0; + while (1) + { + if ((c >= L_('0') && c <= L_('9')) + || (base == 16 + && ({ CHAR_TYPE lo = TOLOWER (c); + lo >= L_('a') && lo <= L_('f'); }))) + ++dig_no; + else + { +#ifdef USE_WIDE_CHAR + if (__builtin_expect ((wint_t) thousands == L'\0', 1) + || c != (wint_t) thousands) + /* Not a digit or separator: end of the integer part. */ + break; +#else + if (__glibc_likely (thousands == NULL)) + break; + else + { + for (cnt = 0; thousands[cnt] != '\0'; ++cnt) + if (thousands[cnt] != cp[cnt]) + break; + if (thousands[cnt] != '\0') + break; + cp += cnt - 1; + } +#endif + } + c = *++cp; + } + + if (__builtin_expect (grouping != NULL, 0) && cp > start_of_digits) + { + /* Check the grouping of the digits. */ +#ifdef USE_WIDE_CHAR + tp = __correctly_grouped_prefixwc (start_of_digits, cp, thousands, + grouping); +#else + tp = __correctly_grouped_prefixmb (start_of_digits, cp, thousands, + grouping); +#endif + if (cp != tp) + { + /* Less than the entire string was correctly grouped. */ + + if (tp == start_of_digits) + /* No valid group of numbers at all: no valid number. */ + RETURN (0.0, nptr); + + if (tp < startp) + /* The number is validly grouped, but consists + only of zeroes. The whole value is zero. */ + RETURN (negative ? -0.0 : 0.0, tp); + + /* Recompute DIG_NO so we won't read more digits than + are properly grouped. */ + cp = tp; + dig_no = 0; + for (tp = startp; tp < cp; ++tp) + if (*tp >= L_('0') && *tp <= L_('9')) + ++dig_no; + + int_no = dig_no; + lead_zero = 0; + + goto number_parsed; + } + } + + /* We have the number of digits in the integer part. Whether these + are all or any is really a fractional digit will be decided + later. */ + int_no = dig_no; + lead_zero = int_no == 0 ? (size_t) -1 : 0; + + /* Read the fractional digits. A special case are the 'american + style' numbers like `16.' i.e. with decimal point but without + trailing digits. */ + if ( +#ifdef USE_WIDE_CHAR + c == (wint_t) decimal +#else + ({ for (cnt = 0; decimal[cnt] != '\0'; ++cnt) + if (decimal[cnt] != cp[cnt]) + break; + decimal[cnt] == '\0'; }) +#endif + ) + { + cp += decimal_len; + c = *cp; + while ((c >= L_('0') && c <= L_('9')) || + (base == 16 && ({ CHAR_TYPE lo = TOLOWER (c); + lo >= L_('a') && lo <= L_('f'); }))) + { + if (c != L_('0') && lead_zero == (size_t) -1) + lead_zero = dig_no - int_no; + ++dig_no; + c = *++cp; + } + } + assert (dig_no <= (uintmax_t) INTMAX_MAX); + + /* Remember start of exponent (if any). */ + expp = cp; + + /* Read exponent. */ + lowc = TOLOWER (c); + if ((base == 16 && lowc == L_('p')) + || (base != 16 && lowc == L_('e'))) + { + int exp_negative = 0; + + c = *++cp; + if (c == L_('-')) + { + exp_negative = 1; + c = *++cp; + } + else if (c == L_('+')) + c = *++cp; + + if (c >= L_('0') && c <= L_('9')) + { + intmax_t exp_limit; + + /* Get the exponent limit. */ + if (base == 16) + { + if (exp_negative) + { + assert (int_no <= (uintmax_t) (INTMAX_MAX + + MIN_EXP - MANT_DIG) / 4); + exp_limit = -MIN_EXP + MANT_DIG + 4 * (intmax_t) int_no; + } + else + { + if (int_no) + { + assert (lead_zero == 0 + && int_no <= (uintmax_t) INTMAX_MAX / 4); + exp_limit = MAX_EXP - 4 * (intmax_t) int_no + 3; + } + else if (lead_zero == (size_t) -1) + { + /* The number is zero and this limit is + arbitrary. */ + exp_limit = MAX_EXP + 3; + } + else + { + assert (lead_zero + <= (uintmax_t) (INTMAX_MAX - MAX_EXP - 3) / 4); + exp_limit = (MAX_EXP + + 4 * (intmax_t) lead_zero + + 3); + } + } + } + else + { + if (exp_negative) + { + assert (int_no + <= (uintmax_t) (INTMAX_MAX + MIN_10_EXP - MANT_DIG)); + exp_limit = -MIN_10_EXP + MANT_DIG + (intmax_t) int_no; + } + else + { + if (int_no) + { + assert (lead_zero == 0 + && int_no <= (uintmax_t) INTMAX_MAX); + exp_limit = MAX_10_EXP - (intmax_t) int_no + 1; + } + else if (lead_zero == (size_t) -1) + { + /* The number is zero and this limit is + arbitrary. */ + exp_limit = MAX_10_EXP + 1; + } + else + { + assert (lead_zero + <= (uintmax_t) (INTMAX_MAX - MAX_10_EXP - 1)); + exp_limit = MAX_10_EXP + (intmax_t) lead_zero + 1; + } + } + } + + if (exp_limit < 0) + exp_limit = 0; + + do + { + if (__builtin_expect ((exponent > exp_limit / 10 + || (exponent == exp_limit / 10 + && c - L_('0') > exp_limit % 10)), 0)) + /* The exponent is too large/small to represent a valid + number. */ + { + FLOAT result; + + /* We have to take care for special situation: a joker + might have written "0.0e100000" which is in fact + zero. */ + if (lead_zero == (size_t) -1) + result = negative ? -0.0 : 0.0; + else + { + /* Overflow or underflow. */ + result = (exp_negative + ? underflow_value (negative) + : overflow_value (negative)); + } + + /* Accept all following digits as part of the exponent. */ + do + ++cp; + while (*cp >= L_('0') && *cp <= L_('9')); + + RETURN (result, cp); + /* NOTREACHED */ + } + + exponent *= 10; + exponent += c - L_('0'); + + c = *++cp; + } + while (c >= L_('0') && c <= L_('9')); + + if (exp_negative) + exponent = -exponent; + } + else + cp = expp; + } + + /* We don't want to have to work with trailing zeroes after the radix. */ + if (dig_no > int_no) + { + while (expp[-1] == L_('0')) + { + --expp; + --dig_no; + } + assert (dig_no >= int_no); + } + + if (dig_no == int_no && dig_no > 0 && exponent < 0) + do + { + while (! (base == 16 ? ISXDIGIT (expp[-1]) : ISDIGIT (expp[-1]))) + --expp; + + if (expp[-1] != L_('0')) + break; + + --expp; + --dig_no; + --int_no; + exponent += base == 16 ? 4 : 1; + } + while (dig_no > 0 && exponent < 0); + + number_parsed: + + /* The whole string is parsed. Store the address of the next character. */ + if (endptr) + *endptr = (STRING_TYPE *) cp; + + if (dig_no == 0) + return negative ? -0.0 : 0.0; + + if (lead_zero) + { + /* Find the decimal point */ +#ifdef USE_WIDE_CHAR + while (*startp != decimal) + ++startp; +#else + while (1) + { + if (*startp == decimal[0]) + { + for (cnt = 1; decimal[cnt] != '\0'; ++cnt) + if (decimal[cnt] != startp[cnt]) + break; + if (decimal[cnt] == '\0') + break; + } + ++startp; + } +#endif + startp += lead_zero + decimal_len; + assert (lead_zero <= (base == 16 + ? (uintmax_t) INTMAX_MAX / 4 + : (uintmax_t) INTMAX_MAX)); + assert (lead_zero <= (base == 16 + ? ((uintmax_t) exponent + - (uintmax_t) INTMAX_MIN) / 4 + : ((uintmax_t) exponent - (uintmax_t) INTMAX_MIN))); + exponent -= base == 16 ? 4 * (intmax_t) lead_zero : (intmax_t) lead_zero; + dig_no -= lead_zero; + } + + /* If the BASE is 16 we can use a simpler algorithm. */ + if (base == 16) + { + static const int nbits[16] = { 0, 1, 2, 2, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4 }; + int idx = (MANT_DIG - 1) / BITS_PER_MP_LIMB; + int pos = (MANT_DIG - 1) % BITS_PER_MP_LIMB; + mp_limb_t val; + + while (!ISXDIGIT (*startp)) + ++startp; + while (*startp == L_('0')) + ++startp; + if (ISDIGIT (*startp)) + val = *startp++ - L_('0'); + else + val = 10 + TOLOWER (*startp++) - L_('a'); + bits = nbits[val]; + /* We cannot have a leading zero. */ + assert (bits != 0); + + if (pos + 1 >= 4 || pos + 1 >= bits) + { + /* We don't have to care for wrapping. This is the normal + case so we add the first clause in the `if' expression as + an optimization. It is a compile-time constant and so does + not cost anything. */ + retval[idx] = val << (pos - bits + 1); + pos -= bits; + } + else + { + retval[idx--] = val >> (bits - pos - 1); + retval[idx] = val << (BITS_PER_MP_LIMB - (bits - pos - 1)); + pos = BITS_PER_MP_LIMB - 1 - (bits - pos - 1); + } + + /* Adjust the exponent for the bits we are shifting in. */ + assert (int_no <= (uintmax_t) (exponent < 0 + ? (INTMAX_MAX - bits + 1) / 4 + : (INTMAX_MAX - exponent - bits + 1) / 4)); + exponent += bits - 1 + ((intmax_t) int_no - 1) * 4; + + while (--dig_no > 0 && idx >= 0) + { + if (!ISXDIGIT (*startp)) + startp += decimal_len; + if (ISDIGIT (*startp)) + val = *startp++ - L_('0'); + else + val = 10 + TOLOWER (*startp++) - L_('a'); + + if (pos + 1 >= 4) + { + retval[idx] |= val << (pos - 4 + 1); + pos -= 4; + } + else + { + retval[idx--] |= val >> (4 - pos - 1); + val <<= BITS_PER_MP_LIMB - (4 - pos - 1); + if (idx < 0) + { + int rest_nonzero = 0; + while (--dig_no > 0) + { + if (*startp != L_('0')) + { + rest_nonzero = 1; + break; + } + startp++; + } + return round_and_return (retval, exponent, negative, val, + BITS_PER_MP_LIMB - 1, rest_nonzero); + } + + retval[idx] = val; + pos = BITS_PER_MP_LIMB - 1 - (4 - pos - 1); + } + } + + /* We ran out of digits. */ + MPN_ZERO (retval, idx); + + return round_and_return (retval, exponent, negative, 0, 0, 0); + } + + /* Now we have the number of digits in total and the integer digits as well + as the exponent and its sign. We can decide whether the read digits are + really integer digits or belong to the fractional part; i.e. we normalize + 123e-2 to 1.23. */ + { + intmax_t incr = (exponent < 0 + ? MAX (-(intmax_t) int_no, exponent) + : MIN ((intmax_t) dig_no - (intmax_t) int_no, exponent)); + int_no += incr; + exponent -= incr; + } + + if (__glibc_unlikely (exponent > MAX_10_EXP + 1 - (intmax_t) int_no)) + return overflow_value (negative); + + /* 10^(MIN_10_EXP-1) is not normal. Thus, 10^(MIN_10_EXP-1) / + 2^MANT_DIG is below half the least subnormal, so anything with a + base-10 exponent less than the base-10 exponent (which is + MIN_10_EXP - 1 - ceil(MANT_DIG*log10(2))) of that value + underflows. DIG is floor((MANT_DIG-1)log10(2)), so an exponent + below MIN_10_EXP - (DIG + 3) underflows. But EXPONENT is + actually an exponent multiplied only by a fractional part, not an + integer part, so an exponent below MIN_10_EXP - (DIG + 2) + underflows. */ + if (__glibc_unlikely (exponent < MIN_10_EXP - (DIG + 2))) + return underflow_value (negative); + + if (int_no > 0) + { + /* Read the integer part as a multi-precision number to NUM. */ + startp = str_to_mpn (startp, int_no, num, &numsize, &exponent +#ifndef USE_WIDE_CHAR + , decimal, decimal_len, thousands +#endif + ); + + if (exponent > 0) + { + /* We now multiply the gained number by the given power of ten. */ + mp_limb_t *psrc = num; + mp_limb_t *pdest = den; + int expbit = 1; + const struct mp_power *ttab = &_fpioconst_pow10[0]; + + do + { + if ((exponent & expbit) != 0) + { + size_t size = ttab->arraysize - _FPIO_CONST_OFFSET; + mp_limb_t cy; + exponent ^= expbit; + + /* FIXME: not the whole multiplication has to be + done. If we have the needed number of bits we + only need the information whether more non-zero + bits follow. */ + if (numsize >= ttab->arraysize - _FPIO_CONST_OFFSET) + cy = __mpn_mul (pdest, psrc, numsize, + &__tens[ttab->arrayoff + + _FPIO_CONST_OFFSET], + size); + else + cy = __mpn_mul (pdest, &__tens[ttab->arrayoff + + _FPIO_CONST_OFFSET], + size, psrc, numsize); + numsize += size; + if (cy == 0) + --numsize; + (void) SWAP (psrc, pdest); + } + expbit <<= 1; + ++ttab; + } + while (exponent != 0); + + if (psrc == den) + memcpy (num, den, numsize * sizeof (mp_limb_t)); + } + + /* Determine how many bits of the result we already have. */ + count_leading_zeros (bits, num[numsize - 1]); + bits = numsize * BITS_PER_MP_LIMB - bits; + + /* Now we know the exponent of the number in base two. + Check it against the maximum possible exponent. */ + if (__glibc_unlikely (bits > MAX_EXP)) + return overflow_value (negative); + + /* We have already the first BITS bits of the result. Together with + the information whether more non-zero bits follow this is enough + to determine the result. */ + if (bits > MANT_DIG) + { + int i; + const mp_size_t least_idx = (bits - MANT_DIG) / BITS_PER_MP_LIMB; + const mp_size_t least_bit = (bits - MANT_DIG) % BITS_PER_MP_LIMB; + const mp_size_t round_idx = least_bit == 0 ? least_idx - 1 + : least_idx; + const mp_size_t round_bit = least_bit == 0 ? BITS_PER_MP_LIMB - 1 + : least_bit - 1; + + if (least_bit == 0) + memcpy (retval, &num[least_idx], + RETURN_LIMB_SIZE * sizeof (mp_limb_t)); + else + { + for (i = least_idx; i < numsize - 1; ++i) + retval[i - least_idx] = (num[i] >> least_bit) + | (num[i + 1] + << (BITS_PER_MP_LIMB - least_bit)); + if (i - least_idx < RETURN_LIMB_SIZE) + retval[RETURN_LIMB_SIZE - 1] = num[i] >> least_bit; + } + + /* Check whether any limb beside the ones in RETVAL are non-zero. */ + for (i = 0; num[i] == 0; ++i) + ; + + return round_and_return (retval, bits - 1, negative, + num[round_idx], round_bit, + int_no < dig_no || i < round_idx); + /* NOTREACHED */ + } + else if (dig_no == int_no) + { + const mp_size_t target_bit = (MANT_DIG - 1) % BITS_PER_MP_LIMB; + const mp_size_t is_bit = (bits - 1) % BITS_PER_MP_LIMB; + + if (target_bit == is_bit) + { + memcpy (&retval[RETURN_LIMB_SIZE - numsize], num, + numsize * sizeof (mp_limb_t)); + /* FIXME: the following loop can be avoided if we assume a + maximal MANT_DIG value. */ + MPN_ZERO (retval, RETURN_LIMB_SIZE - numsize); + } + else if (target_bit > is_bit) + { + (void) __mpn_lshift (&retval[RETURN_LIMB_SIZE - numsize], + num, numsize, target_bit - is_bit); + /* FIXME: the following loop can be avoided if we assume a + maximal MANT_DIG value. */ + MPN_ZERO (retval, RETURN_LIMB_SIZE - numsize); + } + else + { + mp_limb_t cy; + assert (numsize < RETURN_LIMB_SIZE); + + cy = __mpn_rshift (&retval[RETURN_LIMB_SIZE - numsize], + num, numsize, is_bit - target_bit); + retval[RETURN_LIMB_SIZE - numsize - 1] = cy; + /* FIXME: the following loop can be avoided if we assume a + maximal MANT_DIG value. */ + MPN_ZERO (retval, RETURN_LIMB_SIZE - numsize - 1); + } + + return round_and_return (retval, bits - 1, negative, 0, 0, 0); + /* NOTREACHED */ + } + + /* Store the bits we already have. */ + memcpy (retval, num, numsize * sizeof (mp_limb_t)); +#if RETURN_LIMB_SIZE > 1 + if (numsize < RETURN_LIMB_SIZE) +# if RETURN_LIMB_SIZE == 2 + retval[numsize] = 0; +# else + MPN_ZERO (retval + numsize, RETURN_LIMB_SIZE - numsize); +# endif +#endif + } + + /* We have to compute at least some of the fractional digits. */ + { + /* We construct a fraction and the result of the division gives us + the needed digits. The denominator is 1.0 multiplied by the + exponent of the lowest digit; i.e. 0.123 gives 123 / 1000 and + 123e-6 gives 123 / 1000000. */ + + int expbit; + int neg_exp; + int more_bits; + int need_frac_digits; + mp_limb_t cy; + mp_limb_t *psrc = den; + mp_limb_t *pdest = num; + const struct mp_power *ttab = &_fpioconst_pow10[0]; + + assert (dig_no > int_no + && exponent <= 0 + && exponent >= MIN_10_EXP - (DIG + 2)); + + /* We need to compute MANT_DIG - BITS fractional bits that lie + within the mantissa of the result, the following bit for + rounding, and to know whether any subsequent bit is 0. + Computing a bit with value 2^-n means looking at n digits after + the decimal point. */ + if (bits > 0) + { + /* The bits required are those immediately after the point. */ + assert (int_no > 0 && exponent == 0); + need_frac_digits = 1 + MANT_DIG - bits; + } + else + { + /* The number is in the form .123eEXPONENT. */ + assert (int_no == 0 && *startp != L_('0')); + /* The number is at least 10^(EXPONENT-1), and 10^3 < + 2^10. */ + int neg_exp_2 = ((1 - exponent) * 10) / 3 + 1; + /* The number is at least 2^-NEG_EXP_2. We need up to + MANT_DIG bits following that bit. */ + need_frac_digits = neg_exp_2 + MANT_DIG; + /* However, we never need bits beyond 1/4 ulp of the smallest + representable value. (That 1/4 ulp bit is only needed to + determine tinyness on machines where tinyness is determined + after rounding.) */ + if (need_frac_digits > MANT_DIG - MIN_EXP + 2) + need_frac_digits = MANT_DIG - MIN_EXP + 2; + /* At this point, NEED_FRAC_DIGITS is the total number of + digits needed after the point, but some of those may be + leading 0s. */ + need_frac_digits += exponent; + /* Any cases underflowing enough that none of the fractional + digits are needed should have been caught earlier (such + cases are on the order of 10^-n or smaller where 2^-n is + the least subnormal). */ + assert (need_frac_digits > 0); + } + + if (need_frac_digits > (intmax_t) dig_no - (intmax_t) int_no) + need_frac_digits = (intmax_t) dig_no - (intmax_t) int_no; + + if ((intmax_t) dig_no > (intmax_t) int_no + need_frac_digits) + { + dig_no = int_no + need_frac_digits; + more_bits = 1; + } + else + more_bits = 0; + + neg_exp = (intmax_t) dig_no - (intmax_t) int_no - exponent; + + /* Construct the denominator. */ + densize = 0; + expbit = 1; + do + { + if ((neg_exp & expbit) != 0) + { + mp_limb_t cy; + neg_exp ^= expbit; + + if (densize == 0) + { + densize = ttab->arraysize - _FPIO_CONST_OFFSET; + memcpy (psrc, &__tens[ttab->arrayoff + _FPIO_CONST_OFFSET], + densize * sizeof (mp_limb_t)); + } + else + { + cy = __mpn_mul (pdest, &__tens[ttab->arrayoff + + _FPIO_CONST_OFFSET], + ttab->arraysize - _FPIO_CONST_OFFSET, + psrc, densize); + densize += ttab->arraysize - _FPIO_CONST_OFFSET; + if (cy == 0) + --densize; + (void) SWAP (psrc, pdest); + } + } + expbit <<= 1; + ++ttab; + } + while (neg_exp != 0); + + if (psrc == num) + memcpy (den, num, densize * sizeof (mp_limb_t)); + + /* Read the fractional digits from the string. */ + (void) str_to_mpn (startp, dig_no - int_no, num, &numsize, &exponent +#ifndef USE_WIDE_CHAR + , decimal, decimal_len, thousands +#endif + ); + + /* We now have to shift both numbers so that the highest bit in the + denominator is set. In the same process we copy the numerator to + a high place in the array so that the division constructs the wanted + digits. This is done by a "quasi fix point" number representation. + + num: ddddddddddd . 0000000000000000000000 + |--- m ---| + den: ddddddddddd n >= m + |--- n ---| + */ + + count_leading_zeros (cnt, den[densize - 1]); + + if (cnt > 0) + { + /* Don't call `mpn_shift' with a count of zero since the specification + does not allow this. */ + (void) __mpn_lshift (den, den, densize, cnt); + cy = __mpn_lshift (num, num, numsize, cnt); + if (cy != 0) + num[numsize++] = cy; + } + + /* Now we are ready for the division. But it is not necessary to + do a full multi-precision division because we only need a small + number of bits for the result. So we do not use __mpn_divmod + here but instead do the division here by hand and stop whenever + the needed number of bits is reached. The code itself comes + from the GNU MP Library by Torbj\"orn Granlund. */ + + exponent = bits; + + switch (densize) + { + case 1: + { + mp_limb_t d, n, quot; + int used = 0; + + n = num[0]; + d = den[0]; + assert (numsize == 1 && n < d); + + do + { + udiv_qrnnd (quot, n, n, 0, d); + +#define got_limb \ + if (bits == 0) \ + { \ + int cnt; \ + if (quot == 0) \ + cnt = BITS_PER_MP_LIMB; \ + else \ + count_leading_zeros (cnt, quot); \ + exponent -= cnt; \ + if (BITS_PER_MP_LIMB - cnt > MANT_DIG) \ + { \ + used = MANT_DIG + cnt; \ + retval[0] = quot >> (BITS_PER_MP_LIMB - used); \ + bits = MANT_DIG + 1; \ + } \ + else \ + { \ + /* Note that we only clear the second element. */ \ + /* The conditional is determined at compile time. */ \ + if (RETURN_LIMB_SIZE > 1) \ + retval[1] = 0; \ + retval[0] = quot; \ + bits = -cnt; \ + } \ + } \ + else if (bits + BITS_PER_MP_LIMB <= MANT_DIG) \ + __mpn_lshift_1 (retval, RETURN_LIMB_SIZE, BITS_PER_MP_LIMB, \ + quot); \ + else \ + { \ + used = MANT_DIG - bits; \ + if (used > 0) \ + __mpn_lshift_1 (retval, RETURN_LIMB_SIZE, used, quot); \ + } \ + bits += BITS_PER_MP_LIMB + + got_limb; + } + while (bits <= MANT_DIG); + + return round_and_return (retval, exponent - 1, negative, + quot, BITS_PER_MP_LIMB - 1 - used, + more_bits || n != 0); + } + case 2: + { + mp_limb_t d0, d1, n0, n1; + mp_limb_t quot = 0; + int used = 0; + + d0 = den[0]; + d1 = den[1]; + + if (numsize < densize) + { + if (num[0] >= d1) + { + /* The numerator of the number occupies fewer bits than + the denominator but the one limb is bigger than the + high limb of the numerator. */ + n1 = 0; + n0 = num[0]; + } + else + { + if (bits <= 0) + exponent -= BITS_PER_MP_LIMB; + else + { + if (bits + BITS_PER_MP_LIMB <= MANT_DIG) + __mpn_lshift_1 (retval, RETURN_LIMB_SIZE, + BITS_PER_MP_LIMB, 0); + else + { + used = MANT_DIG - bits; + if (used > 0) + __mpn_lshift_1 (retval, RETURN_LIMB_SIZE, used, 0); + } + bits += BITS_PER_MP_LIMB; + } + n1 = num[0]; + n0 = 0; + } + } + else + { + n1 = num[1]; + n0 = num[0]; + } + + while (bits <= MANT_DIG) + { + mp_limb_t r; + + if (n1 == d1) + { + /* QUOT should be either 111..111 or 111..110. We need + special treatment of this rare case as normal division + would give overflow. */ + quot = ~(mp_limb_t) 0; + + r = n0 + d1; + if (r < d1) /* Carry in the addition? */ + { + add_ssaaaa (n1, n0, r - d0, 0, 0, d0); + goto have_quot; + } + n1 = d0 - (d0 != 0); + n0 = -d0; + } + else + { + udiv_qrnnd (quot, r, n1, n0, d1); + umul_ppmm (n1, n0, d0, quot); + } + + q_test: + if (n1 > r || (n1 == r && n0 > 0)) + { + /* The estimated QUOT was too large. */ + --quot; + + sub_ddmmss (n1, n0, n1, n0, 0, d0); + r += d1; + if (r >= d1) /* If not carry, test QUOT again. */ + goto q_test; + } + sub_ddmmss (n1, n0, r, 0, n1, n0); + + have_quot: + got_limb; + } + + return round_and_return (retval, exponent - 1, negative, + quot, BITS_PER_MP_LIMB - 1 - used, + more_bits || n1 != 0 || n0 != 0); + } + default: + { + int i; + mp_limb_t cy, dX, d1, n0, n1; + mp_limb_t quot = 0; + int used = 0; + + dX = den[densize - 1]; + d1 = den[densize - 2]; + + /* The division does not work if the upper limb of the two-limb + numerator is greater than the denominator. */ + if (__mpn_cmp (num, &den[densize - numsize], numsize) > 0) + num[numsize++] = 0; + + if (numsize < densize) + { + mp_size_t empty = densize - numsize; + int i; + + if (bits <= 0) + exponent -= empty * BITS_PER_MP_LIMB; + else + { + if (bits + empty * BITS_PER_MP_LIMB <= MANT_DIG) + { + /* We make a difference here because the compiler + cannot optimize the `else' case that good and + this reflects all currently used FLOAT types + and GMP implementations. */ +#if RETURN_LIMB_SIZE <= 2 + assert (empty == 1); + __mpn_lshift_1 (retval, RETURN_LIMB_SIZE, + BITS_PER_MP_LIMB, 0); +#else + for (i = RETURN_LIMB_SIZE - 1; i >= empty; --i) + retval[i] = retval[i - empty]; + while (i >= 0) + retval[i--] = 0; +#endif + } + else + { + used = MANT_DIG - bits; + if (used >= BITS_PER_MP_LIMB) + { + int i; + (void) __mpn_lshift (&retval[used + / BITS_PER_MP_LIMB], + retval, + (RETURN_LIMB_SIZE + - used / BITS_PER_MP_LIMB), + used % BITS_PER_MP_LIMB); + for (i = used / BITS_PER_MP_LIMB - 1; i >= 0; --i) + retval[i] = 0; + } + else if (used > 0) + __mpn_lshift_1 (retval, RETURN_LIMB_SIZE, used, 0); + } + bits += empty * BITS_PER_MP_LIMB; + } + for (i = numsize; i > 0; --i) + num[i + empty] = num[i - 1]; + MPN_ZERO (num, empty + 1); + } + else + { + int i; + assert (numsize == densize); + for (i = numsize; i > 0; --i) + num[i] = num[i - 1]; + num[0] = 0; + } + + den[densize] = 0; + n0 = num[densize]; + + while (bits <= MANT_DIG) + { + if (n0 == dX) + /* This might over-estimate QUOT, but it's probably not + worth the extra code here to find out. */ + quot = ~(mp_limb_t) 0; + else + { + mp_limb_t r; + + udiv_qrnnd (quot, r, n0, num[densize - 1], dX); + umul_ppmm (n1, n0, d1, quot); + + while (n1 > r || (n1 == r && n0 > num[densize - 2])) + { + --quot; + r += dX; + if (r < dX) /* I.e. "carry in previous addition?" */ + break; + n1 -= n0 < d1; + n0 -= d1; + } + } + + /* Possible optimization: We already have (q * n0) and (1 * n1) + after the calculation of QUOT. Taking advantage of this, we + could make this loop make two iterations less. */ + + cy = __mpn_submul_1 (num, den, densize + 1, quot); + + if (num[densize] != cy) + { + cy = __mpn_add_n (num, num, den, densize); + assert (cy != 0); + --quot; + } + n0 = num[densize] = num[densize - 1]; + for (i = densize - 1; i > 0; --i) + num[i] = num[i - 1]; + num[0] = 0; + + got_limb; + } + + for (i = densize; i >= 0 && num[i] == 0; --i) + ; + return round_and_return (retval, exponent - 1, negative, + quot, BITS_PER_MP_LIMB - 1 - used, + more_bits || i >= 0); + } + } + } + + /* NOTREACHED */ +} +#if defined _LIBC && !defined USE_WIDE_CHAR +libc_hidden_def (____STRTOF_INTERNAL) +#endif + +/* External user entry point. */ + +FLOAT +#ifdef weak_function +weak_function +#endif +__STRTOF (const STRING_TYPE *nptr, STRING_TYPE **endptr, __locale_t loc) +{ + return ____STRTOF_INTERNAL (nptr, endptr, 0, loc); +} +#if defined _LIBC +libc_hidden_def (__STRTOF) +libc_hidden_ver (__STRTOF, STRTOF) +#endif +weak_alias (__STRTOF, STRTOF) + +#ifdef LONG_DOUBLE_COMPAT +# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_1) +# ifdef USE_WIDE_CHAR +compat_symbol (libc, __wcstod_l, __wcstold_l, GLIBC_2_1); +# else +compat_symbol (libc, __strtod_l, __strtold_l, GLIBC_2_1); +# endif +# endif +# if LONG_DOUBLE_COMPAT(libc, GLIBC_2_3) +# ifdef USE_WIDE_CHAR +compat_symbol (libc, wcstod_l, wcstold_l, GLIBC_2_3); +# else +compat_symbol (libc, strtod_l, strtold_l, GLIBC_2_3); +# endif +# endif +#endif diff --git a/REORG.TODO/stdlib/strtod_nan.c b/REORG.TODO/stdlib/strtod_nan.c new file mode 100644 index 0000000000..3fbfb46cfc --- /dev/null +++ b/REORG.TODO/stdlib/strtod_nan.c @@ -0,0 +1,24 @@ +/* Convert string for NaN payload to corresponding NaN. Narrow + strings, double. + Copyright (C) 2015-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <strtod_nan_narrow.h> +#include <strtod_nan_double.h> + +#define STRTOD_NAN __strtod_nan +#include <strtod_nan_main.c> diff --git a/REORG.TODO/stdlib/strtod_nan_double.h b/REORG.TODO/stdlib/strtod_nan_double.h new file mode 100644 index 0000000000..224654d005 --- /dev/null +++ b/REORG.TODO/stdlib/strtod_nan_double.h @@ -0,0 +1,30 @@ +/* Convert string for NaN payload to corresponding NaN. For double. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define FLOAT double +#define SET_MANTISSA(flt, mant) \ + do \ + { \ + union ieee754_double u; \ + u.d = (flt); \ + u.ieee_nan.mantissa0 = (mant) >> 32; \ + u.ieee_nan.mantissa1 = (mant); \ + if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \ + (flt) = u.d; \ + } \ + while (0) diff --git a/REORG.TODO/stdlib/strtod_nan_float.h b/REORG.TODO/stdlib/strtod_nan_float.h new file mode 100644 index 0000000000..99e95cc2e7 --- /dev/null +++ b/REORG.TODO/stdlib/strtod_nan_float.h @@ -0,0 +1,29 @@ +/* Convert string for NaN payload to corresponding NaN. For float. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define FLOAT float +#define SET_MANTISSA(flt, mant) \ + do \ + { \ + union ieee754_float u; \ + u.f = (flt); \ + u.ieee_nan.mantissa = (mant); \ + if (u.ieee.mantissa != 0) \ + (flt) = u.f; \ + } \ + while (0) diff --git a/REORG.TODO/stdlib/strtod_nan_main.c b/REORG.TODO/stdlib/strtod_nan_main.c new file mode 100644 index 0000000000..96b788cb1e --- /dev/null +++ b/REORG.TODO/stdlib/strtod_nan_main.c @@ -0,0 +1,63 @@ +/* Convert string for NaN payload to corresponding NaN. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <ieee754.h> +#include <locale.h> +#include <math.h> +#include <stdlib.h> +#include <wchar.h> + + +/* If STR starts with an optional n-char-sequence as defined by ISO C + (a sequence of ASCII letters, digits and underscores), followed by + ENDC, return a NaN whose payload is set based on STR. Otherwise, + return a default NAN. If ENDPTR is not NULL, set *ENDPTR to point + to the character after the initial n-char-sequence. */ + +internal_function +FLOAT +STRTOD_NAN (const STRING_TYPE *str, STRING_TYPE **endptr, STRING_TYPE endc) +{ + const STRING_TYPE *cp = str; + + while ((*cp >= L_('0') && *cp <= L_('9')) + || (*cp >= L_('A') && *cp <= L_('Z')) + || (*cp >= L_('a') && *cp <= L_('z')) + || *cp == L_('_')) + ++cp; + + FLOAT retval = NAN; + if (*cp != endc) + goto out; + + /* This is a system-dependent way to specify the bitmask used for + the NaN. We expect it to be a number which is put in the + mantissa of the number. */ + STRING_TYPE *endp; + unsigned long long int mant; + + mant = STRTOULL (str, &endp, 0); + if (endp == cp) + SET_MANTISSA (retval, mant); + + out: + if (endptr != NULL) + *endptr = (STRING_TYPE *) cp; + return retval; +} +libc_hidden_def (STRTOD_NAN) diff --git a/REORG.TODO/stdlib/strtod_nan_narrow.h b/REORG.TODO/stdlib/strtod_nan_narrow.h new file mode 100644 index 0000000000..15733c21ae --- /dev/null +++ b/REORG.TODO/stdlib/strtod_nan_narrow.h @@ -0,0 +1,22 @@ +/* Convert string for NaN payload to corresponding NaN. Narrow strings. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define STRING_TYPE char +#define L_(Ch) Ch +#define STRTOULL(S, E, B) ____strtoull_l_internal ((S), (E), (B), 0, \ + _nl_C_locobj_ptr) diff --git a/REORG.TODO/stdlib/strtod_nan_wide.h b/REORG.TODO/stdlib/strtod_nan_wide.h new file mode 100644 index 0000000000..23abb2c745 --- /dev/null +++ b/REORG.TODO/stdlib/strtod_nan_wide.h @@ -0,0 +1,22 @@ +/* Convert string for NaN payload to corresponding NaN. Wide strings. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define STRING_TYPE wchar_t +#define L_(Ch) L##Ch +#define STRTOULL(S, E, B) ____wcstoull_l_internal ((S), (E), (B), 0, \ + _nl_C_locobj_ptr) diff --git a/REORG.TODO/stdlib/strtof.c b/REORG.TODO/stdlib/strtof.c new file mode 100644 index 0000000000..600512134c --- /dev/null +++ b/REORG.TODO/stdlib/strtof.c @@ -0,0 +1,34 @@ +/* Read decimal floating point numbers. + This file is part of the GNU C Library. + Copyright (C) 1995-2017 Free Software Foundation, Inc. + Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* The actual implementation for all floating point sizes is in strtod.c. + These macros tell it to produce the `float' version, `strtof'. */ + +#define FLOAT float +#define FLT FLT +#ifdef USE_WIDE_CHAR +#define STRTOF wcstof +#define STRTOF_L __wcstof_l +#else +# define STRTOF strtof +# define STRTOF_L __strtof_l +#endif + + +#include "strtod.c" diff --git a/REORG.TODO/stdlib/strtof_l.c b/REORG.TODO/stdlib/strtof_l.c new file mode 100644 index 0000000000..57e557516a --- /dev/null +++ b/REORG.TODO/stdlib/strtof_l.c @@ -0,0 +1,38 @@ +/* Convert string representing a number to float value, using given locale. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <xlocale.h> + +extern float ____strtof_l_internal (const char *, char **, int, __locale_t); + +#define FLOAT float +#define FLT FLT +#ifdef USE_WIDE_CHAR +# define STRTOF wcstof_l +# define __STRTOF __wcstof_l +# define STRTOF_NAN __wcstof_nan +#else +# define STRTOF strtof_l +# define __STRTOF __strtof_l +# define STRTOF_NAN __strtof_nan +#endif +#define MPN2FLOAT __mpn_construct_float +#define FLOAT_HUGE_VAL HUGE_VALF + +#include "strtod_l.c" diff --git a/REORG.TODO/stdlib/strtof_nan.c b/REORG.TODO/stdlib/strtof_nan.c new file mode 100644 index 0000000000..0dd44294cc --- /dev/null +++ b/REORG.TODO/stdlib/strtof_nan.c @@ -0,0 +1,24 @@ +/* Convert string for NaN payload to corresponding NaN. Narrow + strings, float. + Copyright (C) 2015-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <strtod_nan_narrow.h> +#include <strtod_nan_float.h> + +#define STRTOD_NAN __strtof_nan +#include <strtod_nan_main.c> diff --git a/REORG.TODO/stdlib/strtoimax.c b/REORG.TODO/stdlib/strtoimax.c new file mode 100644 index 0000000000..f1de70f320 --- /dev/null +++ b/REORG.TODO/stdlib/strtoimax.c @@ -0,0 +1 @@ +#error "The correct implementation must be chosen based on the `intmax_t' type" diff --git a/REORG.TODO/stdlib/strtol.c b/REORG.TODO/stdlib/strtol.c new file mode 100644 index 0000000000..8ac8347e7d --- /dev/null +++ b/REORG.TODO/stdlib/strtol.c @@ -0,0 +1,109 @@ +/* Convert string representation of a number into an integer value. + Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <wchar.h> +#include <locale/localeinfo.h> + +#ifndef UNSIGNED +# define UNSIGNED 0 +# define INT LONG int +#else +# define INT unsigned LONG int +#endif + +#if UNSIGNED +# ifdef USE_WIDE_CHAR +# ifdef QUAD +# define strtol wcstoull +# define __strtol_l __wcstoull_l +# else +# define strtol wcstoul +# define __strtol_l __wcstoul_l +# endif +# else +# ifdef QUAD +# define strtol strtoull +# define __strtol_l __strtoull_l +# else +# define strtol strtoul +# define __strtol_l __strtoul_l +# endif +# endif +#else +# ifdef USE_WIDE_CHAR +# ifdef QUAD +# define strtol wcstoll +# define __strtol_l __wcstoll_l +# else +# define strtol wcstol +# define __strtol_l __wcstol_l +# endif +# else +# ifdef QUAD +# define strtol strtoll +# define __strtol_l __strtoll_l +# endif +# endif +#endif + + +/* If QUAD is defined, we are defining `strtoll' or `strtoull', + operating on `long long int's. */ +#ifdef QUAD +# define LONG long long +#else +# define LONG long +#endif + + +#ifdef USE_WIDE_CHAR +# define STRING_TYPE wchar_t +#else +# define STRING_TYPE char +#endif + + +#define INTERNAL(X) INTERNAL1(X) +#define INTERNAL1(X) __##X##_internal + +#define SYM__(X) SYM__1 (X) +#define SYM__1(X) __ ## X +#define __strtol SYM__ (strtol) + + +extern INT INTERNAL (__strtol_l) (const STRING_TYPE *, STRING_TYPE **, int, + int, __locale_t); + + +INT +INTERNAL (strtol) (const STRING_TYPE *nptr, STRING_TYPE **endptr, + int base, int group) +{ + return INTERNAL (__strtol_l) (nptr, endptr, base, group, _NL_CURRENT_LOCALE); +} +libc_hidden_def (INTERNAL (strtol)) + + +INT +__strtol (const STRING_TYPE *nptr, STRING_TYPE **endptr, int base) +{ + return INTERNAL (__strtol_l) (nptr, endptr, base, 0, _NL_CURRENT_LOCALE); +} +weak_alias (__strtol, strtol) +libc_hidden_weak (strtol) diff --git a/REORG.TODO/stdlib/strtol_l.c b/REORG.TODO/stdlib/strtol_l.c new file mode 100644 index 0000000000..5a0683b2bb --- /dev/null +++ b/REORG.TODO/stdlib/strtol_l.c @@ -0,0 +1,551 @@ +/* Convert string representing a number to integer value, using given locale. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#ifdef _LIBC +# define USE_NUMBER_GROUPING +# define HAVE_LIMITS_H +#endif + +#include <ctype.h> +#include <errno.h> +#ifndef __set_errno +# define __set_errno(Val) errno = (Val) +#endif + +#ifdef HAVE_LIMITS_H +# include <limits.h> +#endif + +#include <stddef.h> +#include <stdlib.h> +#include <string.h> +#include <locale.h> +#include <xlocale.h> +#include <stdint.h> +#include <bits/wordsize.h> + +#ifdef USE_NUMBER_GROUPING +# include "../locale/localeinfo.h" +#endif + +/* Nonzero if we are defining `strtoul' or `strtoull', operating on + unsigned integers. */ +#ifndef UNSIGNED +# define UNSIGNED 0 +# define INT LONG int +#else +# define INT unsigned LONG int +#endif + +/* Determine the name. */ +#if UNSIGNED +# ifdef USE_WIDE_CHAR +# ifdef QUAD +# define strtol_l wcstoull_l +# else +# define strtol_l wcstoul_l +# endif +# else +# ifdef QUAD +# define strtol_l strtoull_l +# else +# define strtol_l strtoul_l +# endif +# endif +#else +# ifdef USE_WIDE_CHAR +# ifdef QUAD +# define strtol_l wcstoll_l +# else +# define strtol_l wcstol_l +# endif +# else +# ifdef QUAD +# define strtol_l strtoll_l +# else +# define strtol_l strtol_l +# endif +# endif +#endif + +#define __strtol_l __strtol_l2(strtol_l) +#define __strtol_l2(name) __strtol_l3(name) +#define __strtol_l3(name) __##name + + +/* If QUAD is defined, we are defining `strtoll' or `strtoull', + operating on `long long int's. */ +#ifdef QUAD +# define LONG long long +# define STRTOL_LONG_MIN LONG_LONG_MIN +# define STRTOL_LONG_MAX LONG_LONG_MAX +# define STRTOL_ULONG_MAX ULONG_LONG_MAX +#else +# define LONG long + +# ifndef ULONG_MAX +# define ULONG_MAX ((unsigned long int) ~(unsigned long int) 0) +# endif +# ifndef LONG_MAX +# define LONG_MAX ((long int) (ULONG_MAX >> 1)) +# endif +# define STRTOL_LONG_MIN LONG_MIN +# define STRTOL_LONG_MAX LONG_MAX +# define STRTOL_ULONG_MAX ULONG_MAX +#endif + + +/* We use this code for the extended locale handling where the + function gets as an additional argument the locale which has to be + used. To access the values we have to redefine the _NL_CURRENT and + _NL_CURRENT_WORD macros. */ +#undef _NL_CURRENT +#define _NL_CURRENT(category, item) \ + (current->values[_NL_ITEM_INDEX (item)].string) +#undef _NL_CURRENT_WORD +#define _NL_CURRENT_WORD(category, item) \ + ((uint32_t) current->values[_NL_ITEM_INDEX (item)].word) + +#if defined _LIBC || defined HAVE_WCHAR_H +# include <wchar.h> +#endif + +#ifdef USE_WIDE_CHAR +# include <wctype.h> +# define L_(Ch) L##Ch +# define UCHAR_TYPE wint_t +# define STRING_TYPE wchar_t +# define ISSPACE(Ch) __iswspace_l ((Ch), loc) +# define ISALPHA(Ch) __iswalpha_l ((Ch), _nl_C_locobj_ptr) +# define TOUPPER(Ch) __towupper_l ((Ch), _nl_C_locobj_ptr) +#else +# if defined _LIBC \ + || defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII) +# define IN_CTYPE_DOMAIN(c) 1 +# else +# define IN_CTYPE_DOMAIN(c) isascii(c) +# endif +# define L_(Ch) Ch +# define UCHAR_TYPE unsigned char +# define STRING_TYPE char +# define ISSPACE(Ch) __isspace_l ((Ch), loc) +# define ISALPHA(Ch) __isalpha_l ((Ch), _nl_C_locobj_ptr) +# define TOUPPER(Ch) __toupper_l ((Ch), _nl_C_locobj_ptr) +#endif + +#define INTERNAL(X) INTERNAL1(X) +#define INTERNAL1(X) __##X##_internal +#define WEAKNAME(X) WEAKNAME1(X) + +#ifdef USE_NUMBER_GROUPING +/* This file defines a function to check for correct grouping. */ +# include "grouping.h" +#endif + + +/* Define tables of maximum values and remainders in order to detect + overflow. Do this at compile-time in order to avoid the runtime + overhead of the division. */ +extern const unsigned long __strtol_ul_max_tab[] attribute_hidden; +extern const unsigned char __strtol_ul_rem_tab[] attribute_hidden; +#if defined(QUAD) && __WORDSIZE == 32 +extern const unsigned long long __strtol_ull_max_tab[] attribute_hidden; +extern const unsigned char __strtol_ull_rem_tab[] attribute_hidden; +#endif + +#define DEF(TYPE, NAME) \ + const TYPE NAME[] attribute_hidden = \ + { \ + F(2), F(3), F(4), F(5), F(6), F(7), F(8), F(9), F(10), \ + F(11), F(12), F(13), F(14), F(15), F(16), F(17), F(18), F(19), F(20), \ + F(21), F(22), F(23), F(24), F(25), F(26), F(27), F(28), F(29), F(30), \ + F(31), F(32), F(33), F(34), F(35), F(36) \ + } + +#if !UNSIGNED && !defined (USE_WIDE_CHAR) && !defined (QUAD) +# define F(X) ULONG_MAX / X + DEF (unsigned long, __strtol_ul_max_tab); +# undef F +# define F(X) ULONG_MAX % X + DEF (unsigned char, __strtol_ul_rem_tab); +# undef F +#endif +#if !UNSIGNED && !defined (USE_WIDE_CHAR) && defined (QUAD) \ + && __WORDSIZE == 32 +# define F(X) ULONG_LONG_MAX / X + DEF (unsigned long long, __strtol_ull_max_tab); +# undef F +# define F(X) ULONG_LONG_MAX % X + DEF (unsigned char, __strtol_ull_rem_tab); +# undef F +#endif +#undef DEF + +/* Define some more readable aliases for these arrays which correspond + to how they'll be used in the function below. */ +#define jmax_tab __strtol_ul_max_tab +#if defined(QUAD) && __WORDSIZE == 32 +# define cutoff_tab __strtol_ull_max_tab +# define cutlim_tab __strtol_ull_rem_tab +#else +# define cutoff_tab __strtol_ul_max_tab +# define cutlim_tab __strtol_ul_rem_tab +#endif + + +/* Convert NPTR to an `unsigned long int' or `long int' in base BASE. + If BASE is 0 the base is determined by the presence of a leading + zero, indicating octal or a leading "0x" or "0X", indicating hexadecimal. + If BASE is < 2 or > 36, it is reset to 10. + If ENDPTR is not NULL, a pointer to the character after the last + one converted is stored in *ENDPTR. */ + +INT +INTERNAL (__strtol_l) (const STRING_TYPE *nptr, STRING_TYPE **endptr, + int base, int group, __locale_t loc) +{ + int negative; + unsigned LONG int cutoff; + unsigned int cutlim; + unsigned LONG int i; + const STRING_TYPE *s; + UCHAR_TYPE c; + const STRING_TYPE *save, *end; + int overflow; +#ifndef USE_WIDE_CHAR + size_t cnt; +#endif + +#ifdef USE_NUMBER_GROUPING + struct __locale_data *current = loc->__locales[LC_NUMERIC]; + /* The thousands character of the current locale. */ +# ifdef USE_WIDE_CHAR + wchar_t thousands = L'\0'; +# else + const char *thousands = NULL; + size_t thousands_len = 0; +# endif + /* The numeric grouping specification of the current locale, + in the format described in <locale.h>. */ + const char *grouping; + + if (__glibc_unlikely (group)) + { + grouping = _NL_CURRENT (LC_NUMERIC, GROUPING); + if (*grouping <= 0 || *grouping == CHAR_MAX) + grouping = NULL; + else + { + /* Figure out the thousands separator character. */ +# ifdef USE_WIDE_CHAR +# ifdef _LIBC + thousands = _NL_CURRENT_WORD (LC_NUMERIC, + _NL_NUMERIC_THOUSANDS_SEP_WC); +# endif + if (thousands == L'\0') + grouping = NULL; +# else +# ifdef _LIBC + thousands = _NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP); +# endif + if (*thousands == '\0') + { + thousands = NULL; + grouping = NULL; + } +# endif + } + } + else + grouping = NULL; +#endif + + if (base < 0 || base == 1 || base > 36) + { + __set_errno (EINVAL); + return 0; + } + + save = s = nptr; + + /* Skip white space. */ + while (ISSPACE (*s)) + ++s; + if (__glibc_unlikely (*s == L_('\0'))) + goto noconv; + + /* Check for a sign. */ + negative = 0; + if (*s == L_('-')) + { + negative = 1; + ++s; + } + else if (*s == L_('+')) + ++s; + + /* Recognize number prefix and if BASE is zero, figure it out ourselves. */ + if (*s == L_('0')) + { + if ((base == 0 || base == 16) && TOUPPER (s[1]) == L_('X')) + { + s += 2; + base = 16; + } + else if (base == 0) + base = 8; + } + else if (base == 0) + base = 10; + + /* Save the pointer so we can check later if anything happened. */ + save = s; + +#ifdef USE_NUMBER_GROUPING + if (base != 10) + grouping = NULL; + + if (__glibc_unlikely (grouping != NULL)) + { +# ifndef USE_WIDE_CHAR + thousands_len = strlen (thousands); +# endif + + /* Find the end of the digit string and check its grouping. */ + end = s; + if ( +# ifdef USE_WIDE_CHAR + *s != thousands +# else + ({ for (cnt = 0; cnt < thousands_len; ++cnt) + if (thousands[cnt] != end[cnt]) + break; + cnt < thousands_len; }) +# endif + ) + { + for (c = *end; c != L_('\0'); c = *++end) + if (((STRING_TYPE) c < L_('0') || (STRING_TYPE) c > L_('9')) +# ifdef USE_WIDE_CHAR + && (wchar_t) c != thousands +# else + && ({ for (cnt = 0; cnt < thousands_len; ++cnt) + if (thousands[cnt] != end[cnt]) + break; + cnt < thousands_len; }) +# endif + && (!ISALPHA (c) + || (int) (TOUPPER (c) - L_('A') + 10) >= base)) + break; + +# ifdef USE_WIDE_CHAR + end = __correctly_grouped_prefixwc (s, end, thousands, grouping); +# else + end = __correctly_grouped_prefixmb (s, end, thousands, grouping); +# endif + } + } + else +#endif + end = NULL; + + /* Avoid runtime division; lookup cutoff and limit. */ + cutoff = cutoff_tab[base - 2]; + cutlim = cutlim_tab[base - 2]; + + overflow = 0; + i = 0; + c = *s; + if (sizeof (long int) != sizeof (LONG int)) + { + unsigned long int j = 0; + unsigned long int jmax = jmax_tab[base - 2]; + + for (;c != L_('\0'); c = *++s) + { + if (s == end) + break; + if (c >= L_('0') && c <= L_('9')) + c -= L_('0'); +#ifdef USE_NUMBER_GROUPING +# ifdef USE_WIDE_CHAR + else if (grouping && (wchar_t) c == thousands) + continue; +# else + else if (thousands_len) + { + for (cnt = 0; cnt < thousands_len; ++cnt) + if (thousands[cnt] != s[cnt]) + break; + if (cnt == thousands_len) + { + s += thousands_len - 1; + continue; + } + if (ISALPHA (c)) + c = TOUPPER (c) - L_('A') + 10; + else + break; + } +# endif +#endif + else if (ISALPHA (c)) + c = TOUPPER (c) - L_('A') + 10; + else + break; + if ((int) c >= base) + break; + /* Note that we never can have an overflow. */ + else if (j >= jmax) + { + /* We have an overflow. Now use the long representation. */ + i = (unsigned LONG int) j; + goto use_long; + } + else + j = j * (unsigned long int) base + c; + } + + i = (unsigned LONG int) j; + } + else + for (;c != L_('\0'); c = *++s) + { + if (s == end) + break; + if (c >= L_('0') && c <= L_('9')) + c -= L_('0'); +#ifdef USE_NUMBER_GROUPING +# ifdef USE_WIDE_CHAR + else if (grouping && (wchar_t) c == thousands) + continue; +# else + else if (thousands_len) + { + for (cnt = 0; cnt < thousands_len; ++cnt) + if (thousands[cnt] != s[cnt]) + break; + if (cnt == thousands_len) + { + s += thousands_len - 1; + continue; + } + if (ISALPHA (c)) + c = TOUPPER (c) - L_('A') + 10; + else + break; + } +# endif +#endif + else if (ISALPHA (c)) + c = TOUPPER (c) - L_('A') + 10; + else + break; + if ((int) c >= base) + break; + /* Check for overflow. */ + if (i > cutoff || (i == cutoff && c > cutlim)) + overflow = 1; + else + { + use_long: + i *= (unsigned LONG int) base; + i += c; + } + } + + /* Check if anything actually happened. */ + if (s == save) + goto noconv; + + /* Store in ENDPTR the address of one character + past the last character we converted. */ + if (endptr != NULL) + *endptr = (STRING_TYPE *) s; + +#if !UNSIGNED + /* Check for a value that is within the range of + `unsigned LONG int', but outside the range of `LONG int'. */ + if (overflow == 0 + && i > (negative + ? -((unsigned LONG int) (STRTOL_LONG_MIN + 1)) + 1 + : (unsigned LONG int) STRTOL_LONG_MAX)) + overflow = 1; +#endif + + if (__glibc_unlikely (overflow)) + { + __set_errno (ERANGE); +#if UNSIGNED + return STRTOL_ULONG_MAX; +#else + return negative ? STRTOL_LONG_MIN : STRTOL_LONG_MAX; +#endif + } + + /* Return the result of the appropriate sign. */ + return negative ? -i : i; + +noconv: + /* We must handle a special case here: the base is 0 or 16 and the + first two characters are '0' and 'x', but the rest are no + hexadecimal digits. This is no error case. We return 0 and + ENDPTR points to the `x`. */ + if (endptr != NULL) + { + if (save - nptr >= 2 && TOUPPER (save[-1]) == L_('X') + && save[-2] == L_('0')) + *endptr = (STRING_TYPE *) &save[-1]; + else + /* There was no number to convert. */ + *endptr = (STRING_TYPE *) nptr; + } + + return 0L; +} +#if defined _LIBC && !defined USE_WIDE_CHAR +libc_hidden_def (INTERNAL (__strtol_l)) +#endif + +/* External user entry point. */ + +#if _LIBC - 0 == 0 + +/* Prototype. */ +extern INT __strtol_l (const STRING_TYPE *nptr, STRING_TYPE **endptr, + int base); +#endif + + +INT +#ifdef weak_function +weak_function +#endif +__strtol_l (const STRING_TYPE *nptr, STRING_TYPE **endptr, + int base, __locale_t loc) +{ + return INTERNAL (__strtol_l) (nptr, endptr, base, 0, loc); +} +libc_hidden_def (__strtol_l) +weak_alias (__strtol_l, strtol_l) diff --git a/REORG.TODO/stdlib/strtold.c b/REORG.TODO/stdlib/strtold.c new file mode 100644 index 0000000000..e4ace02dd0 --- /dev/null +++ b/REORG.TODO/stdlib/strtold.c @@ -0,0 +1,64 @@ +/* Read decimal floating point numbers. + This file is part of the GNU C Library. + Copyright (C) 1995-2017 Free Software Foundation, Inc. + Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* The actual implementation for all floating point sizes is in strtod.c. + These macros tell it to produce the `float' version, `strtof'. */ + +#include <bits/long-double.h> + +#ifdef __LONG_DOUBLE_MATH_OPTIONAL +# include <wchar.h> +# define NEW(x) NEW1(x) +# define NEW1(x) __new_##x +long double ____new_strtold_internal (const char *, char **, int); +long double __new_strtold (const char *, char **); +long double ____new_wcstold_internal (const wchar_t *, wchar_t **, int); +long double __new_wcstold (const wchar_t *, wchar_t **); +libc_hidden_proto (____new_strtold_internal) +libc_hidden_proto (____new_wcstold_internal) +libc_hidden_proto (__new_strtold) +libc_hidden_proto (__new_wcstold) +#else +# define NEW(x) x +#endif + +#define FLOAT long double +#define FLT LDBL +#ifdef USE_WIDE_CHAR +# define STRTOF NEW (wcstold) +# define STRTOF_L __wcstold_l +#else +# define STRTOF NEW (strtold) +# define STRTOF_L __strtold_l +#endif + +#include "strtod.c" + +#ifdef __LONG_DOUBLE_MATH_OPTIONAL +# include <math_ldbl_opt.h> +# ifdef USE_WIDE_CHAR +long_double_symbol (libc, __new_wcstold, wcstold); +long_double_symbol (libc, ____new_wcstold_internal, __wcstold_internal); +libc_hidden_ver (____new_wcstold_internal, __wcstold_internal) +# else +long_double_symbol (libc, __new_strtold, strtold); +long_double_symbol (libc, ____new_strtold_internal, __strtold_internal); +libc_hidden_ver (____new_strtold_internal, __strtold_internal) +# endif +#endif diff --git a/REORG.TODO/stdlib/strtold_l.c b/REORG.TODO/stdlib/strtold_l.c new file mode 100644 index 0000000000..bef2a4d3d7 --- /dev/null +++ b/REORG.TODO/stdlib/strtold_l.c @@ -0,0 +1,65 @@ +/* Copyright (C) 1999-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <math.h> +#include <stdlib.h> +#include <xlocale.h> + +#if defined _LIBC || defined HAVE_WCHAR_H +# include <wchar.h> +#endif + +#ifdef USE_WIDE_CHAR +# define STRING_TYPE wchar_t +# define STRTOLD wcstold_l +# define __STRTOLD __wcstold_l +# define __STRTOD __wcstod_l +#else +# define STRING_TYPE char +# define STRTOLD strtold_l +# define __STRTOLD __strtold_l +# define __STRTOD __strtod_l +#endif + +#define INTERNAL(x) INTERNAL1(x) +#define INTERNAL1(x) __##x##_internal + +extern double INTERNAL (__STRTOD) (const STRING_TYPE *, STRING_TYPE **, + int, __locale_t); + +/* There is no `long double' type, use the `double' implementations. */ +long double +INTERNAL (__STRTOLD) (const STRING_TYPE *nptr, STRING_TYPE **endptr, + int group, __locale_t loc) +{ + return INTERNAL (__STRTOD) (nptr, endptr, group, loc); +} +#ifndef USE_WIDE_CHAR +libc_hidden_def (INTERNAL (__STRTOLD)) +#endif + +long double +weak_function +__STRTOLD (const STRING_TYPE *nptr, STRING_TYPE **endptr, __locale_t loc) +{ + return INTERNAL (__STRTOD) (nptr, endptr, 0, loc); +} +#if defined _LIBC +libc_hidden_def (__STRTOLD) +libc_hidden_ver (__STRTOLD, STRTOLD) +#endif +weak_alias (__STRTOLD, STRTOLD) diff --git a/REORG.TODO/stdlib/strtold_nan.c b/REORG.TODO/stdlib/strtold_nan.c new file mode 100644 index 0000000000..165a3e6c0f --- /dev/null +++ b/REORG.TODO/stdlib/strtold_nan.c @@ -0,0 +1,30 @@ +/* Convert string for NaN payload to corresponding NaN. Narrow + strings, long double. + Copyright (C) 2015-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <math.h> + +/* This function is unused if long double and double have the same + representation. */ +#ifndef __NO_LONG_DOUBLE_MATH +# include <strtod_nan_narrow.h> +# include <strtod_nan_ldouble.h> + +# define STRTOD_NAN __strtold_nan +# include <strtod_nan_main.c> +#endif diff --git a/REORG.TODO/stdlib/strtoll.c b/REORG.TODO/stdlib/strtoll.c new file mode 100644 index 0000000000..cb2207cc55 --- /dev/null +++ b/REORG.TODO/stdlib/strtoll.c @@ -0,0 +1,33 @@ +/* Function to parse a `long long int' from text. + Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define QUAD 1 + +#include <strtol.c> + +#ifdef _LIBC +# ifdef SHARED +# include <shlib-compat.h> + +# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2) +compat_symbol (libc, __strtoll_internal, __strtoq_internal, GLIBC_2_0); +# endif + +# endif +weak_alias (strtoll, strtoq) +#endif diff --git a/REORG.TODO/stdlib/strtoll_l.c b/REORG.TODO/stdlib/strtoll_l.c new file mode 100644 index 0000000000..2a712eb80e --- /dev/null +++ b/REORG.TODO/stdlib/strtoll_l.c @@ -0,0 +1,27 @@ +/* Convert string representing a number to integer value, using given locale. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define QUAD 1 + +#include <xlocale.h> + +extern long long int ____strtoll_l_internal (const char *, char **, int, int, + __locale_t); + +#include <strtol_l.c> diff --git a/REORG.TODO/stdlib/strtoul.c b/REORG.TODO/stdlib/strtoul.c new file mode 100644 index 0000000000..f72a8d50b1 --- /dev/null +++ b/REORG.TODO/stdlib/strtoul.c @@ -0,0 +1,20 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define UNSIGNED 1 + +#include "strtol.c" diff --git a/REORG.TODO/stdlib/strtoul_l.c b/REORG.TODO/stdlib/strtoul_l.c new file mode 100644 index 0000000000..6d23ee2964 --- /dev/null +++ b/REORG.TODO/stdlib/strtoul_l.c @@ -0,0 +1,27 @@ +/* Convert string representing a number to integer value, using given locale. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define UNSIGNED 1 + +#include <xlocale.h> + +extern unsigned long int ____strtoul_l_internal (const char *, char **, int, + int, __locale_t); + +#include "strtol_l.c" diff --git a/REORG.TODO/stdlib/strtoull.c b/REORG.TODO/stdlib/strtoull.c new file mode 100644 index 0000000000..e3dbd849e0 --- /dev/null +++ b/REORG.TODO/stdlib/strtoull.c @@ -0,0 +1,33 @@ +/* Function to parse an `unsigned long long int' from text. + Copyright (C) 1995-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define QUAD 1 + +#include <strtoul.c> + +#ifdef _LIBC +# ifdef SHARED +# include <shlib-compat.h> + +# if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2) +compat_symbol (libc, __strtoull_internal, __strtouq_internal, GLIBC_2_0); +# endif + +# endif +weak_alias (strtoull, strtouq) +#endif diff --git a/REORG.TODO/stdlib/strtoull_l.c b/REORG.TODO/stdlib/strtoull_l.c new file mode 100644 index 0000000000..53ecb916df --- /dev/null +++ b/REORG.TODO/stdlib/strtoull_l.c @@ -0,0 +1,28 @@ +/* Convert string representing a number to integer value, using given locale. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define QUAD 1 +#define UNSIGNED 1 + +#include <xlocale.h> + +extern unsigned long long int ____strtoull_l_internal (const char *, char **, + int, int, __locale_t); + +#include <strtol_l.c> diff --git a/REORG.TODO/stdlib/strtoumax.c b/REORG.TODO/stdlib/strtoumax.c new file mode 100644 index 0000000000..508cb19f8c --- /dev/null +++ b/REORG.TODO/stdlib/strtoumax.c @@ -0,0 +1 @@ +#error "The correct implementation must be chosen based on the `uintmax_t' type" diff --git a/REORG.TODO/stdlib/sub_n.c b/REORG.TODO/stdlib/sub_n.c new file mode 100644 index 0000000000..7f429def89 --- /dev/null +++ b/REORG.TODO/stdlib/sub_n.c @@ -0,0 +1,53 @@ +/* mpn_sub_n -- Subtract two limb vectors of equal, non-zero length. + +Copyright (C) 1992-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library; see the file COPYING.LIB. If not, see +<http://www.gnu.org/licenses/>. */ + +#include <gmp.h> +#include "gmp-impl.h" + +mp_limb_t +mpn_sub_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size) +{ + register mp_limb_t x, y, cy; + register mp_size_t j; + + /* The loop counter and index J goes from -SIZE to -1. This way + the loop becomes faster. */ + j = -size; + + /* Offset the base pointers to compensate for the negative indices. */ + s1_ptr -= j; + s2_ptr -= j; + res_ptr -= j; + + cy = 0; + do + { + y = s2_ptr[j]; + x = s1_ptr[j]; + y += cy; /* add previous carry to subtrahend */ + cy = (y < cy); /* get out carry from that addition */ + y = x - y; /* main subtract */ + cy = (y > x) + cy; /* get out carry from the subtract, combine */ + res_ptr[j] = y; + } + while (++j != 0); + + return cy; +} diff --git a/REORG.TODO/stdlib/submul_1.c b/REORG.TODO/stdlib/submul_1.c new file mode 100644 index 0000000000..9bc27df442 --- /dev/null +++ b/REORG.TODO/stdlib/submul_1.c @@ -0,0 +1,61 @@ +/* mpn_submul_1 -- multiply the S1_SIZE long limb vector pointed to by S1_PTR + by S2_LIMB, subtract the S1_SIZE least significant limbs of the product + from the limb vector pointed to by RES_PTR. Return the most significant + limb of the product, adjusted for carry-out from the subtraction. + +Copyright (C) 1992-2017 Free Software Foundation, Inc. + +This file is part of the GNU MP Library. + +The GNU MP Library is free software; you can redistribute it and/or modify +it under the terms of the GNU Lesser General Public License as published by +the Free Software Foundation; either version 2.1 of the License, or (at your +option) any later version. + +The GNU MP Library is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY +or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public +License for more details. + +You should have received a copy of the GNU Lesser General Public License +along with the GNU MP Library; see the file COPYING.LIB. If not, see +<http://www.gnu.org/licenses/>. */ + +#include <gmp.h> +#include "gmp-impl.h" +#include "longlong.h" + +mp_limb_t +mpn_submul_1 (register mp_ptr res_ptr, register mp_srcptr s1_ptr, + mp_size_t s1_size, register mp_limb_t s2_limb) +{ + register mp_limb_t cy_limb; + register mp_size_t j; + register mp_limb_t prod_high, prod_low; + register mp_limb_t x; + + /* The loop counter and index J goes from -SIZE to -1. This way + the loop becomes faster. */ + j = -s1_size; + + /* Offset the base pointers to compensate for the negative indices. */ + res_ptr -= j; + s1_ptr -= j; + + cy_limb = 0; + do + { + umul_ppmm (prod_high, prod_low, s1_ptr[j], s2_limb); + + prod_low += cy_limb; + cy_limb = (prod_low < cy_limb) + prod_high; + + x = res_ptr[j]; + prod_low = x - prod_low; + cy_limb += (prod_low > x); + res_ptr[j] = prod_low; + } + while (++j != 0); + + return cy_limb; +} diff --git a/REORG.TODO/stdlib/swapcontext.c b/REORG.TODO/stdlib/swapcontext.c new file mode 100644 index 0000000000..decf2b9a9e --- /dev/null +++ b/REORG.TODO/stdlib/swapcontext.c @@ -0,0 +1,29 @@ +/* Copyright (C) 1998-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <ucontext.h> + +int +swapcontext (ucontext_t *oucp, const ucontext_t *ucp) +{ + __set_errno (ENOSYS); + return -1; +} + + +stub_warning (swapcontext) diff --git a/REORG.TODO/stdlib/sys/errno.h b/REORG.TODO/stdlib/sys/errno.h new file mode 100644 index 0000000000..339f4fc10c --- /dev/null +++ b/REORG.TODO/stdlib/sys/errno.h @@ -0,0 +1 @@ +#include <errno.h> diff --git a/REORG.TODO/stdlib/sys/random.h b/REORG.TODO/stdlib/sys/random.h new file mode 100644 index 0000000000..90a0aca15c --- /dev/null +++ b/REORG.TODO/stdlib/sys/random.h @@ -0,0 +1,42 @@ +/* Interfaces for obtaining random bytes. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _SYS_RANDOM_H +#define _SYS_RANDOM_H 1 + +#include <features.h> +#include <sys/types.h> + +/* Flags for use with getrandom. */ +#define GRND_NONBLOCK 0x01 +#define GRND_RANDOM 0x02 + +__BEGIN_DECLS + +/* Write LENGTH bytes of randomness starting at BUFFER. Return the + number of bytes written, or -1 on error. */ +ssize_t getrandom (void *__buffer, size_t __length, + unsigned int __flags) __wur; + +/* Write LENGTH bytes of randomness starting at BUFFER. Return 0 on + success or -1 on error. */ +int getentropy (void *__buffer, size_t __length) __wur; + +__END_DECLS + +#endif /* _SYS_RANDOM_H */ diff --git a/REORG.TODO/stdlib/system.c b/REORG.TODO/stdlib/system.c new file mode 100644 index 0000000000..026ab77768 --- /dev/null +++ b/REORG.TODO/stdlib/system.c @@ -0,0 +1,35 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <stdlib.h> + + +/* Execute LINE as a shell command. */ +int +__libc_system (const char *line) +{ + if (line == NULL) + return 0; /* This indicates no command processor. */ + + __set_errno (ENOSYS); + return -1; +} +weak_alias (__libc_system, system) + + +stub_warning (system) diff --git a/REORG.TODO/stdlib/tens_in_limb.c b/REORG.TODO/stdlib/tens_in_limb.c new file mode 100644 index 0000000000..b6e35aa35a --- /dev/null +++ b/REORG.TODO/stdlib/tens_in_limb.c @@ -0,0 +1,31 @@ +#include <gmp.h> + + +/* Definitions according to limb size used. */ +#if BITS_PER_MP_LIMB == 32 +# define MAX_DIG_PER_LIMB 9 +# define MAX_FAC_PER_LIMB 1000000000UL +#elif BITS_PER_MP_LIMB == 64 +# define MAX_DIG_PER_LIMB 19 +# define MAX_FAC_PER_LIMB 10000000000000000000ULL +#else +# error "mp_limb_t size " BITS_PER_MP_LIMB "not accounted for" +#endif + + +/* Local data structure. */ +const mp_limb_t _tens_in_limb[MAX_DIG_PER_LIMB + 1] = +{ 0, 10, 100, + 1000, 10000, 100000L, + 1000000L, 10000000L, 100000000L, + 1000000000L +#if BITS_PER_MP_LIMB > 32 + , 10000000000ULL, 100000000000ULL, + 1000000000000ULL, 10000000000000ULL, 100000000000000ULL, + 1000000000000000ULL, 10000000000000000ULL, 100000000000000000ULL, + 1000000000000000000ULL, 10000000000000000000ULL +#endif +#if BITS_PER_MP_LIMB > 64 + #error "Need to expand tens_in_limb table to" MAX_DIG_PER_LIMB +#endif +}; diff --git a/REORG.TODO/stdlib/test-a64l.c b/REORG.TODO/stdlib/test-a64l.c new file mode 100644 index 0000000000..b3e1b2e846 --- /dev/null +++ b/REORG.TODO/stdlib/test-a64l.c @@ -0,0 +1,80 @@ +/* Test program for the l64a and a64l functions. + Copyright (C) 2001-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Schwab <schwab@suse.de>. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +/* Prototype for our test function. */ +extern int do_test (int argc, char *argv[]); +#include <test-skeleton.c> + +struct a64l_test +{ + const char *base64; + long int value; +}; + +static const struct a64l_test tests[] = + { + { "./", 64 }, + { "", 0 }, + { "/", 1 }, + { "FT", 2001 }, + { "zzzzz1", 0xffffffff }, + { "zzzz1", 0x3ffffff }, + { "zzz1", 0xfffff }, + { "zz1", 0x3fff }, + { "z1", 0xff }, + { "1", 0x3 }, + { NULL, 0 } + }; + +int +do_test (int argc, char ** argv) +{ + const struct a64l_test *at; + long int l; + const char *s; + int status = 0; + + for (at = tests; at->base64 != NULL; ++at) + { + printf ("a64l (\"%s\")", at->base64); + l = a64l (at->base64); + if (l == at->value) + puts ("\tOK"); + else + { + printf ("\tBAD\n returns %ld, expected %ld\n", l, at->value); + status = 1; + } + printf ("l64a (%ld)", at->value); + s = l64a (at->value); + if (strcmp (s, at->base64) == 0) + puts ("\tOK"); + else + { + printf ("\tBAD\n returns \"%s\", expected \"%s\"\n", s, at->base64); + status = 1; + } + } + + return status ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/REORG.TODO/stdlib/test-canon.c b/REORG.TODO/stdlib/test-canon.c new file mode 100644 index 0000000000..d664f73c45 --- /dev/null +++ b/REORG.TODO/stdlib/test-canon.c @@ -0,0 +1,235 @@ +/* Test program for returning the canonical absolute name of a given file. + Copyright (C) 1996-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by David Mosberger <davidm@azstarnet.com>. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* This file must be run from within a directory called "stdlib". */ + +#include <errno.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/param.h> +#include <sys/stat.h> + +/* Prototype for our test function. */ +extern int do_test (int argc, char *argv[]); +#include <test-skeleton.c> + +#ifndef PATH_MAX +# define PATH_MAX 4096 +#endif +static char cwd[PATH_MAX]; +static size_t cwd_len; + +struct { + const char * name; + const char * value; +} symlinks[] = { + {"SYMLINK_LOOP", "SYMLINK_LOOP"}, + {"SYMLINK_1", "."}, + {"SYMLINK_2", "//////./../../etc"}, + {"SYMLINK_3", "SYMLINK_1"}, + {"SYMLINK_4", "SYMLINK_2"}, + {"SYMLINK_5", "doesNotExist"}, +}; + +struct { + const char * in, * out, * resolved; + int error; +} tests[] = { + /* 0 */ + {"/", "/"}, + {"/////////////////////////////////", "/"}, + {"/.././.././.././..///", "/"}, + {"/etc", "/etc"}, + {"/etc/../etc", "/etc"}, + /* 5 */ + {"/doesNotExist/../etc", 0, "/doesNotExist", ENOENT}, + {"./././././././././.", "."}, + {"/etc/.//doesNotExist", 0, "/etc/doesNotExist", ENOENT}, + {"./doesExist", "./doesExist"}, + {"./doesExist/", "./doesExist"}, + /* 10 */ + {"./doesExist/../doesExist", "./doesExist"}, + {"foobar", 0, "./foobar", ENOENT}, + {".", "."}, + {"./foobar", 0, "./foobar", ENOENT}, + {"SYMLINK_LOOP", 0, "./SYMLINK_LOOP", ELOOP}, + /* 15 */ + {"./SYMLINK_LOOP", 0, "./SYMLINK_LOOP", ELOOP}, + {"SYMLINK_1", "."}, + {"SYMLINK_1/foobar", 0, "./foobar", ENOENT}, + {"SYMLINK_2", "/etc"}, + {"SYMLINK_3", "."}, + /* 20 */ + {"SYMLINK_4", "/etc"}, + {"../stdlib/SYMLINK_1", "."}, + {"../stdlib/SYMLINK_2", "/etc"}, + {"../stdlib/SYMLINK_3", "."}, + {"../stdlib/SYMLINK_4", "/etc"}, + /* 25 */ + {"./SYMLINK_5", 0, "./doesNotExist", ENOENT}, + {"SYMLINK_5", 0, "./doesNotExist", ENOENT}, + {"SYMLINK_5/foobar", 0, "./doesNotExist", ENOENT}, + {"doesExist/../../stdlib/doesExist", "./doesExist"}, + {"doesExist/.././../stdlib/.", "."}, + /* 30 */ + {"./doesExist/someFile/", 0, "./doesExist/someFile", ENOTDIR}, + {"./doesExist/someFile/..", 0, "./doesExist/someFile", ENOTDIR}, +}; + + +static int +check_path (const char * result, const char * expected) +{ + int good; + + if (!result) + return (expected == NULL); + + if (!expected) + return 0; + + if (expected[0] == '.' && (expected[1] == '/' || expected[1] == '\0')) + good = (strncmp (result, cwd, cwd_len) == 0 + && strcmp (result + cwd_len, expected + 1) == 0); + else + good = (strcmp (expected, result) == 0); + + return good; +} + + +int +do_test (int argc, char ** argv) +{ + char * result; + int i, errors = 0; + char buf[PATH_MAX]; + + getcwd (cwd, sizeof(buf)); + cwd_len = strlen (cwd); + + errno = 0; + if (realpath (NULL, buf) != NULL || errno != EINVAL) + { + printf ("%s: expected return value NULL and errno set to EINVAL" + " for realpath(NULL,...)\n", argv[0]); + ++errors; + } + +#if 0 + /* This is now allowed. The test is invalid. */ + errno = 0; + if (realpath ("/", NULL) != NULL || errno != EINVAL) + { + printf ("%s: expected return value NULL and errno set to EINVAL" + " for realpath(...,NULL)\n", argv[0]); + ++errors; + } +#endif + + errno = 0; + if (realpath ("", buf) != NULL || errno != ENOENT) + { + printf ("%s: expected return value NULL and set errno to ENOENT" + " for realpath(\"\",...)\n", argv[0]); + ++errors; + } + + for (i = 0; i < (int) (sizeof (symlinks) / sizeof (symlinks[0])); ++i) + symlink (symlinks[i].value, symlinks[i].name); + + int has_dir = mkdir ("doesExist", 0777) == 0; + + int fd = has_dir ? creat ("doesExist/someFile", 0777) : -1; + + for (i = 0; i < (int) (sizeof (tests) / sizeof (tests[0])); ++i) + { + buf[0] = '\0'; + result = realpath (tests[i].in, buf); + + if (!check_path (result, tests[i].out)) + { + printf ("%s: flunked test %d (expected `%s', got `%s')\n", + argv[0], i, tests[i].out ? tests[i].out : "NULL", + result ? result : "NULL"); + ++errors; + continue; + } + + if (!check_path (buf, tests[i].out ? tests[i].out : tests[i].resolved)) + { + printf ("%s: flunked test %d (expected resolved `%s', got `%s')\n", + argv[0], i, tests[i].out ? tests[i].out : tests[i].resolved, + buf); + ++errors; + continue; + } + + if (!tests[i].out && errno != tests[i].error) + { + printf ("%s: flunked test %d (expected errno %d, got %d)\n", + argv[0], i, tests[i].error, errno); + ++errors; + continue; + } + + char *result2 = realpath (tests[i].in, NULL); + if ((result2 == NULL && result != NULL) + || (result2 != NULL && strcmp (result, result2) != 0)) + { + printf ("\ +%s: realpath(..., NULL) produced different result than realpath(..., buf): '%s' vs '%s'\n", + argv[0], result2, result); + ++errors; + } + free (result2); + } + + getcwd (buf, sizeof(buf)); + if (strcmp (buf, cwd)) + { + printf ("%s: current working directory changed from %s to %s\n", + argv[0], cwd, buf); + ++errors; + } + + if (fd >= 0) + { + close (fd); + unlink ("doesExist/someFile"); + } + + if (has_dir) + rmdir ("doesExist"); + + for (i = 0; i < (int) (sizeof (symlinks) / sizeof (symlinks[0])); ++i) + unlink (symlinks[i].name); + + if (errors != 0) + { + printf ("%d errors.\n", errors); + return EXIT_FAILURE; + } + + puts ("No errors."); + return EXIT_SUCCESS; +} diff --git a/REORG.TODO/stdlib/test-canon2.c b/REORG.TODO/stdlib/test-canon2.c new file mode 100644 index 0000000000..bb676cd865 --- /dev/null +++ b/REORG.TODO/stdlib/test-canon2.c @@ -0,0 +1,74 @@ +/* Test for realpath/canonicalize function. + Copyright (C) 1998-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <string.h> + + +/* Prototype for our test function. */ +extern void do_prepare (int argc, char *argv[]); +extern int do_test (int argc, char *argv[]); + +/* We have a preparation function. */ +#define PREPARE do_prepare + +#include <test-skeleton.c> + +/* Name of the temporary files we create. */ +char *name1; +char *name2; + +/* Preparation. */ +void +do_prepare (int argc, char *argv[]) +{ + size_t test_dir_len; + + test_dir_len = strlen (test_dir); + + /* Generate the circular symlinks. */ + name1 = malloc (test_dir_len + sizeof ("/canonXXXXXX")); + mempcpy (mempcpy (name1, test_dir, test_dir_len), + "/canonXXXXXX", sizeof ("/canonXXXXXX")); + name2 = strdup (name1); + + add_temp_file (mktemp (name1)); + add_temp_file (mktemp (name2)); +} + + +/* Run the test. */ +int +do_test (int argc, char *argv[]) +{ + char *canon; + + printf ("create symlinks from %s to %s and vice versa\n", name1, name2); + if (symlink (name1, name2) == -1 + || symlink (name2, name1) == -1) + /* We cannot test this. */ + return 0; + + /* Call the function. This is equivalent the using `realpath' but the + function allocates the room for the result. */ + errno = 0; + canon = canonicalize_file_name (name1); + + return canon != NULL || errno != ELOOP; +} diff --git a/REORG.TODO/stdlib/testdiv.c b/REORG.TODO/stdlib/testdiv.c new file mode 100644 index 0000000000..4ba3843c69 --- /dev/null +++ b/REORG.TODO/stdlib/testdiv.c @@ -0,0 +1,39 @@ +/* Copyright (C) 1992-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <stdio.h> + +int +main (void) +{ + int err = 0; + int i, j; + while (scanf ("%d %d\n", &i, &j) == 2) + { + div_t d = div (i, j); + printf ("%d / %d = %d + %d/%d", i, j, d.quot, d.rem, j); + if (i == d.quot * j + d.rem) + fputs (" OK\n", stdout); + else + { + fputs (" FAILED\n", stdout); + err = 1; + } + } + return err; +} diff --git a/REORG.TODO/stdlib/testdiv.input b/REORG.TODO/stdlib/testdiv.input new file mode 100644 index 0000000000..415b7b4f54 --- /dev/null +++ b/REORG.TODO/stdlib/testdiv.input @@ -0,0 +1,2 @@ +10 3 +-10 3 diff --git a/REORG.TODO/stdlib/testmb.c b/REORG.TODO/stdlib/testmb.c new file mode 100644 index 0000000000..45dae7db61 --- /dev/null +++ b/REORG.TODO/stdlib/testmb.c @@ -0,0 +1,65 @@ +#include <stdio.h> +#include <stdlib.h> + +int +main (int argc, char *argv[]) +{ + wchar_t w[10]; + char c[10]; + int i; + int lose = 0; + + i = mbstowcs (w, "bar", 4); + if (!(i == 3 && w[1] == 'a')) + { + puts ("mbstowcs FAILED!"); + lose = 1; + } + + mbstowcs (w, "blah", 5); + i = wcstombs (c, w, 10); + if (i != 4) + { + puts ("wcstombs FAILED!"); + lose = 1; + } + + if (mblen ("foobar", 7) != 1) + { + puts ("mblen 1 FAILED!"); + lose = 1; + } + + if (mblen ("", 1) != 0) + { + puts ("mblen 2 FAILED!"); + lose = 1; + } + + { + int r; + char c = 'x'; + wchar_t wc; + char mbc[MB_CUR_MAX]; + + if ((r = mbtowc (&wc, &c, MB_CUR_MAX)) <= 0) + { + printf ("conversion to wide failed, result: %d\n", r); + lose = 1; + } + else + { + printf ("wide value: 0x%04lx\n", (unsigned long) wc); + mbc[0] = '\0'; + if ((r = wctomb (mbc, wc)) <= 0) + { + printf ("conversion to multibyte failed, result: %d\n", r); + lose = 1; + } + } + + } + + puts (lose ? "Test FAILED!" : "Test succeeded."); + return lose; +} diff --git a/REORG.TODO/stdlib/testmb2.c b/REORG.TODO/stdlib/testmb2.c new file mode 100644 index 0000000000..3a3e354629 --- /dev/null +++ b/REORG.TODO/stdlib/testmb2.c @@ -0,0 +1,31 @@ +/* Test case by Miloslav Trmac <mitr@volny.cz>. */ +#include <locale.h> +#include <stdint.h> +#include <stdlib.h> +#include <stdio.h> + +int +main (void) +{ + wchar_t wc; + + if (setlocale (LC_CTYPE, "de_DE.UTF-8") == NULL) + { + puts ("setlocale failed"); + return 1; + } + + if (mbtowc (&wc, "\xc3\xa1", MB_CUR_MAX) != 2 || wc != 0xE1) + { + puts ("1st mbtowc failed"); + return 1; + } + + if (mbtowc (&wc, "\xc3\xa1", SIZE_MAX) != 2 || wc != 0xE1) + { + puts ("2nd mbtowc failed"); + return 1; + } + + return 0; +} diff --git a/REORG.TODO/stdlib/testrand.c b/REORG.TODO/stdlib/testrand.c new file mode 100644 index 0000000000..fdfc4e5694 --- /dev/null +++ b/REORG.TODO/stdlib/testrand.c @@ -0,0 +1,52 @@ +/* Copyright (C) 1992-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <stdio.h> + +int +main (void) +{ + int i1, i2; + int j1, j2; + + /* The C standard says that "If rand is called before any calls to + srand have been made, the same sequence shall be generated as + when srand is first called with a seed value of 1." */ + i1 = rand(); + i2 = rand(); + srand (1); + j1 = rand(); + j2 = rand(); + if (i1 < 0 || i2 < 0 || j1 < 0 || j2 < 0) { + puts ("Test FAILED!"); + } + if (j1 == i1 && j2 == i2) + { + puts ("Test succeeded."); + return 0; + } + else + { + if (j1 != i1) + printf ("%d != %d\n", j1, i1); + if (j2 != i2) + printf ("%d != %d\n", j2, i2); + puts ("Test FAILED!"); + return 1; + } +} diff --git a/REORG.TODO/stdlib/testsort.c b/REORG.TODO/stdlib/testsort.c new file mode 100644 index 0000000000..aa4332a568 --- /dev/null +++ b/REORG.TODO/stdlib/testsort.c @@ -0,0 +1,36 @@ +#include <stdlib.h> +#include <string.h> +#include <stdio.h> + +static int +compare (const void *a, const void *b) +{ + return strcmp (*(char **) a, *(char **) b); +} + +int +main (void) +{ + char bufs[500][20]; + char *lines[500]; + size_t lens[500]; + size_t i, j; + + srandom (1); + + for (i = 0; i < 500; ++i) + { + lens[i] = random() % 19; + lines[i] = bufs[i]; + for (j = 0; j < lens[i]; ++j) + lines[i][j] = random() % 26 + 'a'; + lines[i][j] = '\0'; + } + + qsort (lines, 500, sizeof (char *), compare); + + for (i = 0; i < 500 && lines[i] != NULL; ++i) + puts (lines[i]); + + return 0; +} diff --git a/REORG.TODO/stdlib/tst-atof1.c b/REORG.TODO/stdlib/tst-atof1.c new file mode 100644 index 0000000000..879d866558 --- /dev/null +++ b/REORG.TODO/stdlib/tst-atof1.c @@ -0,0 +1,19 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +static int +do_test (void) +{ + char buf[100]; + snprintf (buf, sizeof (buf), "%g", atof ("0x10p-1")); + if (strcmp (buf, "8") != 0) + { + printf ("got \"%s\", expected \"8\"\n", buf); + return 1; + } + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-atof2.c b/REORG.TODO/stdlib/tst-atof2.c new file mode 100644 index 0000000000..74dac87b0d --- /dev/null +++ b/REORG.TODO/stdlib/tst-atof2.c @@ -0,0 +1,55 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + + +static const struct +{ + const char *str; + const char *expected; +} tests[] = + { + { "1e308", "1e+308" }, + { "100000000e300", "1e+308" }, + { "0x1p1023", "8.98847e+307" }, + { "0x1000p1011", "8.98847e+307" }, + { "0x1p1020", "1.12356e+307" }, + { "0x0.00001p1040", "1.12356e+307" }, + { "1e-307", "1e-307" }, + { "0.000001e-301", "1e-307" }, + { "0.0000001e-300", "1e-307" }, + { "0.00000001e-299", "1e-307" }, + { "1000000e-313", "1e-307" }, + { "10000000e-314", "1e-307" }, + { "100000000e-315", "1e-307" }, + { "0x1p-1021", "4.45015e-308" }, + { "0x1000p-1033", "4.45015e-308" }, + { "0x10000p-1037", "4.45015e-308" }, + { "0x0.001p-1009", "4.45015e-308" }, + { "0x0.0001p-1005", "4.45015e-308" }, + }; +#define NTESTS (sizeof (tests) / sizeof (tests[0])) + + +static int +do_test (void) +{ + int status = 0; + + for (int i = 0; i < NTESTS; ++i) + { + char buf[100]; + snprintf (buf, sizeof (buf), "%g", atof (tests[i].str)); + if (strcmp (buf, tests[i].expected) != 0) + { + printf ("%d: got \"%s\", expected \"%s\"\n", + i, buf, tests[i].expected); + status = 1; + } + } + + return status; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-bsearch.c b/REORG.TODO/stdlib/tst-bsearch.c new file mode 100644 index 0000000000..766b11bc61 --- /dev/null +++ b/REORG.TODO/stdlib/tst-bsearch.c @@ -0,0 +1,153 @@ +/* Copyright (C) 2000-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@redhat.com>, 2000. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdio.h> +#include <stdlib.h> +#include <tst-stack-align.h> + +struct item +{ + int val; + const char *str; +} arr[] = +{ + { 0, "zero" }, + { 1, "one" }, + { 2, "two" }, + { 3, "three" }, + { 4, "four" }, + { 5, "five" }, + { 6, "six" }, + { 7, "seven" }, + { 8, "eight" }, + { 9, "nine" }, + { 10, "ten" } +}; +#define narr (sizeof (arr) / sizeof (arr[0])) + +static int align_check; + +static int +comp (const void *p1, const void *p2) +{ + struct item *e1 = (struct item *) p1; + struct item *e2 = (struct item *) p2; + + if (!align_check) + align_check = TEST_STACK_ALIGN () ? -1 : 1; + + return e1->val - e2->val; +} + + +static int +do_test (void) +{ + size_t cnt; + int result = 0; + struct item key; + struct item *res; + + for (cnt = 0; cnt < narr; ++cnt) + { + + key.val = arr[cnt].val; + + res = (struct item *) bsearch (&key, arr, narr, sizeof (arr[0]), comp); + if (res == NULL) + { + printf ("entry %zd not found\n", cnt); + result = 1; + } + else if (res != &arr[cnt]) + { + puts ("wrong entry returned"); + result = 1; + } + } + + /* And some special tests that shouldn't find any entry. */ + key.val = -1; + res = (struct item *) bsearch (&key, arr, narr, sizeof (arr[0]), comp); + if (res != NULL) + { + puts ("found an entry that's not there"); + result = 1; + } + + key.val = 11; + res = (struct item *) bsearch (&key, arr, narr, sizeof (arr[0]), comp); + if (res != NULL) + { + puts ("found an entry that's not there"); + result = 1; + } + + key.val = 11; + res = (struct item *) bsearch (&key, arr, 0, sizeof (arr[0]), comp); + if (res != NULL) + { + puts ("found an entry that's not there"); + result = 1; + } + + /* Now the array contains only one element - no entry should be found. */ + for (cnt = 0; cnt < narr; ++cnt) + { + key.val = arr[cnt].val; + + res = (struct item *) bsearch (&key, &arr[5], 1, sizeof (arr[0]), comp); + if (cnt == 5) + { + if (res == NULL) + { + printf ("entry %zd not found\n", cnt); + result = 1; + } + else if (res != &arr[cnt]) + { + puts ("wrong entry returned"); + result = 1; + } + } + else if (res != NULL) + { + puts ("found an entry that's not there"); + result = 1; + } + } + + if (align_check == 0) + { + puts ("alignment not checked"); + result = 1; + } + else if (align_check == -1) + { + puts ("stack not sufficiently aligned"); + result = 1; + } + + if (result == 0) + puts ("all OK"); + + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-empty-env.c b/REORG.TODO/stdlib/tst-empty-env.c new file mode 100644 index 0000000000..0b0651d530 --- /dev/null +++ b/REORG.TODO/stdlib/tst-empty-env.c @@ -0,0 +1,58 @@ +/* Test that passing a NULL value does not hang environment traversal in + tunables. + Copyright (C) 2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* The test is useful only when the source is configured with + --enable-hardcoded-path-in-tests since otherwise the execve just picks up + the system dynamic linker. */ + +#include <stdlib.h> +#include <stdio.h> +#include <unistd.h> +#include <errno.h> + +static int +do_test (int argc, char **argv) +{ + if (argc == 2) + return 0; + + char envname[] = "FOOBAR"; + char *filename = program_invocation_name; + char *newargv[] = {filename, filename, NULL}; + char *newenviron[] = {envname, NULL}; + + /* This was reported in Fedora: + + https://bugzilla.redhat.com/show_bug.cgi?id=1414589 + + If one of the environment variables has no value, then the environment + traversal must skip and also advance to the next environment entry. The + bug in question would cause this test to hang in an infinite loop. */ + int ret = execve (filename, newargv, newenviron); + + if (ret != 0) + printf ("execve failed: %m"); + + /* We will reach here only if we fail execve. */ + return 1; +} + +#define TIMEOUT 3 +#define TEST_FUNCTION_ARGV do_test +#include <support/test-driver.c> diff --git a/REORG.TODO/stdlib/tst-environ.c b/REORG.TODO/stdlib/tst-environ.c new file mode 100644 index 0000000000..b2301641f5 --- /dev/null +++ b/REORG.TODO/stdlib/tst-environ.c @@ -0,0 +1,229 @@ +/* Copyright (C) 1999-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <libc-diag.h> + +#define VAR "FOOBAR" + +char putenv_val[100] = VAR "=some longer value"; + +static int +do_test (void) +{ + int result = 0; + const char *valp; + + /* First test: remove entry FOOBAR, whether it exists or not. */ + unsetenv (VAR); + + /* Now getting the value should fail. */ + if (getenv (VAR) != NULL) + { + printf ("There should be no `%s' value\n", VAR); + result = 1; + } + + /* Now add a value, with the replace flag cleared. */ + if (setenv (VAR, "one", 0) != 0) + { + printf ("setenv #1 failed: %m\n"); + result = 1; + } + + /* Getting this value should now be possible. */ + valp = getenv (VAR); + if (valp == NULL || strcmp (valp, "one") != 0) + { + puts ("getenv #2 failed"); + result = 1; + } + + /* Try to replace without the replace flag set. This should fail. */ + if (setenv (VAR, "two", 0) != 0) + { + printf ("setenv #2 failed: %m\n"); + result = 1; + } + + /* The value shouldn't have changed. */ + valp = getenv (VAR); + if (valp == NULL || strcmp (valp, "one") != 0) + { + puts ("getenv #3 failed"); + result = 1; + } + + /* Now replace the value using putenv. */ + if (putenv (putenv_val) != 0) + { + printf ("putenv #1 failed: %m\n"); + result = 1; + } + + /* The value should have changed now. */ + valp = getenv (VAR); + if (valp == NULL || strcmp (valp, "some longer value") != 0) + { + printf ("getenv #4 failed (is \"%s\")\n", valp); + result = 1; + } + + /* Now one tricky check: changing the variable passed in putenv should + change the environment. */ + strcpy (&putenv_val[sizeof VAR], "a short one"); + + /* The value should have changed again. */ + valp = getenv (VAR); + if (valp == NULL || strcmp (valp, "a short one") != 0) + { + puts ("getenv #5 failed"); + result = 1; + } + + /* It should even be possible to rename the variable. */ + strcpy (putenv_val, "XYZZY=some other value"); + + /* Now a lookup using the old name should fail. */ + if (getenv (VAR) != NULL) + { + puts ("getenv #6 failed"); + result = 1; + } + + /* But using the new name it should work. */ + valp = getenv ("XYZZY"); + if (valp == NULL || strcmp (valp, "some other value") != 0) + { + puts ("getenv #7 failed"); + result = 1; + } + + /* Create a new variable with the old name. */ + if (setenv (VAR, "a new value", 0) != 0) + { + printf ("setenv #3 failed: %m\n"); + result = 1; + } + + /* At this point a getenv call must return the new value. */ + valp = getenv (VAR); + if (valp == NULL || strcmp (valp, "a new value") != 0) + { + puts ("getenv #8 failed"); + result = 1; + } + + /* Black magic: rename the variable we added using putenv back. */ + strcpy (putenv_val, VAR "=old name new value"); + + /* This is interesting. We have two variables with the same name. + Getting a value should return one of them. */ + valp = getenv (VAR); + if (valp == NULL + || (strcmp (valp, "a new value") != 0 + && strcmp (valp, "old name new value") != 0)) + { + puts ("getenv #9 failed"); + result = 1; + } + + /* More fun ahead: we are now removing the variable. This should remove + both values. The cast is ok: this call should never put the string + in the environment and it should never modify it. */ + putenv ((char *) VAR); + + /* Getting the value should now fail. */ + if (getenv (VAR) != NULL) + { + printf ("getenv #10 failed (\"%s\" found)\n", getenv (VAR)); + result = 1; + } + + /* Now a test with an environment variable that's one character long. + This is to test a special case in the getenv implementation. */ + strcpy (putenv_val, "X=one character test"); + if (putenv (putenv_val) != 0) + { + printf ("putenv #2 failed: %m\n"); + result = 1; + } + + valp = getenv ("X"); + if (valp == NULL || strcmp (valp, "one character test") != 0) + { + puts ("getenv #11 failed"); + result = 1; + } + + /* Both setenv and unsetenv should return -1/EINVAL for NULL or "" name + or if name contains '=' character. */ + errno = 0; + if (setenv (NULL, "val", 1) >= 0 || errno != EINVAL) + { + puts ("setenv #4 failed"); + result = 1; + } + + errno = 0; + if (setenv ("", "val", 0) >= 0 || errno != EINVAL) + { + puts ("setenv #5 failed"); + result = 1; + } + + errno = 0; + if (setenv ("var=val", "val", 1) >= 0 || errno != EINVAL) + { + puts ("setenv #6 failed"); + result = 1; + } + + /* This deliberately tests supplying a null pointer to a function whose + argument is marked __attribute__ ((nonnull)). */ + DIAG_PUSH_NEEDS_COMMENT; + DIAG_IGNORE_NEEDS_COMMENT(5, "-Wnonnull"); + errno = 0; + if (unsetenv (NULL) >= 0 || errno != EINVAL) + { + puts ("unsetenv #1 failed"); + result = 1; + } + DIAG_POP_NEEDS_COMMENT; + + errno = 0; + if (unsetenv ("") >= 0 || errno != EINVAL) + { + puts ("unsetenv #2 failed"); + result = 1; + } + + errno = 0; + if (unsetenv ("x=y") >= 0 || errno != EINVAL) + { + puts ("unsetenv #3 failed"); + result = 1; + } + + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-fmtmsg.c b/REORG.TODO/stdlib/tst-fmtmsg.c new file mode 100644 index 0000000000..b7948c5f1e --- /dev/null +++ b/REORG.TODO/stdlib/tst-fmtmsg.c @@ -0,0 +1,85 @@ +#include <fmtmsg.h> +#include <mcheck.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + + +#define MM_TEST 10 + +static int +do_test (void) +{ + int result = 0; + + mtrace (); + + char TEST[] = "ABCD"; + if (addseverity (MM_TEST, TEST) != MM_OK) + { + puts ("addseverity failed"); + result = 1; + } + strcpy (TEST, "TEST"); + + if (fmtmsg (MM_PRINT, "GLIBC:tst-fmtmsg", MM_HALT, "halt", + "should print message for MM_HALT", "GLIBC:tst-fmtmsg:1") + != MM_OK) + result = 1; + + if (fmtmsg (MM_PRINT, "GLIBC:tst-fmtmsg", MM_ERROR, "halt", + "should print message for MM_ERROR", "GLIBC:tst-fmtmsg:2") + != MM_OK) + result = 1; + + if (fmtmsg (MM_PRINT, "GLIBC:tst-fmtmsg", MM_WARNING, "halt", + "should print message for MM_WARNING", "GLIBC:tst-fmtmsg:3") + != MM_OK) + result = 1; + + if (fmtmsg (MM_PRINT, "GLIBC:tst-fmtmsg", MM_INFO, "halt", + "should print message for MM_INFO", "GLIBC:tst-fmtmsg:4") + != MM_OK) + result = 1; + + if (fmtmsg (MM_PRINT, "GLIBC:tst-fmtmsg", MM_NOSEV, "halt", + "should print message for MM_NOSEV", "GLIBC:tst-fmtmsg:5") + != MM_OK) + result = 1; + + if (fmtmsg (MM_PRINT, "GLIBC:tst-fmtmsg", MM_TEST, "halt", + "should print message for MM_TEST", "GLIBC:tst-fmtmsg:6") + != MM_OK) + result = 1; + + if (addseverity (MM_TEST, NULL) != MM_OK) + { + puts ("second addseverity failed"); + result = 1; + } + + if (addseverity (MM_TEST, NULL) != MM_NOTOK) + { + puts ("third addseverity unexpectedly succeeded"); + result = 1; + } + + char *p = strdup ("TEST2"); + if (addseverity (MM_TEST, p) != MM_OK) + { + puts ("fourth addseverity failed"); + result = 1; + } + if (addseverity (MM_TEST, "TEST3") != MM_OK) + { + puts ("fifth addseverity failed"); + result = 1; + } + + free (p); + + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-fmtmsg.sh b/REORG.TODO/stdlib/tst-fmtmsg.sh new file mode 100755 index 0000000000..bcbe2e3348 --- /dev/null +++ b/REORG.TODO/stdlib/tst-fmtmsg.sh @@ -0,0 +1,337 @@ +#!/bin/sh +# Test of fmtmsg function family. +# Copyright (C) 2000-2017 Free Software Foundation, Inc. +# This file is part of the GNU C Library. + +# The GNU C Library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +# The GNU C Library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public +# License along with the GNU C Library; if not, see +# <http://www.gnu.org/licenses/>. + +set -e + +common_objpfx=$1 +test_program_prefix_before_env=$2 +run_program_env=$3 +test_program_prefix_after_env=$4 +objpfx=$5 + +test_pre="${test_program_prefix_before_env} ${run_program_env}" +test="${test_program_prefix_after_env} ${objpfx}tst-fmtmsg" +out=${objpfx}tst-fmtmsg.out + +($test_pre MSGVERB= $test || exit 1; + $test_pre MSGVERB=label $test || exit 1; + $test_pre MSGVERB=severity $test || exit 1; + $test_pre MSGVERB=severity:label $test || exit 1; + $test_pre MSGVERB=text $test || exit 1; + $test_pre MSGVERB=text:label $test || exit 1; + $test_pre MSGVERB=text:severity $test || exit 1; + $test_pre MSGVERB=text:severity:label $test || exit 1; + $test_pre MSGVERB=action $test || exit 1; + $test_pre MSGVERB=action:label $test || exit 1; + $test_pre MSGVERB=action:severity $test || exit 1; + $test_pre MSGVERB=action:severity:label $test || exit 1; + $test_pre MSGVERB=action:text $test || exit 1; + $test_pre MSGVERB=action:text:label $test || exit 1; + $test_pre MSGVERB=action:text:severity $test || exit 1; + $test_pre MSGVERB=action:text:severity:label $test || exit 1; + $test_pre MSGVERB=tag $test || exit 1; + $test_pre MSGVERB=tag:label $test || exit 1; + $test_pre MSGVERB=tag:severity $test || exit 1; + $test_pre MSGVERB=tag:severity:label $test || exit 1; + $test_pre MSGVERB=tag:text $test || exit 1; + $test_pre MSGVERB=tag:text:label $test || exit 1; + $test_pre MSGVERB=tag:text:severity $test || exit 1; + $test_pre MSGVERB=tag:text:severity:label $test || exit 1; + $test_pre MSGVERB=tag:action $test || exit 1; + $test_pre MSGVERB=tag:action:label $test || exit 1; + $test_pre MSGVERB=tag:action:severity $test || exit 1; + $test_pre MSGVERB=tag:action:severity:label $test || exit 1; + $test_pre MSGVERB=tag:action:text $test || exit 1; + $test_pre MSGVERB=tag:action:text:label $test || exit 1; + $test_pre MSGVERB=tag:action:text:severity $test || exit 1; + $test_pre MSGVERB=tag:action:text:severity:label $test || exit 1;) 2> $out + +cmp $out <<EOF +GLIBC:tst-fmtmsg: HALT: halt +TO FIX: should print message for MM_HALT GLIBC:tst-fmtmsg:1 +GLIBC:tst-fmtmsg: ERROR: halt +TO FIX: should print message for MM_ERROR GLIBC:tst-fmtmsg:2 +GLIBC:tst-fmtmsg: WARNING: halt +TO FIX: should print message for MM_WARNING GLIBC:tst-fmtmsg:3 +GLIBC:tst-fmtmsg: INFO: halt +TO FIX: should print message for MM_INFO GLIBC:tst-fmtmsg:4 +GLIBC:tst-fmtmsg: halt +TO FIX: should print message for MM_NOSEV GLIBC:tst-fmtmsg:5 +GLIBC:tst-fmtmsg: TEST: halt +TO FIX: should print message for MM_TEST GLIBC:tst-fmtmsg:6 +GLIBC:tst-fmtmsg +GLIBC:tst-fmtmsg +GLIBC:tst-fmtmsg +GLIBC:tst-fmtmsg +GLIBC:tst-fmtmsg +GLIBC:tst-fmtmsg +HALT +ERROR +WARNING +INFO + +TEST +GLIBC:tst-fmtmsg: HALT +GLIBC:tst-fmtmsg: ERROR +GLIBC:tst-fmtmsg: WARNING +GLIBC:tst-fmtmsg: INFO +GLIBC:tst-fmtmsg +GLIBC:tst-fmtmsg: TEST +halt +halt +halt +halt +halt +halt +GLIBC:tst-fmtmsg: halt +GLIBC:tst-fmtmsg: halt +GLIBC:tst-fmtmsg: halt +GLIBC:tst-fmtmsg: halt +GLIBC:tst-fmtmsg: halt +GLIBC:tst-fmtmsg: halt +HALT: halt +ERROR: halt +WARNING: halt +INFO: halt +halt +TEST: halt +GLIBC:tst-fmtmsg: HALT: halt +GLIBC:tst-fmtmsg: ERROR: halt +GLIBC:tst-fmtmsg: WARNING: halt +GLIBC:tst-fmtmsg: INFO: halt +GLIBC:tst-fmtmsg: halt +GLIBC:tst-fmtmsg: TEST: halt +TO FIX: should print message for MM_HALT +TO FIX: should print message for MM_ERROR +TO FIX: should print message for MM_WARNING +TO FIX: should print message for MM_INFO +TO FIX: should print message for MM_NOSEV +TO FIX: should print message for MM_TEST +GLIBC:tst-fmtmsg: TO FIX: should print message for MM_HALT +GLIBC:tst-fmtmsg: TO FIX: should print message for MM_ERROR +GLIBC:tst-fmtmsg: TO FIX: should print message for MM_WARNING +GLIBC:tst-fmtmsg: TO FIX: should print message for MM_INFO +GLIBC:tst-fmtmsg: TO FIX: should print message for MM_NOSEV +GLIBC:tst-fmtmsg: TO FIX: should print message for MM_TEST +HALT: TO FIX: should print message for MM_HALT +ERROR: TO FIX: should print message for MM_ERROR +WARNING: TO FIX: should print message for MM_WARNING +INFO: TO FIX: should print message for MM_INFO +TO FIX: should print message for MM_NOSEV +TEST: TO FIX: should print message for MM_TEST +GLIBC:tst-fmtmsg: HALT: TO FIX: should print message for MM_HALT +GLIBC:tst-fmtmsg: ERROR: TO FIX: should print message for MM_ERROR +GLIBC:tst-fmtmsg: WARNING: TO FIX: should print message for MM_WARNING +GLIBC:tst-fmtmsg: INFO: TO FIX: should print message for MM_INFO +GLIBC:tst-fmtmsg: TO FIX: should print message for MM_NOSEV +GLIBC:tst-fmtmsg: TEST: TO FIX: should print message for MM_TEST +halt +TO FIX: should print message for MM_HALT +halt +TO FIX: should print message for MM_ERROR +halt +TO FIX: should print message for MM_WARNING +halt +TO FIX: should print message for MM_INFO +halt +TO FIX: should print message for MM_NOSEV +halt +TO FIX: should print message for MM_TEST +GLIBC:tst-fmtmsg: halt +TO FIX: should print message for MM_HALT +GLIBC:tst-fmtmsg: halt +TO FIX: should print message for MM_ERROR +GLIBC:tst-fmtmsg: halt +TO FIX: should print message for MM_WARNING +GLIBC:tst-fmtmsg: halt +TO FIX: should print message for MM_INFO +GLIBC:tst-fmtmsg: halt +TO FIX: should print message for MM_NOSEV +GLIBC:tst-fmtmsg: halt +TO FIX: should print message for MM_TEST +HALT: halt +TO FIX: should print message for MM_HALT +ERROR: halt +TO FIX: should print message for MM_ERROR +WARNING: halt +TO FIX: should print message for MM_WARNING +INFO: halt +TO FIX: should print message for MM_INFO +halt +TO FIX: should print message for MM_NOSEV +TEST: halt +TO FIX: should print message for MM_TEST +GLIBC:tst-fmtmsg: HALT: halt +TO FIX: should print message for MM_HALT +GLIBC:tst-fmtmsg: ERROR: halt +TO FIX: should print message for MM_ERROR +GLIBC:tst-fmtmsg: WARNING: halt +TO FIX: should print message for MM_WARNING +GLIBC:tst-fmtmsg: INFO: halt +TO FIX: should print message for MM_INFO +GLIBC:tst-fmtmsg: halt +TO FIX: should print message for MM_NOSEV +GLIBC:tst-fmtmsg: TEST: halt +TO FIX: should print message for MM_TEST +GLIBC:tst-fmtmsg:1 +GLIBC:tst-fmtmsg:2 +GLIBC:tst-fmtmsg:3 +GLIBC:tst-fmtmsg:4 +GLIBC:tst-fmtmsg:5 +GLIBC:tst-fmtmsg:6 +GLIBC:tst-fmtmsg: GLIBC:tst-fmtmsg:1 +GLIBC:tst-fmtmsg: GLIBC:tst-fmtmsg:2 +GLIBC:tst-fmtmsg: GLIBC:tst-fmtmsg:3 +GLIBC:tst-fmtmsg: GLIBC:tst-fmtmsg:4 +GLIBC:tst-fmtmsg: GLIBC:tst-fmtmsg:5 +GLIBC:tst-fmtmsg: GLIBC:tst-fmtmsg:6 +HALT: GLIBC:tst-fmtmsg:1 +ERROR: GLIBC:tst-fmtmsg:2 +WARNING: GLIBC:tst-fmtmsg:3 +INFO: GLIBC:tst-fmtmsg:4 +GLIBC:tst-fmtmsg:5 +TEST: GLIBC:tst-fmtmsg:6 +GLIBC:tst-fmtmsg: HALT: GLIBC:tst-fmtmsg:1 +GLIBC:tst-fmtmsg: ERROR: GLIBC:tst-fmtmsg:2 +GLIBC:tst-fmtmsg: WARNING: GLIBC:tst-fmtmsg:3 +GLIBC:tst-fmtmsg: INFO: GLIBC:tst-fmtmsg:4 +GLIBC:tst-fmtmsg: GLIBC:tst-fmtmsg:5 +GLIBC:tst-fmtmsg: TEST: GLIBC:tst-fmtmsg:6 +halt +GLIBC:tst-fmtmsg:1 +halt +GLIBC:tst-fmtmsg:2 +halt +GLIBC:tst-fmtmsg:3 +halt +GLIBC:tst-fmtmsg:4 +halt +GLIBC:tst-fmtmsg:5 +halt +GLIBC:tst-fmtmsg:6 +GLIBC:tst-fmtmsg: halt +GLIBC:tst-fmtmsg:1 +GLIBC:tst-fmtmsg: halt +GLIBC:tst-fmtmsg:2 +GLIBC:tst-fmtmsg: halt +GLIBC:tst-fmtmsg:3 +GLIBC:tst-fmtmsg: halt +GLIBC:tst-fmtmsg:4 +GLIBC:tst-fmtmsg: halt +GLIBC:tst-fmtmsg:5 +GLIBC:tst-fmtmsg: halt +GLIBC:tst-fmtmsg:6 +HALT: halt +GLIBC:tst-fmtmsg:1 +ERROR: halt +GLIBC:tst-fmtmsg:2 +WARNING: halt +GLIBC:tst-fmtmsg:3 +INFO: halt +GLIBC:tst-fmtmsg:4 +halt +GLIBC:tst-fmtmsg:5 +TEST: halt +GLIBC:tst-fmtmsg:6 +GLIBC:tst-fmtmsg: HALT: halt +GLIBC:tst-fmtmsg:1 +GLIBC:tst-fmtmsg: ERROR: halt +GLIBC:tst-fmtmsg:2 +GLIBC:tst-fmtmsg: WARNING: halt +GLIBC:tst-fmtmsg:3 +GLIBC:tst-fmtmsg: INFO: halt +GLIBC:tst-fmtmsg:4 +GLIBC:tst-fmtmsg: halt +GLIBC:tst-fmtmsg:5 +GLIBC:tst-fmtmsg: TEST: halt +GLIBC:tst-fmtmsg:6 +TO FIX: should print message for MM_HALT GLIBC:tst-fmtmsg:1 +TO FIX: should print message for MM_ERROR GLIBC:tst-fmtmsg:2 +TO FIX: should print message for MM_WARNING GLIBC:tst-fmtmsg:3 +TO FIX: should print message for MM_INFO GLIBC:tst-fmtmsg:4 +TO FIX: should print message for MM_NOSEV GLIBC:tst-fmtmsg:5 +TO FIX: should print message for MM_TEST GLIBC:tst-fmtmsg:6 +GLIBC:tst-fmtmsg: TO FIX: should print message for MM_HALT GLIBC:tst-fmtmsg:1 +GLIBC:tst-fmtmsg: TO FIX: should print message for MM_ERROR GLIBC:tst-fmtmsg:2 +GLIBC:tst-fmtmsg: TO FIX: should print message for MM_WARNING GLIBC:tst-fmtmsg:3 +GLIBC:tst-fmtmsg: TO FIX: should print message for MM_INFO GLIBC:tst-fmtmsg:4 +GLIBC:tst-fmtmsg: TO FIX: should print message for MM_NOSEV GLIBC:tst-fmtmsg:5 +GLIBC:tst-fmtmsg: TO FIX: should print message for MM_TEST GLIBC:tst-fmtmsg:6 +HALT: TO FIX: should print message for MM_HALT GLIBC:tst-fmtmsg:1 +ERROR: TO FIX: should print message for MM_ERROR GLIBC:tst-fmtmsg:2 +WARNING: TO FIX: should print message for MM_WARNING GLIBC:tst-fmtmsg:3 +INFO: TO FIX: should print message for MM_INFO GLIBC:tst-fmtmsg:4 +TO FIX: should print message for MM_NOSEV GLIBC:tst-fmtmsg:5 +TEST: TO FIX: should print message for MM_TEST GLIBC:tst-fmtmsg:6 +GLIBC:tst-fmtmsg: HALT: TO FIX: should print message for MM_HALT GLIBC:tst-fmtmsg:1 +GLIBC:tst-fmtmsg: ERROR: TO FIX: should print message for MM_ERROR GLIBC:tst-fmtmsg:2 +GLIBC:tst-fmtmsg: WARNING: TO FIX: should print message for MM_WARNING GLIBC:tst-fmtmsg:3 +GLIBC:tst-fmtmsg: INFO: TO FIX: should print message for MM_INFO GLIBC:tst-fmtmsg:4 +GLIBC:tst-fmtmsg: TO FIX: should print message for MM_NOSEV GLIBC:tst-fmtmsg:5 +GLIBC:tst-fmtmsg: TEST: TO FIX: should print message for MM_TEST GLIBC:tst-fmtmsg:6 +halt +TO FIX: should print message for MM_HALT GLIBC:tst-fmtmsg:1 +halt +TO FIX: should print message for MM_ERROR GLIBC:tst-fmtmsg:2 +halt +TO FIX: should print message for MM_WARNING GLIBC:tst-fmtmsg:3 +halt +TO FIX: should print message for MM_INFO GLIBC:tst-fmtmsg:4 +halt +TO FIX: should print message for MM_NOSEV GLIBC:tst-fmtmsg:5 +halt +TO FIX: should print message for MM_TEST GLIBC:tst-fmtmsg:6 +GLIBC:tst-fmtmsg: halt +TO FIX: should print message for MM_HALT GLIBC:tst-fmtmsg:1 +GLIBC:tst-fmtmsg: halt +TO FIX: should print message for MM_ERROR GLIBC:tst-fmtmsg:2 +GLIBC:tst-fmtmsg: halt +TO FIX: should print message for MM_WARNING GLIBC:tst-fmtmsg:3 +GLIBC:tst-fmtmsg: halt +TO FIX: should print message for MM_INFO GLIBC:tst-fmtmsg:4 +GLIBC:tst-fmtmsg: halt +TO FIX: should print message for MM_NOSEV GLIBC:tst-fmtmsg:5 +GLIBC:tst-fmtmsg: halt +TO FIX: should print message for MM_TEST GLIBC:tst-fmtmsg:6 +HALT: halt +TO FIX: should print message for MM_HALT GLIBC:tst-fmtmsg:1 +ERROR: halt +TO FIX: should print message for MM_ERROR GLIBC:tst-fmtmsg:2 +WARNING: halt +TO FIX: should print message for MM_WARNING GLIBC:tst-fmtmsg:3 +INFO: halt +TO FIX: should print message for MM_INFO GLIBC:tst-fmtmsg:4 +halt +TO FIX: should print message for MM_NOSEV GLIBC:tst-fmtmsg:5 +TEST: halt +TO FIX: should print message for MM_TEST GLIBC:tst-fmtmsg:6 +GLIBC:tst-fmtmsg: HALT: halt +TO FIX: should print message for MM_HALT GLIBC:tst-fmtmsg:1 +GLIBC:tst-fmtmsg: ERROR: halt +TO FIX: should print message for MM_ERROR GLIBC:tst-fmtmsg:2 +GLIBC:tst-fmtmsg: WARNING: halt +TO FIX: should print message for MM_WARNING GLIBC:tst-fmtmsg:3 +GLIBC:tst-fmtmsg: INFO: halt +TO FIX: should print message for MM_INFO GLIBC:tst-fmtmsg:4 +GLIBC:tst-fmtmsg: halt +TO FIX: should print message for MM_NOSEV GLIBC:tst-fmtmsg:5 +GLIBC:tst-fmtmsg: TEST: halt +TO FIX: should print message for MM_TEST GLIBC:tst-fmtmsg:6 +EOF +exit $? diff --git a/REORG.TODO/stdlib/tst-getrandom.c b/REORG.TODO/stdlib/tst-getrandom.c new file mode 100644 index 0000000000..e84a83f248 --- /dev/null +++ b/REORG.TODO/stdlib/tst-getrandom.c @@ -0,0 +1,245 @@ +/* Tests for the getentropy, getrandom functions. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <stdbool.h> +#include <stdio.h> +#include <string.h> +#include <sys/random.h> + +/* Set to true if any errors are encountered. */ +static bool errors; + +/* Test getrandom with a single buffer length. NB: The passed-in + buffer must have room for four extra bytes after the specified + length, which are used to test that getrandom leaves those bytes + unchanged. */ +static void +test_length (char *buffer, size_t length, unsigned int flags) +{ + memset (buffer, 0, length); + strcpy (buffer + length, "123"); + ssize_t ret = getrandom (buffer, length, flags); + if (ret < 0) + { + /* EAGAIN is an expected error with GRND_RANDOM and + GRND_NONBLOCK. */ + if ((flags & GRND_RANDOM) + && (flags & GRND_NONBLOCK) + && errno == EAGAIN) + return; + printf ("error: getrandom (%zu, 0x%x): %m\n", length, flags); + errors = true; + return; + } + if (ret != length) + { + if (flags & GRND_RANDOM) + { + if (ret == 0 || ret > length) + { + printf ("error: getrandom (%zu, 0x%x) returned %zd\n", + length, flags, ret); + errors = true; + } + } + else + { + printf ("error: getrandom (%zu, 0x%x) returned %zd\n", + length, flags, ret); + errors = true; + } + } + if (length >= 7) + { + /* One spurious test failure in 2**56 is sufficiently + unlikely. */ + int non_null = 0; + for (int i = 0; i < length; ++i) + non_null += buffer[i] != 0; + if (non_null == 0) + { + printf ("error: getrandom (%zu, 0x%x) returned all-zero bytes\n", + length, flags); + errors = true; + } + } + if (memcmp (buffer + length, "123", 4) != 0) + { + printf ("error: getrandom (%zu, 0x%x) wrote spurious bytes\n", + length, flags); + errors = true; + } +} + +/* Call getrandom repeatedly to fill the buffer. */ +static bool +getrandom_full (char *buffer, size_t length, unsigned int flags) +{ + char *end = buffer + length; + while (buffer < end) + { + ssize_t ret = getrandom (buffer, end - buffer, flags); + if (ret < 0) + { + printf ("error: getrandom (%zu, 0x%x): %m\n", length, flags); + errors = true; + return false; + } + buffer += ret; + } + + return true; +} + +static void +test_flags (unsigned int flags) +{ + /* Test various lengths, but only for !GRND_RANDOM, to conserve + entropy. */ + { + enum { max_length = 300 }; + char buffer[max_length + 4]; + if (flags & GRND_RANDOM) + test_length (buffer, 0, flags); + else + { + for (int length = 0; length <= 9; ++length) + test_length (buffer, length, flags); + test_length (buffer, 16, flags); + test_length (buffer, max_length, flags); + } + } + + /* Test that getrandom returns different data. */ + if (!(flags & GRND_NONBLOCK)) + { + char buffer1[8]; + memset (buffer1, 0, sizeof (buffer1)); + + char buffer2[8]; + memset (buffer2, 0, sizeof (buffer2)); + + if (getrandom_full (buffer1, sizeof (buffer1), flags) + && getrandom_full (buffer2, sizeof (buffer2), flags)) + { + /* The probability that these two 8-byte buffers are equal + is very small (assuming that two subsequent calls to + getrandom result are independent, uniformly distributed + random variables). */ + if (memcmp (buffer1, buffer2, sizeof (buffer1)) == 0) + { + printf ("error: getrandom returns constant value\n"); + errors = true; + } + } + } +} + +static void +test_getentropy (void) +{ + char buf[16]; + memset (buf, '@', sizeof (buf)); + if (getentropy (buf, 0) != 0) + { + printf ("error: getentropy zero length: %m\n"); + errors = true; + return; + } + for (size_t i = 0; i < sizeof (buf); ++i) + if (buf[i] != '@') + { + printf ("error: getentropy modified zero-length buffer\n"); + errors = true; + return; + } + + if (getentropy (buf, sizeof (buf)) != 0) + { + printf ("error: getentropy buf: %m\n"); + errors = true; + return; + } + + char buf2[256]; + _Static_assert (sizeof (buf) < sizeof (buf2), "buf and buf2 compatible"); + memset (buf2, '@', sizeof (buf2)); + if (getentropy (buf2, sizeof (buf)) != 0) + { + printf ("error: getentropy buf2: %m\n"); + errors = true; + return; + } + + /* The probability that these two buffers are equal is very + small. */ + if (memcmp (buf, buf2, sizeof (buf) == 0)) + { + printf ("error: getentropy appears to return constant bytes\n"); + errors = true; + return; + } + + for (size_t i = sizeof (buf); i < sizeof (buf2); ++i) + if (buf2[i] != '@') + { + printf ("error: getentropy wrote beyond the end of the buffer\n"); + errors = true; + return; + } + + char buf3[257]; + if (getentropy (buf3, sizeof (buf3)) == 0) + { + printf ("error: getentropy successful for 257 byte buffer\n"); + errors = true; + return; + } + if (errno != EIO) + { + printf ("error: getentropy wrong error for 257 byte buffer: %m\n"); + errors = true; + return; + } +} + +static int +do_test (void) +{ + /* Check if getrandom is not supported by this system. */ + if (getrandom (NULL, 0, 0) == -1 && errno == ENOSYS) + return 77; + + for (int use_random = 0; use_random < 2; ++use_random) + for (int use_nonblock = 0; use_nonblock < 2; ++use_nonblock) + { + unsigned int flags = 0; + if (use_random) + flags |= GRND_RANDOM; + if (use_nonblock) + flags |= GRND_NONBLOCK; + test_flags (flags); + } + + test_getentropy (); + + return errors; +} + +#include <support/test-driver.c> diff --git a/REORG.TODO/stdlib/tst-limits.c b/REORG.TODO/stdlib/tst-limits.c new file mode 100644 index 0000000000..9aabc360f6 --- /dev/null +++ b/REORG.TODO/stdlib/tst-limits.c @@ -0,0 +1,72 @@ +/* It is important that this comes first to not hide effects introduced + by other headers. */ +#include <limits.h> + +#include <inttypes.h> +#include <stdio.h> + + +static long long int +bitval (int bits) +{ + long long int val = 0; + while (bits-- > 0) + val |= 1ll << bits; + return val; +} + + +static int +do_test (void) +{ + int result = 0; + +#define TEST(name, format, expected) \ + printf ("%-12s expected = %-20" format " actual = %" format "\n", \ + #name ":", expected, name); \ + result |= name != expected + + /* The limits from ISO C99. */ + + /* We cannot support anything but 8-bit chars. */ + TEST (CHAR_BIT, "d", 8); + TEST (SCHAR_MIN, "d", -128); + TEST (SCHAR_MAX, "d", 127); + TEST (UCHAR_MAX, "d", 255); + + TEST (SHRT_MIN, "d", -(1 << (sizeof (short int) * CHAR_BIT - 1))); + TEST (SHRT_MAX, "d", (1 << (sizeof (short int) * CHAR_BIT - 1)) - 1); + TEST (USHRT_MAX, "d", (1 << sizeof (short int) * CHAR_BIT) - 1); + + TEST (INT_MIN, "d", (int) -bitval (sizeof (int) * CHAR_BIT - 1) - 1); + TEST (INT_MAX, "d", (int) bitval (sizeof (int) * CHAR_BIT - 1)); + TEST (UINT_MAX, "u", + (unsigned int) bitval (sizeof (unsigned int) * CHAR_BIT)); + + TEST (LONG_MIN, "ld", + (long int) -bitval (sizeof (long int) * CHAR_BIT - 1) - 1); + TEST (LONG_MAX, "ld", (long int) bitval (sizeof (long int) * CHAR_BIT - 1)); + TEST (ULONG_MAX, "lu", + (unsigned long int) bitval (sizeof (unsigned long int) * CHAR_BIT)); + + TEST (LLONG_MIN, "lld", -bitval (sizeof (long long int) * CHAR_BIT - 1) - 1); + TEST (LLONG_MAX, "lld", bitval (sizeof (long long int) * CHAR_BIT - 1)); + TEST (ULLONG_MAX, "llu", + (unsigned long long int) bitval (sizeof (unsigned long long int) + * CHAR_BIT)); + + /* Values from POSIX and Unix. */ +#ifdef PAGESIZE + TEST (PAGESIZE, "d", getpagesize ()); +#elif defined (PAGE_SIZE) + TEST (PAGE_SIZE, "d", getpagesize ()); +#endif + + TEST (WORD_BIT, "d", (int) sizeof (int) * CHAR_BIT); + TEST (LONG_BIT, "d", (int) sizeof (long int) * CHAR_BIT); + + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-makecontext.c b/REORG.TODO/stdlib/tst-makecontext.c new file mode 100644 index 0000000000..d7ffad5f64 --- /dev/null +++ b/REORG.TODO/stdlib/tst-makecontext.c @@ -0,0 +1,110 @@ +/* Copyright (C) 2006-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <stdlib.h> +#include <stdio.h> +#include <ucontext.h> +#include <assert.h> +#include <unwind.h> +#include <dlfcn.h> +#include <gnu/lib-names.h> + +ucontext_t ucp; +char st1[16384]; +__thread int thr; + +int somevar = -76; +long othervar = -78L; + +struct trace_arg +{ + int cnt, size; +}; + +static _Unwind_Reason_Code +backtrace_helper (struct _Unwind_Context *ctx, void *a) +{ + struct trace_arg *arg = a; + if (++arg->cnt == arg->size) + return _URC_END_OF_STACK; + return _URC_NO_REASON; +} + +void +cf (int i) +{ + struct trace_arg arg = { .size = 100, .cnt = -1 }; + void *handle; + _Unwind_Reason_Code (*unwind_backtrace) (_Unwind_Trace_Fn, void *); + + if (i != othervar || thr != 94) + { + printf ("i %d thr %d\n", i, thr); + exit (1); + } + + /* Test if callback function of _Unwind_Backtrace is not called infinitely + times. See Bug 18508 or gcc bug "Bug 66303 - runtime.Caller() returns + infinitely deep stack frames on s390x.". + The go runtime calls backtrace_full() in + <gcc-src>/libbacktrace/backtrace.c, which uses _Unwind_Backtrace(). */ + handle = dlopen (LIBGCC_S_SO, RTLD_LAZY); + if (handle != NULL) + { + unwind_backtrace = dlsym (handle, "_Unwind_Backtrace"); + if (unwind_backtrace != NULL) + { + unwind_backtrace (backtrace_helper, &arg); + assert (arg.cnt != -1 && arg.cnt < 100); + } + dlclose (handle); + } + + /* Since uc_link below has been set to NULL, setcontext is supposed to + terminate the process normally after this function returns. */ +} + +int +do_test (void) +{ + if (getcontext (&ucp) != 0) + { + if (errno == ENOSYS) + { + puts ("context handling not supported"); + return 0; + } + + puts ("getcontext failed"); + return 1; + } + thr = 94; + ucp.uc_link = NULL; + ucp.uc_stack.ss_sp = st1; + ucp.uc_stack.ss_size = sizeof st1; + makecontext (&ucp, (void (*) (void)) cf, 1, somevar - 2); + if (setcontext (&ucp) != 0) + { + puts ("setcontext failed"); + return 1; + } + return 2; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-makecontext2.c b/REORG.TODO/stdlib/tst-makecontext2.c new file mode 100644 index 0000000000..0d078279a8 --- /dev/null +++ b/REORG.TODO/stdlib/tst-makecontext2.c @@ -0,0 +1,79 @@ +/* Copyright (C) 2008-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <ucontext.h> +#include <tst-stack-align.h> + +ucontext_t ucp, ucp2; +char st1[262144] __attribute__((aligned (16))); + +void +cf (int i, int j) +{ + if (i != 78 || j != 274) + { + printf ("i %d j %d\n", i, j); + exit (1); + } + else if (TEST_STACK_ALIGN ()) + { + puts ("insufficiently aligned stack"); + exit (2); + } +} + +int +do_test (void) +{ + for (size_t j = 32; j < 64; j += sizeof (long)) + { + if (getcontext (&ucp) != 0) + { + if (errno == ENOSYS) + { + puts ("context handling not supported"); + return 0; + } + + puts ("getcontext failed"); + return 1; + } + ucp.uc_link = &ucp2; + ucp.uc_stack.ss_sp = st1; + ucp.uc_stack.ss_size = sizeof (st1) - j; + memset (&st1[sizeof (st1) - j], 0x55, j); + makecontext (&ucp, (void (*) (void)) cf, 2, 78, 274); + if (swapcontext (&ucp2, &ucp) != 0) + { + puts ("setcontext failed"); + return 1; + } + + for (size_t i = j; i > 0; i--) + if (st1[sizeof (st1) - j + i - 1] != 0x55) + { printf ("fail %zd %zd\n", i, j); break; } + } + + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-makecontext3.c b/REORG.TODO/stdlib/tst-makecontext3.c new file mode 100644 index 0000000000..ccdeb4a282 --- /dev/null +++ b/REORG.TODO/stdlib/tst-makecontext3.c @@ -0,0 +1,220 @@ +/* Copyright (C) 2001-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ucontext.h> +#include <unistd.h> + +static ucontext_t ctx[3]; + +static int was_in_f1; +static int was_in_f2; + +static char st2[32768]; + +static volatile int flag; + +static void +f1 (int a00, int a01, int a02, int a03, int a04, int a05, int a06, int a07, + int a08, int a09, int a10, int a11, int a12, int a13, int a14, int a15, + int a16, int a17, int a18, int a19, int a20, int a21, int a22, int a23, + int a24, int a25, int a26, int a27, int a28, int a29, int a30, int a31, + int a32) +{ + printf ("start f1(a00=%08x,a01=%08x,a02=%08x,a03=%08x,\n" + " a04=%08x,a05=%08x,a06=%08x,a07=%08x,\n" + " a08=%08x,a09=%08x,a10=%08x,a11=%08x,\n" + " a12=%08x,a13=%08x,a14=%08x,a15=%08x,\n" + " a16=%08x,a17=%08x,a18=%08x,a19=%08x,\n" + " a20=%08x,a21=%08x,a22=%08x,a23=%08x,\n" + " a24=%08x,a25=%08x,a26=%08x,a27=%08x,\n" + " a28=%08x,a29=%08x,a30=%08x,a31=%08x,\n" + " a32=%08x) [%d]\n", + a00, a01, a02, a03, a04, a05, a06, a07, + a08, a09, a10, a11, a12, a13, a14, a15, + a16, a17, a18, a19, a20, a21, a22, a23, + a24, a25, a26, a27, a28, a29, a30, a31, + a32, flag); + + if (a00 != (0x00000001 << flag) || a01 != (0x00000004 << flag) + || a02 != (0x00000012 << flag) || a03 != (0x00000048 << flag) + || a04 != (0x00000123 << flag) || a05 != (0x0000048d << flag) + || a06 != (0x00001234 << flag) || a07 != (0x000048d1 << flag) + || a08 != (0x00012345 << flag) || a09 != (0x00048d15 << flag) + || a10 != (0x00123456 << flag) || a11 != (0x0048d159 << flag) + || a12 != (0x01234567 << flag) || a13 != (0x048d159e << flag) + || a14 != (0x12345678 << flag) || a15 != (0x48d159e2 << flag) + || a16 != (0x23456789 << flag) || a17 != (0x8d159e26 << flag) + || a18 != (0x3456789a << flag) || a19 != (0xd159e26a << flag) + || a20 != (0x456789ab << flag) || a21 != (0x159e26af << flag) + || a22 != (0x56789abc << flag) || a23 != (0x59e26af3 << flag) + || a24 != (0x6789abcd << flag) || a25 != (0x9e26af37 << flag) + || a26 != (0x789abcde << flag) || a27 != (0xe26af37b << flag) + || a28 != (0x89abcdef << flag) || a29 != (0x26af37bc << flag) + || a30 != (0x9abcdef0 << flag) || a31 != (0x6af37bc3 << flag) + || a32 != (0xabcdef0f << flag)) + { + puts ("arg mismatch"); + exit (-1); + } + + if (flag && swapcontext (&ctx[1], &ctx[2]) != 0) + { + printf ("%s: swapcontext: %m\n", __FUNCTION__); + exit (1); + } + printf ("finish f1 [%d]\n", flag); + flag++; + was_in_f1++; +} + +static void +f2 (void) +{ + puts ("start f2"); + if (swapcontext (&ctx[2], &ctx[1]) != 0) + { + printf ("%s: swapcontext: %m\n", __FUNCTION__); + exit (1); + } + puts ("finish f2"); + was_in_f2 = 1; +} + +volatile int global; + + +static int back_in_main; + + +static void +check_called (void) +{ + if (back_in_main == 0) + { + puts ("program did not reach main again"); + _exit (1); + } +} + + +int +main (void) +{ + atexit (check_called); + + char st1[32768]; + + puts ("making contexts"); + if (getcontext (&ctx[0]) != 0) + { + if (errno == ENOSYS) + { + back_in_main = 1; + exit (0); + } + + printf ("%s: getcontext: %m\n", __FUNCTION__); + exit (1); + } + + if (getcontext (&ctx[1]) != 0) + { + printf ("%s: getcontext: %m\n", __FUNCTION__); + exit (1); + } + + ctx[1].uc_stack.ss_sp = st1; + ctx[1].uc_stack.ss_size = sizeof st1; + ctx[1].uc_link = &ctx[0]; + errno = 0; + makecontext (&ctx[1], (void (*) (void)) f1, 33, + 0x00000001 << flag, 0x00000004 << flag, + 0x00000012 << flag, 0x00000048 << flag, + 0x00000123 << flag, 0x0000048d << flag, + 0x00001234 << flag, 0x000048d1 << flag, + 0x00012345 << flag, 0x00048d15 << flag, + 0x00123456 << flag, 0x0048d159 << flag, + 0x01234567 << flag, 0x048d159e << flag, + 0x12345678 << flag, 0x48d159e2 << flag, + 0x23456789 << flag, 0x8d159e26 << flag, + 0x3456789a << flag, 0xd159e26a << flag, + 0x456789ab << flag, 0x159e26af << flag, + 0x56789abc << flag, 0x59e26af3 << flag, + 0x6789abcd << flag, 0x9e26af37 << flag, + 0x789abcde << flag, 0xe26af37b << flag, + 0x89abcdef << flag, 0x26af37bc << flag, + 0x9abcdef0 << flag, 0x6af37bc3 << flag, + 0xabcdef0f << flag); + + /* Without this check, a stub makecontext can make us spin forever. */ + if (errno == ENOSYS) + { + puts ("makecontext not implemented"); + back_in_main = 1; + return 0; + } + + /* Play some tricks with this context. */ + if (++global == 1) + if (setcontext (&ctx[1]) != 0) + { + printf ("%s: setcontext: %m\n", __FUNCTION__); + exit (1); + } + if (global != 2) + { + printf ("%s: 'global' not incremented twice\n", __FUNCTION__); + exit (1); + } + + if (getcontext (&ctx[2]) != 0) + { + printf ("%s: second getcontext: %m\n", __FUNCTION__); + exit (1); + } + ctx[2].uc_stack.ss_sp = st2; + ctx[2].uc_stack.ss_size = sizeof st2; + ctx[2].uc_link = &ctx[1]; + makecontext (&ctx[2], f2, 0); + + puts ("swapping contexts"); + if (swapcontext (&ctx[0], &ctx[2]) != 0) + { + printf ("%s: swapcontext: %m\n", __FUNCTION__); + exit (1); + } + puts ("back at main program"); + back_in_main = 1; + + if (was_in_f1 < 2) + { + puts ("didn't reach f1 twice"); + exit (1); + } + if (was_in_f2 == 0) + { + puts ("didn't reach f2"); + exit (1); + } + + puts ("test succeeded"); + return 0; +} diff --git a/REORG.TODO/stdlib/tst-putenv.c b/REORG.TODO/stdlib/tst-putenv.c new file mode 100644 index 0000000000..47513ea42b --- /dev/null +++ b/REORG.TODO/stdlib/tst-putenv.c @@ -0,0 +1,18 @@ +#include <stdio.h> +#include <stdlib.h> + +static int +do_test (void) +{ + char *p = getenv ("SOMETHING_NOBODY_USES"); + if (p == NULL) + { + puts ("envvar not defined"); + return 1; + } + + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-putenvmod.c b/REORG.TODO/stdlib/tst-putenvmod.c new file mode 100644 index 0000000000..7c0c337d3f --- /dev/null +++ b/REORG.TODO/stdlib/tst-putenvmod.c @@ -0,0 +1,17 @@ +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +void +__attribute ((constructor)) +init (void) +{ + puts ("init DSO"); + + static char str[] = "SOMETHING_NOBODY_USES=something_else"; + if (putenv (str) != 0) + { + puts ("putenv failed"); + _exit (1); + } +} diff --git a/REORG.TODO/stdlib/tst-qsort.c b/REORG.TODO/stdlib/tst-qsort.c new file mode 100644 index 0000000000..2b26e74d0b --- /dev/null +++ b/REORG.TODO/stdlib/tst-qsort.c @@ -0,0 +1,55 @@ +/* Test case by Paul Eggert <eggert@twinsun.com> */ +#include <stdio.h> +#include <stdlib.h> +#include <tst-stack-align.h> + +struct big { char c[4 * 1024]; }; + +struct big *array; +struct big *array_end; + +static int align_check; + +int +compare (void const *a1, void const *b1) +{ + struct big const *a = a1; + struct big const *b = b1; + + if (!align_check) + align_check = TEST_STACK_ALIGN () ? -1 : 1; + + if (! (array <= a && a < array_end + && array <= b && b < array_end)) + { + exit (EXIT_FAILURE); + } + return b->c[0] - a->c[0]; +} + +int +main (int argc, char **argv) +{ + size_t i; + size_t array_members = argv[1] ? atoi (argv[1]) : 50; + array = (struct big *) malloc (array_members * sizeof *array); + if (array == NULL) + { + puts ("no memory"); + exit (EXIT_FAILURE); + } + + array_end = array + array_members; + for (i = 0; i < array_members; i++) + array[i].c[0] = i % 128; + + qsort (array, array_members, sizeof *array, compare); + + if (align_check == -1) + { + puts ("stack not sufficiently aligned"); + exit (EXIT_FAILURE); + } + + return 0; +} diff --git a/REORG.TODO/stdlib/tst-qsort2.c b/REORG.TODO/stdlib/tst-qsort2.c new file mode 100644 index 0000000000..10d16852b0 --- /dev/null +++ b/REORG.TODO/stdlib/tst-qsort2.c @@ -0,0 +1,89 @@ +#include <stdio.h> +#include <stdlib.h> + +char *array; +char *array_end; +size_t member_size; + +int +compare (const void *a1, const void *b1) +{ + const char *a = a1; + const char *b = b1; + + if (! (array <= a && a < array_end + && array <= b && b < array_end)) + { + puts ("compare arguments not inside of the array"); + exit (EXIT_FAILURE); + } + int ret = b[0] - a[0]; + if (ret) + return ret; + if (member_size > 1) + return b[1] - a[1]; + return 0; +} + +int +test (size_t nmemb, size_t size) +{ + array = malloc (nmemb * size); + if (array == NULL) + { + printf ("%zd x %zd: no memory", nmemb, size); + return 1; + } + + array_end = array + nmemb * size; + member_size = size; + + char *p; + size_t i; + size_t bias = random (); + for (i = 0, p = array; i < nmemb; i++, p += size) + { + p[0] = (char) (i + bias); + if (size > 1) + p[1] = (char) ((i + bias) >> 8); + } + + qsort (array, nmemb, size, compare); + + for (i = 0, p = array; i < nmemb - 1; i++, p += size) + { + if (p[0] < p[size] + || (size > 1 && p[0] == p[size] && p[1] < p[size + 1])) + { + printf ("%zd x %zd: failure at offset %zd\n", nmemb, + size, i); + free (array); + return 1; + } + } + + free (array); + return 0; +} + +int +main (int argc, char **argv) +{ + int ret = 0; + if (argc >= 3) + ret |= test (atoi (argv[1]), atoi (argv[2])); + else + { + ret |= test (10000, 1); + ret |= test (200000, 2); + ret |= test (2000000, 3); + ret |= test (2132310, 4); + ret |= test (1202730, 7); + ret |= test (1184710, 8); + ret |= test (272710, 12); + ret |= test (14170, 32); + ret |= test (4170, 320); + } + + return ret; +} diff --git a/REORG.TODO/stdlib/tst-quick_exit.cc b/REORG.TODO/stdlib/tst-quick_exit.cc new file mode 100644 index 0000000000..b46fafed5c --- /dev/null +++ b/REORG.TODO/stdlib/tst-quick_exit.cc @@ -0,0 +1,47 @@ +/* Bug 20198: Do not call object destructors at exit. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +struct A +{ + ~A () { abort (); } +}; + +thread_local A a; + +void +__attribute__ ((noinline, noclone)) +optimization_barrier (A &) +{ +} + +static int +do_test () +{ + optimization_barrier (a); + /* The C++11 standard in 18.5.12 says: + "Objects shall not be destroyed as a result of calling + quick_exit." + If quick_exit calls the destructors the test aborts. */ + quick_exit (0); + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-rand48-2.c b/REORG.TODO/stdlib/tst-rand48-2.c new file mode 100644 index 0000000000..8b8fef4430 --- /dev/null +++ b/REORG.TODO/stdlib/tst-rand48-2.c @@ -0,0 +1,116 @@ +#include <stdint.h> +#include <stdio.h> +#include <stdlib.h> +#include <time.h> + +static int +do_test (void) +{ + time_t t = time (NULL); + int i, ret = 0; + double d; + long int l; + struct drand48_data data; + unsigned short int buf[3]; + + srand48 ((long int) t); + for (i = 0; i < 50; i++) + if ((d = drand48 ()) < 0.0 || d >= 1.0) + { + printf ("drand48 %d %g\n", i, d); + ret = 1; + } + + srand48_r ((long int) t, &data); + for (i = 0; i < 50; i++) + if (drand48_r (&data, &d) != 0 || d < 0.0 || d >= 1.0) + { + printf ("drand48_r %d %g\n", i, d); + ret = 1; + } + + buf[2] = (t & 0xffff0000) >> 16; buf[1] = (t & 0xffff); buf[0] = 0x330e; + for (i = 0; i < 50; i++) + if ((d = erand48 (buf)) < 0.0 || d >= 1.0) + { + printf ("erand48 %d %g\n", i, d); + ret = 1; + } + + buf[2] = (t & 0xffff0000) >> 16; buf[1] = (t & 0xffff); buf[0] = 0x330e; + for (i = 0; i < 50; i++) + if (erand48_r (buf, &data, &d) != 0 || d < 0.0 || d >= 1.0) + { + printf ("erand48_r %d %g\n", i, d); + ret = 1; + } + + srand48 ((long int) t); + for (i = 0; i < 50; i++) + if ((l = lrand48 ()) < 0 || l > INT32_MAX) + { + printf ("lrand48 %d %ld\n", i, l); + ret = 1; + } + + srand48_r ((long int) t, &data); + for (i = 0; i < 50; i++) + if (lrand48_r (&data, &l) != 0 || l < 0 || l > INT32_MAX) + { + printf ("lrand48_r %d %ld\n", i, l); + ret = 1; + } + + buf[2] = (t & 0xffff0000) >> 16; buf[1] = (t & 0xffff); buf[0] = 0x330e; + for (i = 0; i < 50; i++) + if ((l = nrand48 (buf)) < 0 || l > INT32_MAX) + { + printf ("nrand48 %d %ld\n", i, l); + ret = 1; + } + + buf[2] = (t & 0xffff0000) >> 16; buf[1] = (t & 0xffff); buf[0] = 0x330e; + for (i = 0; i < 50; i++) + if (nrand48_r (buf, &data, &l) != 0 || l < 0 || l > INT32_MAX) + { + printf ("nrand48_r %d %ld\n", i, l); + ret = 1; + } + + srand48 ((long int) t); + for (i = 0; i < 50; i++) + if ((l = mrand48 ()) < INT32_MIN || l > INT32_MAX) + { + printf ("mrand48 %d %ld\n", i, l); + ret = 1; + } + + srand48_r ((long int) t, &data); + for (i = 0; i < 50; i++) + if (mrand48_r (&data, &l) != 0 || l < INT32_MIN || l > INT32_MAX) + { + printf ("mrand48_r %d %ld\n", i, l); + ret = 1; + } + + buf[2] = (t & 0xffff0000) >> 16; buf[1] = (t & 0xffff); buf[0] = 0x330e; + for (i = 0; i < 50; i++) + if ((l = jrand48 (buf)) < INT32_MIN || l > INT32_MAX) + { + printf ("jrand48 %d %ld\n", i, l); + ret = 1; + } + + buf[2] = (t & 0xffff0000) >> 16; buf[1] = (t & 0xffff); buf[0] = 0x330e; + for (i = 0; i < 50; i++) + if (jrand48_r (buf, &data, &l) != 0 || l < INT32_MIN || l > INT32_MAX) + { + printf ("jrand48_r %d %ld\n", i, l); + ret = 1; + } + + return ret; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-rand48.c b/REORG.TODO/stdlib/tst-rand48.c new file mode 100644 index 0000000000..973c62e1eb --- /dev/null +++ b/REORG.TODO/stdlib/tst-rand48.c @@ -0,0 +1,393 @@ +#include <float.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#ifndef DECIMAL_DIG +# define DECIMAL_DIG 21 +#endif + + +static int +do_test (void) +{ + unsigned short int xs[3] = { 0x0001, 0x0012, 0x0123 }; + unsigned short int lxs[7]; + unsigned short int *xsp; + int result = 0; + long int l; + double d; + double e; + + /* Test srand48. */ + srand48 (0x98765432); + /* Get the values of the internal Xi array. */ + xsp = seed48 (xs); + if (xsp[0] != 0x330e || xsp[1] != 0x5432 || xsp[2] != 0x9876) + { + puts ("srand48(0x98765432) didn't set correct value"); + printf (" expected: { %04hx, %04hx, %04hx }\n", 0x330e, 0x5432, 0x9876); + printf (" seen: { %04hx, %04hx, %04hx }\n", xsp[0], xsp[1], xsp[2]); + result = 1; + } + /* Put the values back. */ + memcpy (xs, xsp, sizeof (xs)); + (void) seed48 (xs); + + /* See whether the correct values are installed. */ + l = lrand48 (); + if (l != 0x2fed1413l) + { + printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x2fed1413l, l); + result = 1; + } + + l = mrand48 (); + if (l != -0x5d73effdl) + { + printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, -0x5d73effdl, l); + result = 1; + } + + l = lrand48 (); + if (l != 0x585fcfb7l) + { + printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x585fcfb7l, l); + result = 1; + } + + l = mrand48 (); + if (l != -0x61770b8cl) + { + printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, -0x61770b8cl, l); + result = 1; + } + + /* Test seed48. The previous call should have install the values in + the initialization of `xs' above. */ + xs[0] = 0x1234; + xs[1] = 0x5678; + xs[2] = 0x9012; + xsp = seed48 (xs); + if (xsp[0] != 0x62f2 || xsp[1] != 0xf474 || xsp[2] != 0x9e88) + { + puts ("seed48() did not install the values correctly"); + printf (" expected: { %04hx, %04hx, %04hx }\n", 0x62f2, 0xf474, 0x9e88); + printf (" seen: { %04hx, %04hx, %04hx }\n", xsp[0], xsp[1], xsp[2]); + result = 1; + } + + /* Test lrand48 and mrand48. We continue from the seed established + above. */ + l = lrand48 (); + if (l != 0x017e48b5l) + { + printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x017e48b5l, l); + result = 1; + } + + l = mrand48 (); + if (l != -0x1485e05dl) + { + printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, -0x1485e05dl, l); + result = 1; + } + + l = lrand48 (); + if (l != 0x6b6a3f95l) + { + printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x6b6a3f95l, l); + result = 1; + } + + l = mrand48 (); + if (l != 0x175c0d6fl) + { + printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x175c0d6fl, l); + result = 1; + } + + /* Test lcong48. */ + lxs[0] = 0x4567; + lxs[1] = 0x6789; + lxs[2] = 0x8901; + lxs[3] = 0x0123; + lxs[4] = 0x2345; + lxs[5] = 0x1111; + lxs[6] = 0x2222; + lcong48 (lxs); + + /* See whether the correct values are installed. */ + l = lrand48 (); + if (l != 0x6df63d66l) + { + printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x6df63d66l, l); + result = 1; + } + + l = mrand48 (); + if (l != 0x2f92c8e1l) + { + printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x2f92c8e1l, l); + result = 1; + } + + l = lrand48 (); + if (l != 0x3b4869ffl) + { + printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x3b4869ffl, l); + result = 1; + } + + l = mrand48 (); + if (l != 0x5cd4cc3el) + { + printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x5cd4cc3el, l); + result = 1; + } + + /* Check whether srand48() restores the A and C parameters. */ + srand48 (0x98765432); + + /* See whether the correct values are installed. */ + l = lrand48 (); + if (l != 0x2fed1413l) + { + printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x2fed1413l, l); + result = 1; + } + + l = mrand48 (); + if (l != -0x5d73effdl) + { + printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, -0x5d73effdl, l); + result = 1; + } + + l = lrand48 (); + if (l != 0x585fcfb7l) + { + printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x585fcfb7l, l); + result = 1; + } + + l = mrand48 (); + if (l != -0x61770b8cl) + { + printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, -0x61770b8cl, l); + result = 1; + } + + /* And again to see whether seed48() does the same. */ + lcong48 (lxs); + + /* See whether lxs wasn't modified. */ + l = lrand48 (); + if (l != 0x6df63d66l) + { + printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x6df63d66l, l); + result = 1; + } + + /* Test seed48. The previous call should have install the values in + the initialization of `xs' above. */ + xs[0] = 0x1234; + xs[1] = 0x5678; + xs[2] = 0x9012; + xsp = seed48 (xs); + if (xsp[0] != 0x0637 || xsp[1] != 0x7acd || xsp[2] != 0xdbec) + { + puts ("seed48() did not install the values correctly"); + printf (" expected: { %04hx, %04hx, %04hx }\n", 0x0637, 0x7acd, 0xdbec); + printf (" seen: { %04hx, %04hx, %04hx }\n", xsp[0], xsp[1], xsp[2]); + result = 1; + } + + /* Test lrand48 and mrand48. We continue from the seed established + above. */ + l = lrand48 (); + if (l != 0x017e48b5l) + { + printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x017e48b5l, l); + result = 1; + } + + l = mrand48 (); + if (l != -0x1485e05dl) + { + printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, -0x1485e05dl, l); + result = 1; + } + + l = lrand48 (); + if (l != 0x6b6a3f95l) + { + printf ("lrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x6b6a3f95l, l); + result = 1; + } + + l = mrand48 (); + if (l != 0x175c0d6fl) + { + printf ("mrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x175c0d6fl, l); + result = 1; + } + + /* Test drand48. */ + d = drand48 (); + if (d != 0.0908832261858485424) + { + printf ("drand48() in line %d failed: expected %.*g, seen %.*g\n", + __LINE__ - 4, DECIMAL_DIG, 0.0908832261858485424, + DECIMAL_DIG, d); + result = 1; + } + + d = drand48 (); + if (d != 0.943149381730059133133) + { + printf ("drand48() in line %d failed: expected %.*g, seen %.*g\n", + __LINE__ - 4, DECIMAL_DIG, 0.943149381730059133133, + DECIMAL_DIG, d); + result = 1; + } + + /* Now the functions which get the Xis passed. */ + xs[0] = 0x3849; + xs[1] = 0x5061; + xs[2] = 0x7283; + + l = nrand48 (xs); + if (l != 0x1efe61a1l) + { + printf ("nrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x1efe61a1l, l); + result = 1; + } + + l = jrand48 (xs); + if (l != -0xa973860l) + { + printf ("jrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, -0xa973860l, l); + result = 1; + } + + l = nrand48 (xs); + if (l != 0x2a5e57fel) + { + printf ("nrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x2a5e57fel, l); + result = 1; + } + + l = jrand48 (xs); + if (l != 0x71a779a8l) + { + printf ("jrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x71a779a8l, l); + result = 1; + } + + /* Test whether the global A and C are used. */ + lcong48 (lxs); + + l = nrand48 (xs); + if (l != 0x32beee9fl) + { + printf ("nrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x32beee9fl, l); + result = 1; + } + + l = jrand48 (xs); + if (l != 0x7bddf3bal) + { + printf ("jrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x7bddf3bal, l); + result = 1; + } + + l = nrand48 (xs); + if (l != 0x85bdf28l) + { + printf ("nrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x85bdf28l, l); + result = 1; + } + + l = jrand48 (xs); + if (l != 0x7b433e47l) + { + printf ("jrand48() in line %d failed: expected %lx, seen %lx\n", + __LINE__ - 4, 0x7b433e47l, l); + result = 1; + } + + /* Test erand48. Also compare with the drand48 results. */ + (void) seed48 (xs); + + d = drand48 (); + e = erand48 (xs); + if (d != e) + { + printf ("\ +drand48() and erand48 in lines %d and %d produce different results\n", + __LINE__ - 6, __LINE__ - 5); + printf (" drand48() = %g, erand48() = %g\n", d, e); + result = 1; + } + else if (e != 0.640650904452755298735) + { + printf ("erand48() in line %d failed: expected %.*g, seen %.*g\n", + __LINE__ - 4, DECIMAL_DIG, 0.640650904452755298735, + DECIMAL_DIG, e); + result = 1; + + } + + d = drand48 (); + e = erand48 (xs); + if (d != e) + { + printf ("\ +drand48() and erand48 in lines %d and %d produce different results\n", + __LINE__ - 6, __LINE__ - 5); + printf (" drand48() = %g, erand48() = %g\n", d, e); + result = 1; + } + else if (e != 0.115372323508150742555) + { + printf ("erand48() in line %d failed: expected %.*g, seen %.*g\n", + __LINE__ - 4, DECIMAL_DIG, 0.0115372323508150742555, + DECIMAL_DIG, e); + result = 1; + + } + + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-random.c b/REORG.TODO/stdlib/tst-random.c new file mode 100644 index 0000000000..8fe0993dd7 --- /dev/null +++ b/REORG.TODO/stdlib/tst-random.c @@ -0,0 +1,122 @@ +/* Test program for random(), srandom(), initstate(), setstate() + Written by Michael J. Fischer, August 21, 2000 + Placed in the public domain. */ + +/* This program primarily tests the correct functioning of srandom() + and setstate(). The strategy is generate and store a set of random + sequences, each with a specified starting seed. Then each sequence + is regenerated twice and checked against the stored values. + + First they are regenerated one sequence at a time, using srandom() + to set the initial state. A discrepency here would suggest that + srandom() was failing to completely initialize the random number + generator. + + Second the sequences are regenerated in an interleaved order. + A state vector is created for each sequence using initstate(). + setstate() is used to switch from sequence to sequence during + the interleaved generation. A discrepency here would suggest + a problem with either initstate() failing to initialize the + random number generator properly, or the failure of setstate() + to correctly save and restore state information. Also, each + time setstate() is called, the returned value is checked for + correctness (since we know what it should be). + + Note: We use default state vector for sequence 0 and our own + state vectors for the remaining sequences. This is to give a check + that the value returned by initstate() is valid and can indeed be + used in the future. */ + +/* Strategy: + 1. Use srandom() followed by calls on random to generate a set of + sequences of values. + 2. Regenerate and check the sequences. + 3. Use initstate() to create new states. + 4. Regenerate the sequences in an interleaved manner and check. +*/ + +#include <stdlib.h> +#include <stdio.h> + +const int degree = 128; /* random number generator degree (should + be one of 8, 16, 32, 64, 128, 256) */ +const int nseq = 3; /* number of test sequences */ +const int nrnd = 50; /* length of each test sequence */ +const unsigned int seed[3] = { 0x12344321U, 0xEE11DD22U, 0xFEDCBA98 }; + +void fail (const char *msg, int s, int i) __attribute__ ((__noreturn__)); + +static int +do_test (void) +{ + long int rnd[nseq][nrnd]; /* pseudorandom numbers */ + char* state[nseq]; /* state for PRNG */ + char* oldstate[nseq]; /* old PRNG state */ + int s; /* sequence index */ + int i; /* element index */ + + printf ("Begining random package test using %d sequences of length %d.\n", + nseq, nrnd); + + /* 1. Generate and store the sequences. */ + printf ("Generating random sequences.\n"); + for (s = 0; s < nseq; ++s) + { + srandom ( seed[s] ); + for (i = 0; i < nrnd; ++i) + rnd[s][i] = random (); + } + + /* 2. Regenerate and check. */ + printf ("Regenerating and checking sequences.\n"); + for (s = 0; s < nseq; ++s) + { + srandom (seed[s]); + for (i = 0; i < nrnd; ++i) + if (rnd[s][i] != random ()) + fail ("first regenerate test", s, i); + } + + /* 3. Create state vector, one for each sequence. + First state is random's internal state; others are malloced. */ + printf ("Creating and checking state vector for each sequence.\n"); + srandom (seed[0]); /* reseed with first seed */ + for (s = 1; s < nseq; ++s) + { + state[s] = (char*) malloc (degree); + oldstate[s] = initstate (seed[s], state[s], degree); + } + state[0] = oldstate[1]; + + /* Check returned values. */ + for (s = 1; s < nseq - 1; ++s) + if (state[s] != oldstate[s + 1]) + fail ("bad initstate() return value", s, i); + + /* 4. Regenerate sequences interleaved and check. */ + printf ("Regenerating and checking sequences in interleaved order.\n"); + for (i = 0; i < nrnd; ++i) + { + for (s = 0; s < nseq; ++s) + { + char *oldstate = (char *) setstate (state[s]); + if (oldstate != state[(s + nseq - 1) % nseq]) + fail ("bad setstate() return value", s, i); + if (rnd[s][i] != random ()) + fail ("bad value generated in interleave test", s, i); + } + } + printf ("All tests passed!\n"); + return 0; +} + +void +fail (const char *msg, int s, int i) +{ + printf ("\nTest FAILED: "); + printf ("%s (seq %d, pos %d).\n", msg, s, i); + exit (1); +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-random2.c b/REORG.TODO/stdlib/tst-random2.c new file mode 100644 index 0000000000..093e16879c --- /dev/null +++ b/REORG.TODO/stdlib/tst-random2.c @@ -0,0 +1,61 @@ +/* Test initstate saving the old state. + Copyright (C) 2005-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek <jakub@redhat.com>, 2005. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdio.h> +#include <stdlib.h> + +static int +do_test (void) +{ + int pass; + int ret = 0; + long int r[2]; + + for (pass = 0; pass < 2; pass++) + { + srandom (0x12344321); + + int j; + for (j = 0; j < 3; ++j) + random (); + if (pass == 1) + { + char state[128]; + char *ostate = initstate (0x34562101, state, 128); + if (setstate (ostate) != state) + { + puts ("setstate (ostate) != state"); + ret = 1; + } + } + + random (); + r[pass] = random (); + } + + if (r[0] != r[1]) + { + printf ("%ld != %ld\n", r[0], r[1]); + ret = 1; + } + return ret; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-secure-getenv.c b/REORG.TODO/stdlib/tst-secure-getenv.c new file mode 100644 index 0000000000..2705cf9c5b --- /dev/null +++ b/REORG.TODO/stdlib/tst-secure-getenv.c @@ -0,0 +1,242 @@ +/* Copyright (C) 2012-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* Test that secure_getenv works by invoking the test as a SGID + program with a group ID from the supplementary group list. This + test can fail spuriously if the user is not a member of a suitable + supplementary group. */ + +#include <errno.h> +#include <fcntl.h> +#include <stdlib.h> +#include <stdint.h> +#include <stdio.h> +#include <string.h> +#include <sys/stat.h> +#include <sys/wait.h> +#include <unistd.h> + +#include <support/support.h> +#include <support/test-driver.h> + +static char MAGIC_ARGUMENT[] = "run-actual-test"; +#define MAGIC_STATUS 19 + +/* Return a GID which is not our current GID, but is present in the + supplementary group list. */ +static gid_t +choose_gid (void) +{ + const int count = 64; + gid_t groups[count]; + int ret = getgroups (count, groups); + if (ret < 0) + { + printf ("getgroups: %m\n"); + exit (1); + } + gid_t current = getgid (); + for (int i = 0; i < ret; ++i) + { + if (groups[i] != current) + return groups[i]; + } + return 0; +} + + +/* Copies the executable into a restricted directory, so that we can + safely make it SGID with the TARGET group ID. Then runs the + executable. */ +static int +run_executable_sgid (gid_t target) +{ + char *dirname = xasprintf ("%s/secure-getenv.%jd", + test_dir, (intmax_t) getpid ()); + char *execname = xasprintf ("%s/bin", dirname); + int infd = -1; + int outfd = -1; + int ret = -1; + if (mkdir (dirname, 0700) < 0) + { + printf ("mkdir: %m\n"); + goto err; + } + infd = open ("/proc/self/exe", O_RDONLY); + if (infd < 0) + { + printf ("open (/proc/self/exe): %m\n"); + goto err; + } + outfd = open (execname, O_WRONLY | O_CREAT | O_EXCL, 0700); + if (outfd < 0) + { + printf ("open (%s): %m\n", execname); + goto err; + } + char buf[4096]; + for (;;) + { + ssize_t rdcount = read (infd, buf, sizeof (buf)); + if (rdcount < 0) + { + printf ("read: %m\n"); + goto err; + } + if (rdcount == 0) + break; + char *p = buf; + char *end = buf + rdcount; + while (p != end) + { + ssize_t wrcount = write (outfd, buf, end - p); + if (wrcount == 0) + errno = ENOSPC; + if (wrcount <= 0) + { + printf ("write: %m\n"); + goto err; + } + p += wrcount; + } + } + if (fchown (outfd, getuid (), target) < 0) + { + printf ("fchown (%s): %m\n", execname); + goto err; + } + if (fchmod (outfd, 02750) < 0) + { + printf ("fchmod (%s): %m\n", execname); + goto err; + } + if (close (outfd) < 0) + { + printf ("close (outfd): %m\n"); + goto err; + } + if (close (infd) < 0) + { + printf ("close (infd): %m\n"); + goto err; + } + + int kid = fork (); + if (kid < 0) + { + printf ("fork: %m\n"); + goto err; + } + if (kid == 0) + { + /* Child process. */ + char *args[] = { execname, MAGIC_ARGUMENT, NULL }; + execve (execname, args, environ); + printf ("execve (%s): %m\n", execname); + _exit (1); + } + int status; + if (waitpid (kid, &status, 0) < 0) + { + printf ("waitpid: %m\n"); + goto err; + } + if (!WIFEXITED (status) || WEXITSTATUS (status) != MAGIC_STATUS) + { + printf ("Unexpected exit status %d from child process\n", + status); + goto err; + } + ret = 0; + +err: + if (outfd >= 0) + close (outfd); + if (infd >= 0) + close (infd); + if (execname) + { + unlink (execname); + free (execname); + } + if (dirname) + { + rmdir (dirname); + free (dirname); + } + return ret; +} + +static int +do_test (void) +{ + if (getenv ("PATH") == NULL) + { + printf ("PATH not set\n"); + exit (1); + } + if (secure_getenv ("PATH") == NULL) + { + printf ("PATH not set according to secure_getenv\n"); + exit (1); + } + if (strcmp (getenv ("PATH"), secure_getenv ("PATH")) != 0) + { + printf ("PATH mismatch (%s, %s)\n", + getenv ("PATH"), secure_getenv ("PATH")); + exit (1); + } + + gid_t target = choose_gid (); + if (target == 0) + { + fprintf (stderr, + "Could not find a suitable GID for user %jd, skipping test\n", + (intmax_t) getuid ()); + exit (0); + } + return run_executable_sgid (target); +} + +static void +alternative_main (int argc, char **argv) +{ + if (argc == 2 && strcmp (argv[1], MAGIC_ARGUMENT) == 0) + { + if (getgid () == getegid ()) + { + /* This can happen if the file system is mounted nosuid. */ + fprintf (stderr, "SGID failed: GID and EGID match (%jd)\n", + (intmax_t) getgid ()); + exit (MAGIC_STATUS); + } + if (getenv ("PATH") == NULL) + { + printf ("PATH variable not present\n"); + exit (3); + } + if (secure_getenv ("PATH") != NULL) + { + printf ("PATH variable not filtered out\n"); + exit (4); + } + exit (MAGIC_STATUS); + } +} + +#define PREPARE alternative_main +#include <support/test-driver.c> diff --git a/REORG.TODO/stdlib/tst-setcontext.c b/REORG.TODO/stdlib/tst-setcontext.c new file mode 100644 index 0000000000..20b2ff6f3b --- /dev/null +++ b/REORG.TODO/stdlib/tst-setcontext.c @@ -0,0 +1,244 @@ +/* Copyright (C) 2001-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ucontext.h> +#include <unistd.h> + +static ucontext_t ctx[3]; + +static int was_in_f1; +static int was_in_f2; + +static char st2[32768]; + +static void +f1 (int a0, int a1, int a2, int a3) +{ + printf ("start f1(a0=%x,a1=%x,a2=%x,a3=%x)\n", a0, a1, a2, a3); + + if (a0 != 1 || a1 != 2 || a2 != 3 || a3 != -4) + { + puts ("arg mismatch"); + exit (-1); + } + + if (swapcontext (&ctx[1], &ctx[2]) != 0) + { + printf ("%s: swapcontext: %m\n", __FUNCTION__); + exit (1); + } + puts ("finish f1"); + was_in_f1 = 1; +} + +static void +f2 (void) +{ + char on_stack[1]; + + puts ("start f2"); + + printf ("&on_stack=%p\n", on_stack); + if (on_stack < st2 || on_stack >= st2 + sizeof (st2)) + { + printf ("%s: memory stack is not where it belongs!", __FUNCTION__); + exit (1); + } + + if (swapcontext (&ctx[2], &ctx[1]) != 0) + { + printf ("%s: swapcontext: %m\n", __FUNCTION__); + exit (1); + } + puts ("finish f2"); + was_in_f2 = 1; +} + +void +test_stack (volatile int a, volatile int b, + volatile int c, volatile int d) +{ + volatile int e = 5; + volatile int f = 6; + ucontext_t uc; + + /* Test for cases where getcontext is clobbering the callers + stack, including parameters. */ + getcontext (&uc); + + if (a != 1) + { + printf ("%s: getcontext clobbers parm a\n", __FUNCTION__); + exit (1); + } + + if (b != 2) + { + printf ("%s: getcontext clobbers parm b\n", __FUNCTION__); + exit (1); + } + + if (c != 3) + { + printf ("%s: getcontext clobbers parm c\n", __FUNCTION__); + exit (1); + } + + if (d != 4) + { + printf ("%s: getcontext clobbers parm d\n", __FUNCTION__); + exit (1); + } + + if (e != 5) + { + printf ("%s: getcontext clobbers varible e\n", __FUNCTION__); + exit (1); + } + + if (f != 6) + { + printf ("%s: getcontext clobbers variable f\n", __FUNCTION__); + exit (1); + } +} + +volatile int global; + + +static int back_in_main; + + +static void +check_called (void) +{ + if (back_in_main == 0) + { + puts ("program did not reach main again"); + _exit (1); + } +} + + +int +main (void) +{ + atexit (check_called); + + char st1[32768]; + stack_t stack_before, stack_after; + + sigaltstack (NULL, &stack_before); + + puts ("making contexts"); + if (getcontext (&ctx[1]) != 0) + { + if (errno == ENOSYS) + { + back_in_main = 1; + exit (0); + } + + printf ("%s: getcontext: %m\n", __FUNCTION__); + exit (1); + } + + test_stack (1, 2, 3, 4); + + /* Play some tricks with this context. */ + if (++global == 1) + if (setcontext (&ctx[1]) != 0) + { + printf ("%s: setcontext: %m\n", __FUNCTION__); + exit (1); + } + if (global != 2) + { + printf ("%s: 'global' not incremented twice\n", __FUNCTION__); + exit (1); + } + + ctx[1].uc_stack.ss_sp = st1; + ctx[1].uc_stack.ss_size = sizeof st1; + ctx[1].uc_link = &ctx[0]; + { + ucontext_t tempctx = ctx[1]; + makecontext (&ctx[1], (void (*) (void)) f1, 4, 1, 2, 3, -4); + + /* Without this check, a stub makecontext can make us spin forever. */ + if (memcmp (&tempctx, &ctx[1], sizeof ctx[1]) == 0) + { + puts ("makecontext was a no-op, presuming not implemented"); + return 0; + } + } + + if (getcontext (&ctx[2]) != 0) + { + printf ("%s: second getcontext: %m\n", __FUNCTION__); + exit (1); + } + ctx[2].uc_stack.ss_sp = st2; + ctx[2].uc_stack.ss_size = sizeof st2; + ctx[2].uc_link = &ctx[1]; + makecontext (&ctx[2], f2, 0); + + puts ("swapping contexts"); + if (swapcontext (&ctx[0], &ctx[2]) != 0) + { + printf ("%s: swapcontext: %m\n", __FUNCTION__); + exit (1); + } + puts ("back at main program"); + back_in_main = 1; + + sigaltstack (NULL, &stack_after); + + if (was_in_f1 == 0) + { + puts ("didn't reach f1"); + exit (1); + } + if (was_in_f2 == 0) + { + puts ("didn't reach f2"); + exit (1); + } + + /* Check sigaltstack state is not clobbered as in BZ #16629. */ + if (stack_before.ss_sp != stack_after.ss_sp) + { + printf ("stack ss_sp mismatch: %p %p\n", + stack_before.ss_sp, stack_after.ss_sp); + exit (1); + } + + if (stack_before.ss_size != stack_after.ss_size) + { + printf ("stack ss_size mismatch: %zd %zd\n", + stack_before.ss_size, stack_after.ss_size); + exit (1); + } + + puts ("test succeeded"); + return 0; +} diff --git a/REORG.TODO/stdlib/tst-setcontext2.c b/REORG.TODO/stdlib/tst-setcontext2.c new file mode 100644 index 0000000000..07fb974c46 --- /dev/null +++ b/REORG.TODO/stdlib/tst-setcontext2.c @@ -0,0 +1,230 @@ +/* Testcase checks, if setcontext(), swapcontext() restores signal-mask + and if pending signals are delivered after those calls. + Copyright (C) 2015-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdio.h> +#include <stdlib.h> +#include <sys/types.h> +#include <signal.h> +#include <ucontext.h> +#include <unistd.h> + +volatile int global; +volatile sig_atomic_t handlerCalled; + +static void +check (const char *funcName) +{ + sigset_t set; + + /* check if SIGUSR2 is unblocked after setcontext-call. */ + sigprocmask (SIG_BLOCK, NULL, &set); + + if (sigismember (&set, SIGUSR2) != 0) + { + printf ("FAIL: SIGUSR2 is blocked after %s.\n", funcName); + exit (1); + } + + if (sigismember (&set, SIGUSR1) != 1) + { + printf ("FAIL: SIGUSR1 is not blocked after %s.\n", funcName); + exit (1); + } +} + +static void +signalmask (int how, int signum) +{ + sigset_t set; + sigemptyset (&set); + sigaddset (&set, signum); + if (sigprocmask (how, &set, NULL) != 0) + { + printf ("FAIL: sigprocmaks (%d, %d, NULL): %m\n", how, signum); + exit (1); + } +} + +static void +signalpending (int signum, const char *msg) +{ + sigset_t set; + sigemptyset (&set); + if (sigpending (&set) != 0) + { + printf ("FAIL: sigpending: %m\n"); + exit (1); + } + if (sigismember (&set, SIGUSR2) != 1) + { + printf ("FAIL: Signal %d is not pending %s\n", signum, msg); + exit (1); + } +} + +static void +handler (int __attribute__ ((unused)) signum) +{ + handlerCalled ++; +} + +static int +do_test (void) +{ + ucontext_t ctx, oldctx; + struct sigaction action; + pid_t pid; + + pid = getpid (); + + /* unblock SIGUSR2 */ + signalmask (SIG_UNBLOCK, SIGUSR2); + + /* block SIGUSR1 */ + signalmask (SIG_BLOCK, SIGUSR1); + + /* register handler for SIGUSR2 */ + action.sa_flags = 0; + action.sa_handler = handler; + sigemptyset (&action.sa_mask); + sigaction (SIGUSR2, &action, NULL); + + if (getcontext (&ctx) != 0) + { + printf ("FAIL: getcontext: %m\n"); + exit (1); + } + + global++; + + if (global == 1) + { + puts ("after getcontext"); + + /* block SIGUSR2 */ + signalmask (SIG_BLOCK, SIGUSR2); + + /* send SIGUSR2 to me */ + handlerCalled = 0; + kill (pid, SIGUSR2); + + /* was SIGUSR2 handler called? */ + if (handlerCalled != 0) + { + puts ("FAIL: signal handler was called, but signal was blocked."); + exit (1); + } + + /* is SIGUSR2 pending? */ + signalpending (SIGUSR2, "before setcontext"); + + /* SIGUSR2 will be unblocked by setcontext-call. */ + if (setcontext (&ctx) != 0) + { + printf ("FAIL: setcontext: %m\n"); + exit (1); + } + } + else if (global == 2) + { + puts ("after setcontext"); + + /* check SIGUSR1/2 */ + check ("setcontext"); + + /* was SIGUSR2 handler called? */ + if (handlerCalled != 1) + { + puts ("FAIL: signal handler was not called after setcontext."); + exit (1); + } + + /* block SIGUSR2 */ + signalmask (SIG_BLOCK, SIGUSR2); + + /* send SIGUSR2 to me */ + handlerCalled = 0; + kill (pid, SIGUSR2); + + /* was SIGUSR2 handler called? */ + if (handlerCalled != 0) + { + puts ("FAIL: signal handler was called, but signal was blocked."); + exit (1); + } + + /* is SIGUSR2 pending? */ + signalpending (SIGUSR2, "before swapcontext"); + + if (swapcontext (&oldctx, &ctx) != 0) + { + printf ("FAIL: swapcontext: %m\n"); + exit (1); + } + + puts ("after returned from swapcontext"); + + if (global != 3) + { + puts ("FAIL: returned from swapcontext without ctx-context called."); + exit (1); + } + + puts ("test succeeded"); + return 0; + } + else if ( global != 3 ) + { + puts ("FAIL: 'global' not incremented three times"); + exit (1); + } + + puts ("after swapcontext"); + /* check SIGUSR1/2 */ + check ("swapcontext"); + + /* was SIGUSR2 handler called? */ + if (handlerCalled != 1) + { + puts ("FAIL: signal handler was not called after swapcontext."); + exit (1); + } + + /* check sigmask in old context of swapcontext-call */ + if (sigismember (&oldctx.uc_sigmask, SIGUSR2) != 1) + { + puts ("FAIL: SIGUSR2 is not blocked in oldctx.uc_sigmask."); + exit (1); + } + + if (sigismember (&oldctx.uc_sigmask, SIGUSR1) != 1) + { + puts ("FAIL: SIGUSR1 is not blocked in oldctx.uc_sigmaks."); + exit (1); + } + + /* change to old context, which was gathered by swapcontext() call. */ + setcontext (&oldctx); + + puts ("FAIL: returned from setcontext (&oldctx)"); + exit (1); +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-setcontext3.c b/REORG.TODO/stdlib/tst-setcontext3.c new file mode 100644 index 0000000000..414a9a7f41 --- /dev/null +++ b/REORG.TODO/stdlib/tst-setcontext3.c @@ -0,0 +1,138 @@ +/* Bug 18125: Verify setcontext calls exit() and not _exit(). + Copyright (C) 2015-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <ucontext.h> +#include <unistd.h> +#include <limits.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> + +/* Please note that depending on the outcome of Bug 18135 this test + may become invalid, and instead of testing for calling exit it + should be reworked to test for the last context calling + pthread_exit(). */ + +static ucontext_t ctx; +static char *filename; + +/* It is intended that this function does nothing. */ +static void +cf (void) +{ + printf ("called context function\n"); +} + +static void +exit_called (void) +{ + int fd; + ssize_t res; + const char buf[] = "Called exit function\n"; + + fd = open (filename, O_WRONLY | O_CREAT, S_IRUSR | S_IWUSR); + if (fd == -1) + { + printf ("FAIL: Unable to create test file %s\n", filename); + exit (1); + } + res = write (fd, buf, sizeof (buf)); + if (res != sizeof (buf)) + { + printf ("FAIL: Expected to write test file in one write call.\n"); + exit (1); + } + res = close (fd); + if (res == -1) + { + printf ("FAIL: Failed to close test file.\n"); + exit (1); + } + printf ("PASS: %s", buf); +} + +/* The test expects a filename given by the wrapper calling script. + The test then registers an atexit handler that will create the + file to indicate that the atexit handler ran. Then the test + creates a context, modifies it with makecontext, and sets it. + The context has only a single context which then must exit. + If it incorrectly exits via _exit then the atexit handler is + not run, the file is not created, and the wrapper detects this + and fails the test. This test cannot be done using an _exit + interposer since setcontext avoids the PLT and calls _exit + directly. */ +static int +do_test (int argc, char **argv) +{ + int ret; + char st1[32768]; + ucontext_t tempctx = ctx; + + if (argc < 2) + { + printf ("FAIL: Test missing filename argument.\n"); + exit (1); + } + + filename = argv[1]; + + atexit (exit_called); + + puts ("making contexts"); + if (getcontext (&ctx) != 0) + { + if (errno == ENOSYS) + { + /* Exit with 77 to mark the test as UNSUPPORTED. */ + printf ("UNSUPPORTED: getcontext not implemented.\n"); + exit (77); + } + + printf ("FAIL: getcontext failed.\n"); + exit (1); + } + + ctx.uc_stack.ss_sp = st1; + ctx.uc_stack.ss_size = sizeof (st1); + ctx.uc_link = 0; + makecontext (&ctx, cf, 0); + + /* Without this check, a stub makecontext can make us spin forever. */ + if (memcmp (&tempctx, &ctx, sizeof ctx) == 0) + { + puts ("UNSUPPORTED: makecontext was a no-op, presuming not implemented"); + exit (77); + } + + ret = setcontext (&ctx); + if (ret != 0) + { + printf ("FAIL: setcontext returned with %d and errno of %d.\n", ret, errno); + exit (1); + } + + printf ("FAIL: Impossibly returned to main.\n"); + exit (1); +} + +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-setcontext3.sh b/REORG.TODO/stdlib/tst-setcontext3.sh new file mode 100644 index 0000000000..158d0dc0a8 --- /dev/null +++ b/REORG.TODO/stdlib/tst-setcontext3.sh @@ -0,0 +1,52 @@ +#!/bin/sh +# Bug 18125: Test the exit functionality of setcontext(). +# Copyright (C) 2015-2017 Free Software Foundation, Inc. +# This file is part of the GNU C Library. + +# The GNU C Library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. + +# The GNU C Library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. + +# You should have received a copy of the GNU Lesser General Public +# License along with the GNU C Library; if not, see +# <http://www.gnu.org/licenses/>. + +set -e + +common_objpfx=$1 +test_program_prefix_before_env=$2 +run_program_env=$3 +test_program_prefix_after_env=$4 +objpfx=$5 + +test_pre="${test_program_prefix_before_env} ${run_program_env}" +test="${test_program_prefix_after_env} ${objpfx}tst-setcontext3" +out=${objpfx}tst-setcontext3.out + +cleanup() { + rm -f $tempfile +} +trap cleanup 0 + +tempfile=$(mktemp "tst-setcontext3.XXXXXXXXXX") + +# We want to run the test program and see if secontext called +# exit() and wrote out the test file we specified. If the +# test exits with a non-zero status this will fail because we +# are using `set -e`. +$test_pre $test "$tempfile" + +# Look for resulting file. +if [ -e "$tempfile" ]; then + echo "PASS: tst-setcontext3 an exit() and created $tempfile" + exit 0 +else + echo "FAIL: tst-setcontext3 did not create $tempfile" + exit 1 +fi diff --git a/REORG.TODO/stdlib/tst-strfmon_l.c b/REORG.TODO/stdlib/tst-strfmon_l.c new file mode 100644 index 0000000000..49fa31907e --- /dev/null +++ b/REORG.TODO/stdlib/tst-strfmon_l.c @@ -0,0 +1,220 @@ +/* Test locale dependence of strfmon_l. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdbool.h> +#include <stdio.h> +#include <monetary.h> +#include <string.h> +#include <stdlib.h> +#include <locale.h> + +static const char *const en_us_name = "en_US.ISO-8859-1"; + +/* Locale value to be used by tests. */ +static locale_t loc; +static const char *loc_name; + +/* Set the global locale to GLOBAL_NAME, and the locale referenced by + the loc variable above to LOCAL_NAME. */ +static void +init_loc (const char *global_name, const char *local_name) +{ + loc = newlocale (LC_ALL_MASK, local_name, 0); + if (loc == 0) + { + printf ("error: newlocale (%s): %m\n", local_name); + abort (); + } + loc_name = local_name; + + if (setlocale (LC_ALL, global_name) == NULL) + { + printf ("error: setlocale (%s): %m\n", global_name); + abort (); + } +} + +/* Expected strings for a positive or negative value. */ +struct testcase +{ + const char *i; /* %i */ + const char *n; /* %n */ + const char *i_ungrouped; /* %^i */ + const char *n_ungrouped; /* %^n */ +}; + +/* Collected expected strings for both positive and negative + values. */ +struct testcase_pair +{ + struct testcase positive; /* 1234567.89 */ + struct testcase negative; /* -1234567.89 */ +}; + +static bool errors; + +/* Test one value using the locale loc. */ +static void +test_one (const char *format, double value, const char *expected) +{ + static char actual[64]; + int result = strfmon_l (actual, sizeof (actual), loc, format, value); + if (result < 0) + { + printf ("error: locale %s, format \"%s\", value %g: strfmon_l: %m\n", + loc_name, format, value); + errors = true; + } + else if (strcmp (actual, expected) != 0) + { + printf ("error: locale %s, format \"%s\", value %g: mismatch\n", + loc_name, format, value); + printf ("error: expected: \"%s\"\n", expected); + printf ("error: actual: \"%s\"\n", actual); + errors = true; + } +} + +static void +test_pair (const struct testcase_pair *pair) +{ + double positive = 1234567.89; + test_one ("%i", positive, pair->positive.i); + test_one ("%n", positive, pair->positive.n); + test_one ("%^i", positive, pair->positive.i_ungrouped); + test_one ("%^n", positive, pair->positive.n_ungrouped); + double negative = -1234567.89; + test_one ("%i", negative, pair->negative.i); + test_one ("%n", negative, pair->negative.n); + test_one ("%^i", negative, pair->negative.i_ungrouped); + test_one ("%^n", negative, pair->negative.n_ungrouped); +} + +static const struct testcase_pair en_us = + { + { + "USD 1,234,567.89", "$1,234,567.89", + "USD 1234567.89", "$1234567.89" + }, + { + "-USD 1,234,567.89", "-$1,234,567.89", + "-USD 1234567.89", "-$1234567.89" + } + }; + +static void +test_en_us (const char *other_name) +{ + init_loc (other_name, en_us_name); + test_pair (&en_us); + freelocale (loc); +} + +struct locale_pair +{ + const char *locale_name; + struct testcase_pair pair; +}; + +static const struct locale_pair tests[] = + { + { + "de_DE.UTF-8", + { + { + "1.234.567,89 EUR", "1.234.567,89 \u20ac", + "1234567,89 EUR", "1234567,89 \u20ac" + }, + { + "-1.234.567,89 EUR", "-1.234.567,89 \u20ac", + "-1234567,89 EUR", "-1234567,89 \u20ac" + } + }, + }, + { + "tg_TJ.UTF-8", + { + { + "1 234 567.89 TJS", "1 234 567.89 \u0440\u0443\u0431", + "1234567.89 TJS", "1234567.89 \u0440\u0443\u0431" + }, + { + "-1 234 567.89 TJS", "-1 234 567.89 \u0440\u0443\u0431", + "-1234567.89 TJS", "-1234567.89 \u0440\u0443\u0431" + } + } + }, + { + "te_IN.UTF-8", + { + { + "INR12,34,567.89", "\u20b912,34,567.89", + "INR1234567.89", "\u20b91234567.89" + }, + { + "-INR12,34,567.89", "-\u20b912,34,567.89", + "-INR1234567.89", "-\u20b91234567.89" + } + } + }, + { + "bn_IN.UTF-8", + { + { + "INR 12,345,67.89", "\u20b9 12,345,67.89", + "INR 1234567.89", "\u20b9 1234567.89" + }, + { + "-INR 12,345,67.89", "-\u20b9 12,345,67.89", + "-INR 1234567.89", "-\u20b9 1234567.89" + } + } + }, + { + "el_GR.UTF-8", + { + { + "1.234.567,89EUR", "1.234.567,89\u20ac", + "1234567,89EUR", "1234567,89\u20ac" + }, + { + "-EUR1.234.567,89", "-\u20ac1.234.567,89", + "-EUR1234567,89", "-\u20ac1234567,89", + } + } + }, + {} + }; + +static int +do_test (void) +{ + for (const struct locale_pair *test = tests; + test->locale_name != NULL; ++test) + { + init_loc (en_us_name, test->locale_name); + test_pair (&test->pair); + freelocale (loc); + test_en_us (test->locale_name); + } + + return errors; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-strfrom-locale.c b/REORG.TODO/stdlib/tst-strfrom-locale.c new file mode 100644 index 0000000000..f01b42d575 --- /dev/null +++ b/REORG.TODO/stdlib/tst-strfrom-locale.c @@ -0,0 +1,91 @@ +/* Tests for strfromf, strfromd, strfroml functions. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include "tst-strfrom.h" + +static const struct test tests[] = { + TEST ("12,345000", "%f", 50, 9, 12.345), + TEST ("9,999", "%.3f", 50, 5, 9.999), + TEST ("0,125000", "%f", 50, 8, .125), + TEST ("0,000000", "%f", 50, 8, .0), + TEST ("0", "%g", 50, 1, .0), + TEST ("9,900000", "%f", 50, 8, 9.9), + TEST ("9,1", "%.5f", 4, 7, 9.123456), + TEST ("9,91235", "%g", 50, 7, 9.91234567812345678), + TEST ("79,8765", "%G", 50, 7, 79.8765432111), + TEST ("79,9", "%.3g", 50, 4, 79.8765432111), + TEST ("1,000000e+38", "%e", 50, 12, 1e+38), + TEST ("1,000000e+38", "%e", 50, 12, 1e38), + TEST ("-1,000000e-37", "%e", 50, 13, -1e-37), + TEST ("1,000000e-37", "%e", 50, 12, 0.00000001e-29), + TEST ("1,000000e-37", "%e", 50, 12, 1.000000e-37), + TEST ("5,900000e-16", "%e", 50, 12, 5.9e-16), + TEST ("1,234500e+20", "%e", 50, 12, 12.345e19), + TEST ("1,000000e+05", "%e", 50, 12, 1e5), + TEST ("-NAN", "%G", 50, 4, -NAN_), + TEST ("-inf", "%g", 50, 4, -INF), + TEST ("inf", "%g", 50, 3, INF) +}; +/* Tests with buffer size small. */ +static const struct test stest[] = { + TEST ("1234", "%g", 5, 7, 12345.345), + TEST ("0,12", "%f", 5, 8, .125), + TEST ("9,99", "%.3f", 5, 5, 9.999), + TEST ("100", "%g", 5, 3, 1e2) +}; +/* Hexadecimal tests. */ +static const struct htests htest[] = { + HTEST ("%a", { "0x1,ffp+6", "0x3,fep+5", "0x7,fcp+4", "0xf,f8p+3" }, + 0x1.ffp+6), + HTEST ("%a", { "0x1,88p+4", "0x3,1p+3", "0x6,2p+2", "0xc,4p+1" }, + 0x1.88p+4), + HTEST ("%A", { "-0X1,88P+5", "-0X3,1P+4", "-0X6,2P+3", "-0XC,4P+2" }, + -0x1.88p+5), + HTEST ("%a", { "0x1,44p+10", "0x2,88p+9", "0x5,1p+8", "0xa,2p+7" }, + 0x1.44p+10), + HTEST ("%a", { "0x1p-10", "0x2p-11", "0x4p-12", "0x8p-13" }, + 0x0.0040p+0), + HTEST ("%a", { "0x1,4p+3", "0x2,8p+2", "0x5p+1", "0xap+0" }, + 10.0) +}; + +GEN_TEST_STRTOD_FOREACH (TEST_STRFROM) + +static int +test_locale (const char *locale) +{ + printf ("Testing in locale: %s\n", locale); + if (setlocale (LC_ALL, locale) == NULL) + { + printf ("Cannot set locale %s\n", locale); + } + return STRTOD_TEST_FOREACH (test_); +} + +static int +do_test (void) +{ + int result = 0; + result += test_locale ("de_DE.UTF-8"); + result += test_locale ("tr_TR.ISO-8859-9"); + result += test_locale ("tr_TR.UTF-8"); + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-strfrom.c b/REORG.TODO/stdlib/tst-strfrom.c new file mode 100644 index 0000000000..5aa54fa7cb --- /dev/null +++ b/REORG.TODO/stdlib/tst-strfrom.c @@ -0,0 +1,91 @@ +/* Tests for strfromf, strfromd, strfroml functions. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include "tst-strfrom.h" + +static const struct test tests[] = { + TEST ("12.345000", "%f", 50, 9, 12.345), + TEST ("9.999", "%.3f", 50, 5, 9.999), + TEST ("0.125000", "%f", 50, 8, .125), + TEST ("0.000000", "%f", 50, 8, .0), + TEST ("0", "%g", 50, 1, .0), + TEST ("9.900000", "%f", 50, 8, 9.9), + TEST ("9.1", "%.5f", 4, 7, 9.123456), + TEST ("9.91235", "%g", 50, 7, 9.91234567812345678), + TEST ("79.8765", "%G", 50, 7, 79.8765432111), + TEST ("79.9", "%.3g", 50, 4, 79.8765432111), + TEST ("1.000000e+38", "%e", 50, 12, 1e+38), + TEST ("1.000000e+38", "%e", 50, 12, 1e38), + TEST ("-1.000000e-37", "%e", 50, 13, -1e-37), + TEST ("1.000000e-37", "%e", 50, 12, 0.00000001e-29), + TEST ("1.000000e-37", "%e", 50, 12, 1.000000e-37), + TEST ("5.900000e-16", "%e", 50, 12, 5.9e-16), + TEST ("1.234500e+20", "%e", 50, 12, 12.345e19), + TEST ("1.000000e+05", "%e", 50, 12, 1e5), + TEST ("-NAN", "%G", 50, 4, -NAN_), + TEST ("-inf", "%g", 50, 4, -INF), + TEST ("inf", "%g", 50, 3, INF) +}; +/* Tests with buffer size small. */ +static const struct test stest[] = { + TEST ("1234", "%g", 5, 7, 12345.345), + TEST ("0.12", "%f", 5, 8, .125), + TEST ("9.99", "%.3f", 5, 5, 9.999), + TEST ("100", "%g", 5, 3, 1e2) +}; +/* Hexadecimal tests. */ +static const struct htests htest[] = { + HTEST ("%a", { "0x1.ffp+6", "0x3.fep+5", "0x7.fcp+4", "0xf.f8p+3" }, + 0x1.ffp+6), + HTEST ("%a", { "0x1.88p+4", "0x3.1p+3", "0x6.2p+2", "0xc.4p+1" }, + 0x1.88p+4), + HTEST ("%A", { "-0X1.88P+5", "-0X3.1P+4", "-0X6.2P+3", "-0XC.4P+2" }, + -0x1.88p+5), + HTEST ("%a", { "0x1.44p+10", "0x2.88p+9", "0x5.1p+8", "0xa.2p+7" }, + 0x1.44p+10), + HTEST ("%a", { "0x1p-10", "0x2p-11", "0x4p-12", "0x8p-13" }, + 0x0.0040p+0), + HTEST ("%a", { "0x1.4p+3", "0x2.8p+2", "0x5p+1", "0xap+0" }, + 10.0) +}; + +GEN_TEST_STRTOD_FOREACH (TEST_STRFROM) + +static int +test_locale (const char *locale) +{ + printf ("Testing in locale: %s\n", locale); + if (setlocale (LC_ALL, locale) == NULL) + { + printf ("Cannot set locale %s\n", locale); + } + return STRTOD_TEST_FOREACH (test_); +} + +static int +do_test (void) +{ + int result = 0; + result += test_locale ("C"); + result += test_locale ("en_US.ISO-8859-1"); + result += test_locale ("en_US.UTF-8"); + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-strfrom.h b/REORG.TODO/stdlib/tst-strfrom.h new file mode 100644 index 0000000000..86c0c19392 --- /dev/null +++ b/REORG.TODO/stdlib/tst-strfrom.h @@ -0,0 +1,120 @@ +/* Tests for strfromf, strfromd, strfroml functions. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <float.h> +#include <math.h> +#include <locale.h> + +#include "tst-strtod.h" + +#define _CONCAT(a, b) a ## b +#define CONCAT(a, b) _CONCAT (a, b) + +/* Generator to create an FTYPE member variabled named FSUF + * used to populate struct member variables. */ +#define FTYPE_MEMBER(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ + FTYPE FSUF; + +#define STRUCT_FOREACH_FLOAT_FTYPE GEN_TEST_STRTOD_FOREACH (FTYPE_MEMBER) + +#define ENTRY(FSUF, FTYPE, FTOSTR, LSUF, CSUF, ...) \ + CONCAT (__VA_ARGS__, LSUF), +/* This is hacky way around the seemingly unavoidable macro + * expansion of the INFINITY or HUGE_VAL like macros in the + * above. It is assumed the compiler will implicitly convert + * the infinity correctly. */ +#define INF INFINITY + 0.0 +#define NAN_ NAN + 0.0 + +struct test_input +{ + STRUCT_FOREACH_FLOAT_FTYPE +}; +struct test { + const char *s; + const char *fmt; + int size; + int rc; + struct test_input t; +}; +#define TEST(s, fmt, size, rc, val) \ + { \ + s, fmt, size, rc, { GEN_TEST_STRTOD_FOREACH (ENTRY, val) } \ + } +/* Hexadecimal tests. */ +struct htests +{ + const char *fmt; + const char *exp[4]; + struct test_input t; +}; +#define HTEST(fmt, exp1, exp2, exp3, exp4, val) \ + { \ + fmt, exp1, exp2, exp3, exp4, { GEN_TEST_STRTOD_FOREACH (ENTRY, val) } \ + } + +#define TEST_STRFROM(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ +static int \ +test_ ## FSUF (void) \ +{ \ + char buf[50], sbuf[5]; \ + int status = 0; \ + int i, rc = 0, rc1 = 0; \ + for (i = 0; i < sizeof (stest) / sizeof (stest[0]); i++) \ + { \ + rc = FTOSTR (sbuf, stest[i].size, stest[i].fmt, stest[i].t.FSUF); \ + rc1 = (strcmp (sbuf, stest[i].s) != 0) || (rc != stest[i].rc); \ + if (rc1) \ + { \ + printf (#FTOSTR ": got %s (%d), expected %s (%d)\n", \ + sbuf, rc, stest[i].s, stest[i].rc); \ + status++; \ + } \ + } \ + for (i = 0; i < sizeof (tests) / sizeof (tests[0]); i++) \ + { \ + rc = FTOSTR (buf, tests[i].size, tests[i].fmt, tests[i].t.FSUF); \ + rc1 = (strcmp (buf, tests[i].s) != 0) || (rc != tests[i].rc); \ + if (rc1) \ + { \ + printf (#FTOSTR ": got %s (%d), expected %s (%d)\n", \ + buf, rc, tests[i].s, tests[i].rc); \ + status++; \ + } \ + } \ + for (i = 0; i < sizeof (htest) / sizeof (htest[0]); i++) \ + { \ + rc = FTOSTR (buf, 50, htest[i].fmt, htest[i].t.FSUF); \ + if (strcmp (buf, htest[i].exp[0]) == 0 || \ + strcmp (buf, htest[i].exp[1]) == 0 || \ + strcmp (buf, htest[i].exp[2]) == 0 || \ + strcmp (buf, htest[i].exp[3]) == 0) \ + continue; \ + else \ + { \ + printf (#FTOSTR ": got %s (%d), expected %s or %s or %s " \ + "or %s\n", buf, rc, htest[i].exp[0], htest[i].exp[1], \ + htest[i].exp[2], htest[i].exp[3]); \ + status++; \ + } \ + } \ + return status; \ +} diff --git a/REORG.TODO/stdlib/tst-strtod-nan-locale-main.c b/REORG.TODO/stdlib/tst-strtod-nan-locale-main.c new file mode 100644 index 0000000000..8044dad89f --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod-nan-locale-main.c @@ -0,0 +1,89 @@ +/* Test strtod functions work with all ASCII letters in NAN(...) in + Turkish locales (bug 19266). + Copyright (C) 2015-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <locale.h> +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <wchar.h> + +#define STR_(X) #X +#define STR(X) STR_(X) +#define FNPFXS STR (FNPFX) +#define CONCAT_(X, Y) X ## Y +#define CONCAT(X, Y) CONCAT_ (X, Y) +#define FNX(FN) CONCAT (FNPFX, FN) + +#define TEST(LOC, STR, FN, TYPE) \ + do \ + { \ + CHAR *ep; \ + TYPE val = FNX (FN) (STR, &ep); \ + if (isnan (val) && *ep == 0) \ + printf ("PASS: %s: " FNPFXS #FN " (" SFMT ")\n", LOC, STR); \ + else \ + { \ + printf ("FAIL: %s: " FNPFXS #FN " (" SFMT ")\n", LOC, STR); \ + result = 1; \ + } \ + } \ + while (0) + +static int +test_one_locale (const char *loc) +{ + if (setlocale (LC_ALL, loc) == NULL) + { + printf ("setlocale (LC_ALL, \"%s\") failed\n", loc); + return 1; + } + int result = 0; + for (int i = 10; i < 36; i++) + { + CHAR s[7]; + s[0] = L_('N'); + s[1] = L_('A'); + s[2] = L_('N'); + s[3] = L_('('); + s[4] = L_('A') + i - 10; + s[5] = L_(')'); + s[6] = 0; + TEST (loc, s, f, float); + TEST (loc, s, d, double); + TEST (loc, s, ld, long double); + s[4] = L_('a') + i - 10; + TEST (loc, s, f, float); + TEST (loc, s, d, double); + TEST (loc, s, ld, long double); + } + return result; +} + +static int +do_test (void) +{ + int result = 0; + result |= test_one_locale ("C"); + result |= test_one_locale ("tr_TR.UTF-8"); + result |= test_one_locale ("tr_TR.ISO-8859-9"); + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-strtod-nan-locale.c b/REORG.TODO/stdlib/tst-strtod-nan-locale.c new file mode 100644 index 0000000000..cf0820df75 --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod-nan-locale.c @@ -0,0 +1,25 @@ +/* Test strtod functions work with all ASCII letters in NAN(...) in + Turkish locales (bug 19266). Narrow string version. + Copyright (C) 2015-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define CHAR char +#define SFMT "\"%s\"" +#define FNPFX strto +#define L_(C) C + +#include <tst-strtod-nan-locale-main.c> diff --git a/REORG.TODO/stdlib/tst-strtod-overflow.c b/REORG.TODO/stdlib/tst-strtod-overflow.c new file mode 100644 index 0000000000..c1eb561dec --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod-overflow.c @@ -0,0 +1,49 @@ +/* Test for integer/buffer overflow in strtod. + Copyright (C) 2012-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#define EXPONENT "e-2147483649" +#define SIZE 214748364 + +static int +do_test (void) +{ + char *p = malloc (1 + SIZE + sizeof (EXPONENT)); + if (p == NULL) + { + puts ("malloc failed, cannot test for overflow"); + return 0; + } + p[0] = '1'; + memset (p + 1, '0', SIZE); + memcpy (p + 1 + SIZE, EXPONENT, sizeof (EXPONENT)); + double d = strtod (p, NULL); + if (d != 0) + { + printf ("strtod returned wrong value: %a\n", d); + return 1; + } + return 0; +} + +#define TEST_FUNCTION do_test () +#define TIMEOUT 30 +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-strtod-round-data b/REORG.TODO/stdlib/tst-strtod-round-data new file mode 100644 index 0000000000..cb908036fd --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod-round-data @@ -0,0 +1,150 @@ +3.518437208883201171875E+013 +1.00000005960464477550 +1.0000000596046447755 +1.000000059604644776 +1.000000059604644775 +1.00000005960464478 +1.0000000596046448 +1.000000059604645 +1.00000005960464 +1.0000000596046 +1.000000059605 +1.00000005960 +1.0000000596 +1.000000060 +1.00000006 +1.0000001 +1.000000 +1.00000000000000011113 +1.00000000000000011103 +1.00000000000000011102 +1.00000000000000011101 +1.0000000000000001111 +1.000000000000000111 +1.00000000000000011 +1.0000000000000001 +3929201589819414e-25 +0.000000000000000000000000000000000000000000002101947696487225606385594374934874196920392912814773657635602425834686624028790902229957282543182373046875 +1.00000005960464477539062499 +1.000000059604644775390625 +1.00000005960464477539062501 +1.00000011920928955078125 +1.00000017881393432617187499 +1.000000178813934326171875 +1.00000017881393432617187501 +1.0000002384185791015625 +1.08420217248550443400745280086994171142578125e-19 +1.0842022371089897897127399001987457793916291848290711641311645507812499e-19 +1.08420223710898978971273990019874577939162918482907116413116455078125e-19 +1.0842022371089897897127399001987457793916291848290711641311645507812501e-19 +1.0842023017324751454180269995275498473574771196581423282623291015625e-19 +1.0842023663559605011233140988563539153233250544872134923934936523437499e-19 +1.08420236635596050112331409885635391532332505448721349239349365234375e-19 +1.0842023663559605011233140988563539153233250544872134923934936523437501e-19 +1.084202430979445856828601198185157983289172989316284656524658203125e-19 +7.52316384526264005099991383822237233803945956334136013765601092018187046051025390625e-37 +7.5231642936781486349413765338158389908126215730251815381410578824437213052434003657253924757242202758789062499e-37 +7.52316429367814863494137653381583899081262157302518153814105788244372130524340036572539247572422027587890625e-37 +7.5231642936781486349413765338158389908126215730251815381410578824437213052434003657253924757242202758789062501e-37 +7.5231647420936572188828392294093056435857835827090029386261048447055721499765468252007849514484405517578125e-37 +7.5231651905091658028243019250027722963589455923928243391111518069674229947096932846761774271726608276367187499e-37 +7.52316519050916580282430192500277229635894559239282433911115180696742299470969328467617742717266082763671875e-37 +7.5231651905091658028243019250027722963589455923928243391111518069674229947096932846761774271726608276367187501e-37 +7.523165638924674386765764620596238949132107602076645739596198769229273839442839744151569902896881103515625e-37 +340282356779733661637539395458142568447.999 +340282356779733661637539395458142568448 +340282356779733661637539395458142568448.001 +-340282356779733661637539395458142568447.999 +-340282356779733661637539395458142568448 +-340282356779733661637539395458142568448.001 +179769313486231580793728971405303415079934132710037826936173778980444968292764750946649017977587207096330286416692887910946555547851940402630657488671505820681908902000708383676273854845817711531764475730270069855571366959622842914819860834936475292719074168444365510704342711559699508093042880177904174497791.999 +179769313486231580793728971405303415079934132710037826936173778980444968292764750946649017977587207096330286416692887910946555547851940402630657488671505820681908902000708383676273854845817711531764475730270069855571366959622842914819860834936475292719074168444365510704342711559699508093042880177904174497792 +179769313486231580793728971405303415079934132710037826936173778980444968292764750946649017977587207096330286416692887910946555547851940402630657488671505820681908902000708383676273854845817711531764475730270069855571366959622842914819860834936475292719074168444365510704342711559699508093042880177904174497792.001 +-179769313486231580793728971405303415079934132710037826936173778980444968292764750946649017977587207096330286416692887910946555547851940402630657488671505820681908902000708383676273854845817711531764475730270069855571366959622842914819860834936475292719074168444365510704342711559699508093042880177904174497791.999 +-179769313486231580793728971405303415079934132710037826936173778980444968292764750946649017977587207096330286416692887910946555547851940402630657488671505820681908902000708383676273854845817711531764475730270069855571366959622842914819860834936475292719074168444365510704342711559699508093042880177904174497792 +-179769313486231580793728971405303415079934132710037826936173778980444968292764750946649017977587207096330286416692887910946555547851940402630657488671505820681908902000708383676273854845817711531764475730270069855571366959622842914819860834936475292719074168444365510704342711559699508093042880177904174497792.001 +1189731495357231765053511589829488667966254004695567218956499277562499181851727204760449442904570461384330567646167443286662555267489487930236325136097654342377232417536489080362029584951246485605740928178136611230674219048500381811805207877203107268812398885808170517032687767579195512604426112969939697309064970421357373593737548189791064578075396520278041564919877710332117871859964923206311175434753221226253534337199304629504137668677812103359730222935610071343425325633562626092674600633358193879055413937592435479934747155496913520748914500847834599706604816899916747713074435514585511372746030946789075371775796999312354227866587803370992862072730331502951338476357350089453460696354521572546926077765383044577075982892200047380230605947983926605074559374288887635146614087580689065065271437207231562037396763728185780908406142166217047877746112568232134313256340568095056911759884246066540728231159508276273778086735741815471986687141421432344475502062691975457742639931301197788106590436213127071090684338861628772228444915189303418963135612389885203608036075349871783050435209372998381734440835020273404521625820382960095748088096587424348978607559613437524195438026532392163371033702927429354975024746264545597290170945602348672367013792302348098432637396409095613884932277251719835310031547998505803752546406866843706502753183166325399209709698038388729144247605351114448647488475730429635692916794001788966968620265007002798266353024717022066273037990476329714600171995445673732316103762568799871343179341500144434361457105461379244904895252415230182712399067436456639767780598951274425173976825259444309519076481099524794546856555816525710213317614010389620491220471110091857573837438278112540147709446027133781874510952001326117006323864207925852079541370644269957126564493435341201207708574988136737425864785839645124060309307041974867276363338370018636105162869283008917743830711050229193144085029688094638483773246680141155923835213247853616763725824680857167751837090780487900840228387283614547346509044804890143691849792564977383927445249156165014494875205013001248617782698812613355440377357151258089863597284198597765215866830359241005748505543689358738031324284465243629136488333487686637331181039189590604124992017972343852392605049057443576119873279945400832860199527936922650062116335246759763699388664096895732875994904427617012292176896143437273923395471742216159840248646356256801083915667206811346470984128630513747606135060039717590702096972930814428759032404269759101709671790756463178143949787623821836792662477247624052842849718333550449622140658955581054081751312471819712726722479962465958577056952080928160441258225609897705262614494607339126216928069521406520619119688243287473394538225119027875465220992256233111477265049726174251028452120761620567236506258269287781320020740354052506311094266116406810709272834304862320539294205143454357131313879679493260017348668942730474494178249137387898297328336833589009038180169681270850774180709517707029996636939683240047817287633101083794404428541740415811916696232677498555197744273877942786661835044988438574758774422356087368185157228627335879058660154558309535912070401295584736621504268847267595223765835863174255756697267818931047523414328918687705134068360361363742640382966108545994545911705825697417989043286767551310728319742954355856116731710961138337957358885918445698641669559694166808074917226884181158917536699176609687522288426691820400183361523559409155799556283862329497478912575261457830579497761228960488413082611130636745385531466634515743840239035698486403517044157039226831085528805370810274043977756176084122952933117637894899009906118591255725255303492783199432613047841255537488113392259699564654048366964907825009036946741350368993216860237824660346368178183476516236016631293185747612693520285606412666148401080833153012602745585750872969103848152851344605317151546396041150523486651715472516090757848631964035419441554251667764234034722117421393132102998968842527073068624998951156916755512381404671428195378673434142765187038589280087599553911407299582781759652177398265112189244631130776935980062283655148992367895151475032666162688096176262281649169171506024644941424855074678761732513983988468070793092275675388024763356241941156378024394000502219343689759498466840264622527907455975633934878799543518206521383037618795439338086429200645002065120039545639315698201147683480515936292743251499063438531296922453863968872815997353125881179686462705170051219974666064694475306164653842558263043808428507798331085671416437696164008096171739721381877119714312306163210350382599226246553966125970240408129674442076735944784179006667645805896851048093638137596670696937010699212957919299380937222250509562807981779341384684146547286314982564181910419531236194060603634063907761401557097370591258981203660079555061603095538604465962028762337280258716255780315038694244061790279947528902264433516193654532433289688740976918527.999 +1189731495357231765053511589829488667966254004695567218956499277562499181851727204760449442904570461384330567646167443286662555267489487930236325136097654342377232417536489080362029584951246485605740928178136611230674219048500381811805207877203107268812398885808170517032687767579195512604426112969939697309064970421357373593737548189791064578075396520278041564919877710332117871859964923206311175434753221226253534337199304629504137668677812103359730222935610071343425325633562626092674600633358193879055413937592435479934747155496913520748914500847834599706604816899916747713074435514585511372746030946789075371775796999312354227866587803370992862072730331502951338476357350089453460696354521572546926077765383044577075982892200047380230605947983926605074559374288887635146614087580689065065271437207231562037396763728185780908406142166217047877746112568232134313256340568095056911759884246066540728231159508276273778086735741815471986687141421432344475502062691975457742639931301197788106590436213127071090684338861628772228444915189303418963135612389885203608036075349871783050435209372998381734440835020273404521625820382960095748088096587424348978607559613437524195438026532392163371033702927429354975024746264545597290170945602348672367013792302348098432637396409095613884932277251719835310031547998505803752546406866843706502753183166325399209709698038388729144247605351114448647488475730429635692916794001788966968620265007002798266353024717022066273037990476329714600171995445673732316103762568799871343179341500144434361457105461379244904895252415230182712399067436456639767780598951274425173976825259444309519076481099524794546856555816525710213317614010389620491220471110091857573837438278112540147709446027133781874510952001326117006323864207925852079541370644269957126564493435341201207708574988136737425864785839645124060309307041974867276363338370018636105162869283008917743830711050229193144085029688094638483773246680141155923835213247853616763725824680857167751837090780487900840228387283614547346509044804890143691849792564977383927445249156165014494875205013001248617782698812613355440377357151258089863597284198597765215866830359241005748505543689358738031324284465243629136488333487686637331181039189590604124992017972343852392605049057443576119873279945400832860199527936922650062116335246759763699388664096895732875994904427617012292176896143437273923395471742216159840248646356256801083915667206811346470984128630513747606135060039717590702096972930814428759032404269759101709671790756463178143949787623821836792662477247624052842849718333550449622140658955581054081751312471819712726722479962465958577056952080928160441258225609897705262614494607339126216928069521406520619119688243287473394538225119027875465220992256233111477265049726174251028452120761620567236506258269287781320020740354052506311094266116406810709272834304862320539294205143454357131313879679493260017348668942730474494178249137387898297328336833589009038180169681270850774180709517707029996636939683240047817287633101083794404428541740415811916696232677498555197744273877942786661835044988438574758774422356087368185157228627335879058660154558309535912070401295584736621504268847267595223765835863174255756697267818931047523414328918687705134068360361363742640382966108545994545911705825697417989043286767551310728319742954355856116731710961138337957358885918445698641669559694166808074917226884181158917536699176609687522288426691820400183361523559409155799556283862329497478912575261457830579497761228960488413082611130636745385531466634515743840239035698486403517044157039226831085528805370810274043977756176084122952933117637894899009906118591255725255303492783199432613047841255537488113392259699564654048366964907825009036946741350368993216860237824660346368178183476516236016631293185747612693520285606412666148401080833153012602745585750872969103848152851344605317151546396041150523486651715472516090757848631964035419441554251667764234034722117421393132102998968842527073068624998951156916755512381404671428195378673434142765187038589280087599553911407299582781759652177398265112189244631130776935980062283655148992367895151475032666162688096176262281649169171506024644941424855074678761732513983988468070793092275675388024763356241941156378024394000502219343689759498466840264622527907455975633934878799543518206521383037618795439338086429200645002065120039545639315698201147683480515936292743251499063438531296922453863968872815997353125881179686462705170051219974666064694475306164653842558263043808428507798331085671416437696164008096171739721381877119714312306163210350382599226246553966125970240408129674442076735944784179006667645805896851048093638137596670696937010699212957919299380937222250509562807981779341384684146547286314982564181910419531236194060603634063907761401557097370591258981203660079555061603095538604465962028762337280258716255780315038694244061790279947528902264433516193654532433289688740976918528 +1189731495357231765053511589829488667966254004695567218956499277562499181851727204760449442904570461384330567646167443286662555267489487930236325136097654342377232417536489080362029584951246485605740928178136611230674219048500381811805207877203107268812398885808170517032687767579195512604426112969939697309064970421357373593737548189791064578075396520278041564919877710332117871859964923206311175434753221226253534337199304629504137668677812103359730222935610071343425325633562626092674600633358193879055413937592435479934747155496913520748914500847834599706604816899916747713074435514585511372746030946789075371775796999312354227866587803370992862072730331502951338476357350089453460696354521572546926077765383044577075982892200047380230605947983926605074559374288887635146614087580689065065271437207231562037396763728185780908406142166217047877746112568232134313256340568095056911759884246066540728231159508276273778086735741815471986687141421432344475502062691975457742639931301197788106590436213127071090684338861628772228444915189303418963135612389885203608036075349871783050435209372998381734440835020273404521625820382960095748088096587424348978607559613437524195438026532392163371033702927429354975024746264545597290170945602348672367013792302348098432637396409095613884932277251719835310031547998505803752546406866843706502753183166325399209709698038388729144247605351114448647488475730429635692916794001788966968620265007002798266353024717022066273037990476329714600171995445673732316103762568799871343179341500144434361457105461379244904895252415230182712399067436456639767780598951274425173976825259444309519076481099524794546856555816525710213317614010389620491220471110091857573837438278112540147709446027133781874510952001326117006323864207925852079541370644269957126564493435341201207708574988136737425864785839645124060309307041974867276363338370018636105162869283008917743830711050229193144085029688094638483773246680141155923835213247853616763725824680857167751837090780487900840228387283614547346509044804890143691849792564977383927445249156165014494875205013001248617782698812613355440377357151258089863597284198597765215866830359241005748505543689358738031324284465243629136488333487686637331181039189590604124992017972343852392605049057443576119873279945400832860199527936922650062116335246759763699388664096895732875994904427617012292176896143437273923395471742216159840248646356256801083915667206811346470984128630513747606135060039717590702096972930814428759032404269759101709671790756463178143949787623821836792662477247624052842849718333550449622140658955581054081751312471819712726722479962465958577056952080928160441258225609897705262614494607339126216928069521406520619119688243287473394538225119027875465220992256233111477265049726174251028452120761620567236506258269287781320020740354052506311094266116406810709272834304862320539294205143454357131313879679493260017348668942730474494178249137387898297328336833589009038180169681270850774180709517707029996636939683240047817287633101083794404428541740415811916696232677498555197744273877942786661835044988438574758774422356087368185157228627335879058660154558309535912070401295584736621504268847267595223765835863174255756697267818931047523414328918687705134068360361363742640382966108545994545911705825697417989043286767551310728319742954355856116731710961138337957358885918445698641669559694166808074917226884181158917536699176609687522288426691820400183361523559409155799556283862329497478912575261457830579497761228960488413082611130636745385531466634515743840239035698486403517044157039226831085528805370810274043977756176084122952933117637894899009906118591255725255303492783199432613047841255537488113392259699564654048366964907825009036946741350368993216860237824660346368178183476516236016631293185747612693520285606412666148401080833153012602745585750872969103848152851344605317151546396041150523486651715472516090757848631964035419441554251667764234034722117421393132102998968842527073068624998951156916755512381404671428195378673434142765187038589280087599553911407299582781759652177398265112189244631130776935980062283655148992367895151475032666162688096176262281649169171506024644941424855074678761732513983988468070793092275675388024763356241941156378024394000502219343689759498466840264622527907455975633934878799543518206521383037618795439338086429200645002065120039545639315698201147683480515936292743251499063438531296922453863968872815997353125881179686462705170051219974666064694475306164653842558263043808428507798331085671416437696164008096171739721381877119714312306163210350382599226246553966125970240408129674442076735944784179006667645805896851048093638137596670696937010699212957919299380937222250509562807981779341384684146547286314982564181910419531236194060603634063907761401557097370591258981203660079555061603095538604465962028762337280258716255780315038694244061790279947528902264433516193654532433289688740976918528.001 +-1189731495357231765053511589829488667966254004695567218956499277562499181851727204760449442904570461384330567646167443286662555267489487930236325136097654342377232417536489080362029584951246485605740928178136611230674219048500381811805207877203107268812398885808170517032687767579195512604426112969939697309064970421357373593737548189791064578075396520278041564919877710332117871859964923206311175434753221226253534337199304629504137668677812103359730222935610071343425325633562626092674600633358193879055413937592435479934747155496913520748914500847834599706604816899916747713074435514585511372746030946789075371775796999312354227866587803370992862072730331502951338476357350089453460696354521572546926077765383044577075982892200047380230605947983926605074559374288887635146614087580689065065271437207231562037396763728185780908406142166217047877746112568232134313256340568095056911759884246066540728231159508276273778086735741815471986687141421432344475502062691975457742639931301197788106590436213127071090684338861628772228444915189303418963135612389885203608036075349871783050435209372998381734440835020273404521625820382960095748088096587424348978607559613437524195438026532392163371033702927429354975024746264545597290170945602348672367013792302348098432637396409095613884932277251719835310031547998505803752546406866843706502753183166325399209709698038388729144247605351114448647488475730429635692916794001788966968620265007002798266353024717022066273037990476329714600171995445673732316103762568799871343179341500144434361457105461379244904895252415230182712399067436456639767780598951274425173976825259444309519076481099524794546856555816525710213317614010389620491220471110091857573837438278112540147709446027133781874510952001326117006323864207925852079541370644269957126564493435341201207708574988136737425864785839645124060309307041974867276363338370018636105162869283008917743830711050229193144085029688094638483773246680141155923835213247853616763725824680857167751837090780487900840228387283614547346509044804890143691849792564977383927445249156165014494875205013001248617782698812613355440377357151258089863597284198597765215866830359241005748505543689358738031324284465243629136488333487686637331181039189590604124992017972343852392605049057443576119873279945400832860199527936922650062116335246759763699388664096895732875994904427617012292176896143437273923395471742216159840248646356256801083915667206811346470984128630513747606135060039717590702096972930814428759032404269759101709671790756463178143949787623821836792662477247624052842849718333550449622140658955581054081751312471819712726722479962465958577056952080928160441258225609897705262614494607339126216928069521406520619119688243287473394538225119027875465220992256233111477265049726174251028452120761620567236506258269287781320020740354052506311094266116406810709272834304862320539294205143454357131313879679493260017348668942730474494178249137387898297328336833589009038180169681270850774180709517707029996636939683240047817287633101083794404428541740415811916696232677498555197744273877942786661835044988438574758774422356087368185157228627335879058660154558309535912070401295584736621504268847267595223765835863174255756697267818931047523414328918687705134068360361363742640382966108545994545911705825697417989043286767551310728319742954355856116731710961138337957358885918445698641669559694166808074917226884181158917536699176609687522288426691820400183361523559409155799556283862329497478912575261457830579497761228960488413082611130636745385531466634515743840239035698486403517044157039226831085528805370810274043977756176084122952933117637894899009906118591255725255303492783199432613047841255537488113392259699564654048366964907825009036946741350368993216860237824660346368178183476516236016631293185747612693520285606412666148401080833153012602745585750872969103848152851344605317151546396041150523486651715472516090757848631964035419441554251667764234034722117421393132102998968842527073068624998951156916755512381404671428195378673434142765187038589280087599553911407299582781759652177398265112189244631130776935980062283655148992367895151475032666162688096176262281649169171506024644941424855074678761732513983988468070793092275675388024763356241941156378024394000502219343689759498466840264622527907455975633934878799543518206521383037618795439338086429200645002065120039545639315698201147683480515936292743251499063438531296922453863968872815997353125881179686462705170051219974666064694475306164653842558263043808428507798331085671416437696164008096171739721381877119714312306163210350382599226246553966125970240408129674442076735944784179006667645805896851048093638137596670696937010699212957919299380937222250509562807981779341384684146547286314982564181910419531236194060603634063907761401557097370591258981203660079555061603095538604465962028762337280258716255780315038694244061790279947528902264433516193654532433289688740976918527.999 +-1189731495357231765053511589829488667966254004695567218956499277562499181851727204760449442904570461384330567646167443286662555267489487930236325136097654342377232417536489080362029584951246485605740928178136611230674219048500381811805207877203107268812398885808170517032687767579195512604426112969939697309064970421357373593737548189791064578075396520278041564919877710332117871859964923206311175434753221226253534337199304629504137668677812103359730222935610071343425325633562626092674600633358193879055413937592435479934747155496913520748914500847834599706604816899916747713074435514585511372746030946789075371775796999312354227866587803370992862072730331502951338476357350089453460696354521572546926077765383044577075982892200047380230605947983926605074559374288887635146614087580689065065271437207231562037396763728185780908406142166217047877746112568232134313256340568095056911759884246066540728231159508276273778086735741815471986687141421432344475502062691975457742639931301197788106590436213127071090684338861628772228444915189303418963135612389885203608036075349871783050435209372998381734440835020273404521625820382960095748088096587424348978607559613437524195438026532392163371033702927429354975024746264545597290170945602348672367013792302348098432637396409095613884932277251719835310031547998505803752546406866843706502753183166325399209709698038388729144247605351114448647488475730429635692916794001788966968620265007002798266353024717022066273037990476329714600171995445673732316103762568799871343179341500144434361457105461379244904895252415230182712399067436456639767780598951274425173976825259444309519076481099524794546856555816525710213317614010389620491220471110091857573837438278112540147709446027133781874510952001326117006323864207925852079541370644269957126564493435341201207708574988136737425864785839645124060309307041974867276363338370018636105162869283008917743830711050229193144085029688094638483773246680141155923835213247853616763725824680857167751837090780487900840228387283614547346509044804890143691849792564977383927445249156165014494875205013001248617782698812613355440377357151258089863597284198597765215866830359241005748505543689358738031324284465243629136488333487686637331181039189590604124992017972343852392605049057443576119873279945400832860199527936922650062116335246759763699388664096895732875994904427617012292176896143437273923395471742216159840248646356256801083915667206811346470984128630513747606135060039717590702096972930814428759032404269759101709671790756463178143949787623821836792662477247624052842849718333550449622140658955581054081751312471819712726722479962465958577056952080928160441258225609897705262614494607339126216928069521406520619119688243287473394538225119027875465220992256233111477265049726174251028452120761620567236506258269287781320020740354052506311094266116406810709272834304862320539294205143454357131313879679493260017348668942730474494178249137387898297328336833589009038180169681270850774180709517707029996636939683240047817287633101083794404428541740415811916696232677498555197744273877942786661835044988438574758774422356087368185157228627335879058660154558309535912070401295584736621504268847267595223765835863174255756697267818931047523414328918687705134068360361363742640382966108545994545911705825697417989043286767551310728319742954355856116731710961138337957358885918445698641669559694166808074917226884181158917536699176609687522288426691820400183361523559409155799556283862329497478912575261457830579497761228960488413082611130636745385531466634515743840239035698486403517044157039226831085528805370810274043977756176084122952933117637894899009906118591255725255303492783199432613047841255537488113392259699564654048366964907825009036946741350368993216860237824660346368178183476516236016631293185747612693520285606412666148401080833153012602745585750872969103848152851344605317151546396041150523486651715472516090757848631964035419441554251667764234034722117421393132102998968842527073068624998951156916755512381404671428195378673434142765187038589280087599553911407299582781759652177398265112189244631130776935980062283655148992367895151475032666162688096176262281649169171506024644941424855074678761732513983988468070793092275675388024763356241941156378024394000502219343689759498466840264622527907455975633934878799543518206521383037618795439338086429200645002065120039545639315698201147683480515936292743251499063438531296922453863968872815997353125881179686462705170051219974666064694475306164653842558263043808428507798331085671416437696164008096171739721381877119714312306163210350382599226246553966125970240408129674442076735944784179006667645805896851048093638137596670696937010699212957919299380937222250509562807981779341384684146547286314982564181910419531236194060603634063907761401557097370591258981203660079555061603095538604465962028762337280258716255780315038694244061790279947528902264433516193654532433289688740976918528 +-1189731495357231765053511589829488667966254004695567218956499277562499181851727204760449442904570461384330567646167443286662555267489487930236325136097654342377232417536489080362029584951246485605740928178136611230674219048500381811805207877203107268812398885808170517032687767579195512604426112969939697309064970421357373593737548189791064578075396520278041564919877710332117871859964923206311175434753221226253534337199304629504137668677812103359730222935610071343425325633562626092674600633358193879055413937592435479934747155496913520748914500847834599706604816899916747713074435514585511372746030946789075371775796999312354227866587803370992862072730331502951338476357350089453460696354521572546926077765383044577075982892200047380230605947983926605074559374288887635146614087580689065065271437207231562037396763728185780908406142166217047877746112568232134313256340568095056911759884246066540728231159508276273778086735741815471986687141421432344475502062691975457742639931301197788106590436213127071090684338861628772228444915189303418963135612389885203608036075349871783050435209372998381734440835020273404521625820382960095748088096587424348978607559613437524195438026532392163371033702927429354975024746264545597290170945602348672367013792302348098432637396409095613884932277251719835310031547998505803752546406866843706502753183166325399209709698038388729144247605351114448647488475730429635692916794001788966968620265007002798266353024717022066273037990476329714600171995445673732316103762568799871343179341500144434361457105461379244904895252415230182712399067436456639767780598951274425173976825259444309519076481099524794546856555816525710213317614010389620491220471110091857573837438278112540147709446027133781874510952001326117006323864207925852079541370644269957126564493435341201207708574988136737425864785839645124060309307041974867276363338370018636105162869283008917743830711050229193144085029688094638483773246680141155923835213247853616763725824680857167751837090780487900840228387283614547346509044804890143691849792564977383927445249156165014494875205013001248617782698812613355440377357151258089863597284198597765215866830359241005748505543689358738031324284465243629136488333487686637331181039189590604124992017972343852392605049057443576119873279945400832860199527936922650062116335246759763699388664096895732875994904427617012292176896143437273923395471742216159840248646356256801083915667206811346470984128630513747606135060039717590702096972930814428759032404269759101709671790756463178143949787623821836792662477247624052842849718333550449622140658955581054081751312471819712726722479962465958577056952080928160441258225609897705262614494607339126216928069521406520619119688243287473394538225119027875465220992256233111477265049726174251028452120761620567236506258269287781320020740354052506311094266116406810709272834304862320539294205143454357131313879679493260017348668942730474494178249137387898297328336833589009038180169681270850774180709517707029996636939683240047817287633101083794404428541740415811916696232677498555197744273877942786661835044988438574758774422356087368185157228627335879058660154558309535912070401295584736621504268847267595223765835863174255756697267818931047523414328918687705134068360361363742640382966108545994545911705825697417989043286767551310728319742954355856116731710961138337957358885918445698641669559694166808074917226884181158917536699176609687522288426691820400183361523559409155799556283862329497478912575261457830579497761228960488413082611130636745385531466634515743840239035698486403517044157039226831085528805370810274043977756176084122952933117637894899009906118591255725255303492783199432613047841255537488113392259699564654048366964907825009036946741350368993216860237824660346368178183476516236016631293185747612693520285606412666148401080833153012602745585750872969103848152851344605317151546396041150523486651715472516090757848631964035419441554251667764234034722117421393132102998968842527073068624998951156916755512381404671428195378673434142765187038589280087599553911407299582781759652177398265112189244631130776935980062283655148992367895151475032666162688096176262281649169171506024644941424855074678761732513983988468070793092275675388024763356241941156378024394000502219343689759498466840264622527907455975633934878799543518206521383037618795439338086429200645002065120039545639315698201147683480515936292743251499063438531296922453863968872815997353125881179686462705170051219974666064694475306164653842558263043808428507798331085671416437696164008096171739721381877119714312306163210350382599226246553966125970240408129674442076735944784179006667645805896851048093638137596670696937010699212957919299380937222250509562807981779341384684146547286314982564181910419531236194060603634063907761401557097370591258981203660079555061603095538604465962028762337280258716255780315038694244061790279947528902264433516193654532433289688740976918528.001 +1189731495357231765085759326628007073479956869869102141501186852722712468967898039614731304160537056720508735524794218059326466407441245944473611725143413248467166796545513080184004525512467970210316955903084154210995219628561620502745688412979158287475743437748747529021767100495257876251386789060100486382120270573746835428422826338960972409135720437886908785614210084478384078153933033666173528598766851519250363351426064628258395419088471393111667700918729834985086320676654241316634560118019882210119337445330955835919527132875094715720056355846555701747536986251959671182002652387533752686564043006387189322467736998297209841197138514624008092952665297074506030396759964773170346856327642777902149445005909504598179054586496247232351389508014081573398665168934777318775791837135956795815584276253258339396528978452820191499230693717636210145879266988271829694083738038077122921912824291024453524934340394022902439339419069066610906029009607658742583030029946393156561520787087964747197937630779342237465827257153805466210260228188924675519409775662832664987585685048138307557155853256492278248578919164433813909200793462409840728598763947896501274688614908225267667177701366807438669326623433058218213443062408099675370787076912329373870411405571681619566725953239506667420107865842757661716617919733022513948046643510651078865572997073260056512303946747105979292110003450407489924836142530065624248678935670746065899317880622000638073367400369402302158314033221251653687424468051520786824115060818437539740055831113916055471483034808874617739843143938172333284262271469979254217432808855959164876994617775909494325360213896498452140653220161981435472501438614603134083005358006470142761755484855437912983836446436796696188799077203473615780300012474195744483595979884254878292198513051622049258764225807542304782444925923341494613428285320468971377328625604051015673705708956626631746891317417396029708456942140863834024650370695696409569123851257481398138888752582030034869787470552028103940729085803240085987569938856671422005581372166650497556769407574429118602955596567887598719046627586511067969787887833869882951233268645804198215954308918671793783729688211286988794688142675294614947234254538088223560934361145676358046211831627683890340178210365154617001635372653348370422726598857026002477929177288289123739070353691365311645518715750245510770260801141976525982246774038853785442558514521428892111522375063439093517487315386834431958429128019507409290585031131279294212910898440219254009319059392162713475019891930586543895163777707714398600339409818266699397506309660607491889862314049922386749339985169589508248405389966372279472368480994566101598780613797426213113809272341186010030687520020604372850246235750477820866306072249009107891882044221153421572454947459745218327822086016027106392614825047067937041894741980478402880643992102437022027245971074555342753214011193822631471157489050501952568860820401920833804902096485703539056563038766617104309221550246208420803236102663918198532911605896456149452566847699113209434574026975730941194301255893892984954283771852399164279918441721650800291777296251806440774844416950920058440264116651186795378697819243783770608877693892976259074109340205317427395771831523271197915676367134269045536541349377669517895718456625645303642348316558188118515730182101737730372539888936801532474040601312554322979825347707786172180885839980406705981955978435796108903153166067253815216088254644383863063765964591075911345075411534030241991912223282597135304726831878735179556423807036390298160370960490420948364372810759652439684318393869597369898890279242300069046830503059657125858043553373113729594871087942860315948055593344147677932119321424028600190292509664619336217631490498027916950777163752425164438252351468600785554531423979834791445600150108890772427261831495874930509509679414887523661977405914784645916502014777727175798319834059621717421648892845862179131151362279648610789587662840109016397812560123410281881558369684764808427158589621053418154441646967665840185085136102607775409115734963155803833286789583501481573372226195484679719674349562964338708154613401347218002057551149833995233231065737207320566592164688912051242035274499618147339269167576074688060033124924140616954310412384530235227956908301847998406574780144353357884105883387959218296741020722854954100887277304947480547152700263711114665576920925961724019512061174430771918685854961160518537953685957360038825116204970615989239857746870933341859397441672382036764530524729808239765622931171203720639459438906663253650619610229282159290703571350858167568164860431176138378765549296218562697437528856056494473388171789278961444737763604387979003662127798027475934505640301147524790717395857232708656327584954348395562117135230986025734451614751913114005140624270977801178582308406486958461409022442175446835595658183592121309722334474915831657286355138025915434411459395393534709704525536550715391.999 +1189731495357231765085759326628007073479956869869102141501186852722712468967898039614731304160537056720508735524794218059326466407441245944473611725143413248467166796545513080184004525512467970210316955903084154210995219628561620502745688412979158287475743437748747529021767100495257876251386789060100486382120270573746835428422826338960972409135720437886908785614210084478384078153933033666173528598766851519250363351426064628258395419088471393111667700918729834985086320676654241316634560118019882210119337445330955835919527132875094715720056355846555701747536986251959671182002652387533752686564043006387189322467736998297209841197138514624008092952665297074506030396759964773170346856327642777902149445005909504598179054586496247232351389508014081573398665168934777318775791837135956795815584276253258339396528978452820191499230693717636210145879266988271829694083738038077122921912824291024453524934340394022902439339419069066610906029009607658742583030029946393156561520787087964747197937630779342237465827257153805466210260228188924675519409775662832664987585685048138307557155853256492278248578919164433813909200793462409840728598763947896501274688614908225267667177701366807438669326623433058218213443062408099675370787076912329373870411405571681619566725953239506667420107865842757661716617919733022513948046643510651078865572997073260056512303946747105979292110003450407489924836142530065624248678935670746065899317880622000638073367400369402302158314033221251653687424468051520786824115060818437539740055831113916055471483034808874617739843143938172333284262271469979254217432808855959164876994617775909494325360213896498452140653220161981435472501438614603134083005358006470142761755484855437912983836446436796696188799077203473615780300012474195744483595979884254878292198513051622049258764225807542304782444925923341494613428285320468971377328625604051015673705708956626631746891317417396029708456942140863834024650370695696409569123851257481398138888752582030034869787470552028103940729085803240085987569938856671422005581372166650497556769407574429118602955596567887598719046627586511067969787887833869882951233268645804198215954308918671793783729688211286988794688142675294614947234254538088223560934361145676358046211831627683890340178210365154617001635372653348370422726598857026002477929177288289123739070353691365311645518715750245510770260801141976525982246774038853785442558514521428892111522375063439093517487315386834431958429128019507409290585031131279294212910898440219254009319059392162713475019891930586543895163777707714398600339409818266699397506309660607491889862314049922386749339985169589508248405389966372279472368480994566101598780613797426213113809272341186010030687520020604372850246235750477820866306072249009107891882044221153421572454947459745218327822086016027106392614825047067937041894741980478402880643992102437022027245971074555342753214011193822631471157489050501952568860820401920833804902096485703539056563038766617104309221550246208420803236102663918198532911605896456149452566847699113209434574026975730941194301255893892984954283771852399164279918441721650800291777296251806440774844416950920058440264116651186795378697819243783770608877693892976259074109340205317427395771831523271197915676367134269045536541349377669517895718456625645303642348316558188118515730182101737730372539888936801532474040601312554322979825347707786172180885839980406705981955978435796108903153166067253815216088254644383863063765964591075911345075411534030241991912223282597135304726831878735179556423807036390298160370960490420948364372810759652439684318393869597369898890279242300069046830503059657125858043553373113729594871087942860315948055593344147677932119321424028600190292509664619336217631490498027916950777163752425164438252351468600785554531423979834791445600150108890772427261831495874930509509679414887523661977405914784645916502014777727175798319834059621717421648892845862179131151362279648610789587662840109016397812560123410281881558369684764808427158589621053418154441646967665840185085136102607775409115734963155803833286789583501481573372226195484679719674349562964338708154613401347218002057551149833995233231065737207320566592164688912051242035274499618147339269167576074688060033124924140616954310412384530235227956908301847998406574780144353357884105883387959218296741020722854954100887277304947480547152700263711114665576920925961724019512061174430771918685854961160518537953685957360038825116204970615989239857746870933341859397441672382036764530524729808239765622931171203720639459438906663253650619610229282159290703571350858167568164860431176138378765549296218562697437528856056494473388171789278961444737763604387979003662127798027475934505640301147524790717395857232708656327584954348395562117135230986025734451614751913114005140624270977801178582308406486958461409022442175446835595658183592121309722334474915831657286355138025915434411459395393534709704525536550715392 +1189731495357231765085759326628007073479956869869102141501186852722712468967898039614731304160537056720508735524794218059326466407441245944473611725143413248467166796545513080184004525512467970210316955903084154210995219628561620502745688412979158287475743437748747529021767100495257876251386789060100486382120270573746835428422826338960972409135720437886908785614210084478384078153933033666173528598766851519250363351426064628258395419088471393111667700918729834985086320676654241316634560118019882210119337445330955835919527132875094715720056355846555701747536986251959671182002652387533752686564043006387189322467736998297209841197138514624008092952665297074506030396759964773170346856327642777902149445005909504598179054586496247232351389508014081573398665168934777318775791837135956795815584276253258339396528978452820191499230693717636210145879266988271829694083738038077122921912824291024453524934340394022902439339419069066610906029009607658742583030029946393156561520787087964747197937630779342237465827257153805466210260228188924675519409775662832664987585685048138307557155853256492278248578919164433813909200793462409840728598763947896501274688614908225267667177701366807438669326623433058218213443062408099675370787076912329373870411405571681619566725953239506667420107865842757661716617919733022513948046643510651078865572997073260056512303946747105979292110003450407489924836142530065624248678935670746065899317880622000638073367400369402302158314033221251653687424468051520786824115060818437539740055831113916055471483034808874617739843143938172333284262271469979254217432808855959164876994617775909494325360213896498452140653220161981435472501438614603134083005358006470142761755484855437912983836446436796696188799077203473615780300012474195744483595979884254878292198513051622049258764225807542304782444925923341494613428285320468971377328625604051015673705708956626631746891317417396029708456942140863834024650370695696409569123851257481398138888752582030034869787470552028103940729085803240085987569938856671422005581372166650497556769407574429118602955596567887598719046627586511067969787887833869882951233268645804198215954308918671793783729688211286988794688142675294614947234254538088223560934361145676358046211831627683890340178210365154617001635372653348370422726598857026002477929177288289123739070353691365311645518715750245510770260801141976525982246774038853785442558514521428892111522375063439093517487315386834431958429128019507409290585031131279294212910898440219254009319059392162713475019891930586543895163777707714398600339409818266699397506309660607491889862314049922386749339985169589508248405389966372279472368480994566101598780613797426213113809272341186010030687520020604372850246235750477820866306072249009107891882044221153421572454947459745218327822086016027106392614825047067937041894741980478402880643992102437022027245971074555342753214011193822631471157489050501952568860820401920833804902096485703539056563038766617104309221550246208420803236102663918198532911605896456149452566847699113209434574026975730941194301255893892984954283771852399164279918441721650800291777296251806440774844416950920058440264116651186795378697819243783770608877693892976259074109340205317427395771831523271197915676367134269045536541349377669517895718456625645303642348316558188118515730182101737730372539888936801532474040601312554322979825347707786172180885839980406705981955978435796108903153166067253815216088254644383863063765964591075911345075411534030241991912223282597135304726831878735179556423807036390298160370960490420948364372810759652439684318393869597369898890279242300069046830503059657125858043553373113729594871087942860315948055593344147677932119321424028600190292509664619336217631490498027916950777163752425164438252351468600785554531423979834791445600150108890772427261831495874930509509679414887523661977405914784645916502014777727175798319834059621717421648892845862179131151362279648610789587662840109016397812560123410281881558369684764808427158589621053418154441646967665840185085136102607775409115734963155803833286789583501481573372226195484679719674349562964338708154613401347218002057551149833995233231065737207320566592164688912051242035274499618147339269167576074688060033124924140616954310412384530235227956908301847998406574780144353357884105883387959218296741020722854954100887277304947480547152700263711114665576920925961724019512061174430771918685854961160518537953685957360038825116204970615989239857746870933341859397441672382036764530524729808239765622931171203720639459438906663253650619610229282159290703571350858167568164860431176138378765549296218562697437528856056494473388171789278961444737763604387979003662127798027475934505640301147524790717395857232708656327584954348395562117135230986025734451614751913114005140624270977801178582308406486958461409022442175446835595658183592121309722334474915831657286355138025915434411459395393534709704525536550715392.001 +-1189731495357231765085759326628007073479956869869102141501186852722712468967898039614731304160537056720508735524794218059326466407441245944473611725143413248467166796545513080184004525512467970210316955903084154210995219628561620502745688412979158287475743437748747529021767100495257876251386789060100486382120270573746835428422826338960972409135720437886908785614210084478384078153933033666173528598766851519250363351426064628258395419088471393111667700918729834985086320676654241316634560118019882210119337445330955835919527132875094715720056355846555701747536986251959671182002652387533752686564043006387189322467736998297209841197138514624008092952665297074506030396759964773170346856327642777902149445005909504598179054586496247232351389508014081573398665168934777318775791837135956795815584276253258339396528978452820191499230693717636210145879266988271829694083738038077122921912824291024453524934340394022902439339419069066610906029009607658742583030029946393156561520787087964747197937630779342237465827257153805466210260228188924675519409775662832664987585685048138307557155853256492278248578919164433813909200793462409840728598763947896501274688614908225267667177701366807438669326623433058218213443062408099675370787076912329373870411405571681619566725953239506667420107865842757661716617919733022513948046643510651078865572997073260056512303946747105979292110003450407489924836142530065624248678935670746065899317880622000638073367400369402302158314033221251653687424468051520786824115060818437539740055831113916055471483034808874617739843143938172333284262271469979254217432808855959164876994617775909494325360213896498452140653220161981435472501438614603134083005358006470142761755484855437912983836446436796696188799077203473615780300012474195744483595979884254878292198513051622049258764225807542304782444925923341494613428285320468971377328625604051015673705708956626631746891317417396029708456942140863834024650370695696409569123851257481398138888752582030034869787470552028103940729085803240085987569938856671422005581372166650497556769407574429118602955596567887598719046627586511067969787887833869882951233268645804198215954308918671793783729688211286988794688142675294614947234254538088223560934361145676358046211831627683890340178210365154617001635372653348370422726598857026002477929177288289123739070353691365311645518715750245510770260801141976525982246774038853785442558514521428892111522375063439093517487315386834431958429128019507409290585031131279294212910898440219254009319059392162713475019891930586543895163777707714398600339409818266699397506309660607491889862314049922386749339985169589508248405389966372279472368480994566101598780613797426213113809272341186010030687520020604372850246235750477820866306072249009107891882044221153421572454947459745218327822086016027106392614825047067937041894741980478402880643992102437022027245971074555342753214011193822631471157489050501952568860820401920833804902096485703539056563038766617104309221550246208420803236102663918198532911605896456149452566847699113209434574026975730941194301255893892984954283771852399164279918441721650800291777296251806440774844416950920058440264116651186795378697819243783770608877693892976259074109340205317427395771831523271197915676367134269045536541349377669517895718456625645303642348316558188118515730182101737730372539888936801532474040601312554322979825347707786172180885839980406705981955978435796108903153166067253815216088254644383863063765964591075911345075411534030241991912223282597135304726831878735179556423807036390298160370960490420948364372810759652439684318393869597369898890279242300069046830503059657125858043553373113729594871087942860315948055593344147677932119321424028600190292509664619336217631490498027916950777163752425164438252351468600785554531423979834791445600150108890772427261831495874930509509679414887523661977405914784645916502014777727175798319834059621717421648892845862179131151362279648610789587662840109016397812560123410281881558369684764808427158589621053418154441646967665840185085136102607775409115734963155803833286789583501481573372226195484679719674349562964338708154613401347218002057551149833995233231065737207320566592164688912051242035274499618147339269167576074688060033124924140616954310412384530235227956908301847998406574780144353357884105883387959218296741020722854954100887277304947480547152700263711114665576920925961724019512061174430771918685854961160518537953685957360038825116204970615989239857746870933341859397441672382036764530524729808239765622931171203720639459438906663253650619610229282159290703571350858167568164860431176138378765549296218562697437528856056494473388171789278961444737763604387979003662127798027475934505640301147524790717395857232708656327584954348395562117135230986025734451614751913114005140624270977801178582308406486958461409022442175446835595658183592121309722334474915831657286355138025915434411459395393534709704525536550715391.999 +-1189731495357231765085759326628007073479956869869102141501186852722712468967898039614731304160537056720508735524794218059326466407441245944473611725143413248467166796545513080184004525512467970210316955903084154210995219628561620502745688412979158287475743437748747529021767100495257876251386789060100486382120270573746835428422826338960972409135720437886908785614210084478384078153933033666173528598766851519250363351426064628258395419088471393111667700918729834985086320676654241316634560118019882210119337445330955835919527132875094715720056355846555701747536986251959671182002652387533752686564043006387189322467736998297209841197138514624008092952665297074506030396759964773170346856327642777902149445005909504598179054586496247232351389508014081573398665168934777318775791837135956795815584276253258339396528978452820191499230693717636210145879266988271829694083738038077122921912824291024453524934340394022902439339419069066610906029009607658742583030029946393156561520787087964747197937630779342237465827257153805466210260228188924675519409775662832664987585685048138307557155853256492278248578919164433813909200793462409840728598763947896501274688614908225267667177701366807438669326623433058218213443062408099675370787076912329373870411405571681619566725953239506667420107865842757661716617919733022513948046643510651078865572997073260056512303946747105979292110003450407489924836142530065624248678935670746065899317880622000638073367400369402302158314033221251653687424468051520786824115060818437539740055831113916055471483034808874617739843143938172333284262271469979254217432808855959164876994617775909494325360213896498452140653220161981435472501438614603134083005358006470142761755484855437912983836446436796696188799077203473615780300012474195744483595979884254878292198513051622049258764225807542304782444925923341494613428285320468971377328625604051015673705708956626631746891317417396029708456942140863834024650370695696409569123851257481398138888752582030034869787470552028103940729085803240085987569938856671422005581372166650497556769407574429118602955596567887598719046627586511067969787887833869882951233268645804198215954308918671793783729688211286988794688142675294614947234254538088223560934361145676358046211831627683890340178210365154617001635372653348370422726598857026002477929177288289123739070353691365311645518715750245510770260801141976525982246774038853785442558514521428892111522375063439093517487315386834431958429128019507409290585031131279294212910898440219254009319059392162713475019891930586543895163777707714398600339409818266699397506309660607491889862314049922386749339985169589508248405389966372279472368480994566101598780613797426213113809272341186010030687520020604372850246235750477820866306072249009107891882044221153421572454947459745218327822086016027106392614825047067937041894741980478402880643992102437022027245971074555342753214011193822631471157489050501952568860820401920833804902096485703539056563038766617104309221550246208420803236102663918198532911605896456149452566847699113209434574026975730941194301255893892984954283771852399164279918441721650800291777296251806440774844416950920058440264116651186795378697819243783770608877693892976259074109340205317427395771831523271197915676367134269045536541349377669517895718456625645303642348316558188118515730182101737730372539888936801532474040601312554322979825347707786172180885839980406705981955978435796108903153166067253815216088254644383863063765964591075911345075411534030241991912223282597135304726831878735179556423807036390298160370960490420948364372810759652439684318393869597369898890279242300069046830503059657125858043553373113729594871087942860315948055593344147677932119321424028600190292509664619336217631490498027916950777163752425164438252351468600785554531423979834791445600150108890772427261831495874930509509679414887523661977405914784645916502014777727175798319834059621717421648892845862179131151362279648610789587662840109016397812560123410281881558369684764808427158589621053418154441646967665840185085136102607775409115734963155803833286789583501481573372226195484679719674349562964338708154613401347218002057551149833995233231065737207320566592164688912051242035274499618147339269167576074688060033124924140616954310412384530235227956908301847998406574780144353357884105883387959218296741020722854954100887277304947480547152700263711114665576920925961724019512061174430771918685854961160518537953685957360038825116204970615989239857746870933341859397441672382036764530524729808239765622931171203720639459438906663253650619610229282159290703571350858167568164860431176138378765549296218562697437528856056494473388171789278961444737763604387979003662127798027475934505640301147524790717395857232708656327584954348395562117135230986025734451614751913114005140624270977801178582308406486958461409022442175446835595658183592121309722334474915831657286355138025915434411459395393534709704525536550715392 +-1189731495357231765085759326628007073479956869869102141501186852722712468967898039614731304160537056720508735524794218059326466407441245944473611725143413248467166796545513080184004525512467970210316955903084154210995219628561620502745688412979158287475743437748747529021767100495257876251386789060100486382120270573746835428422826338960972409135720437886908785614210084478384078153933033666173528598766851519250363351426064628258395419088471393111667700918729834985086320676654241316634560118019882210119337445330955835919527132875094715720056355846555701747536986251959671182002652387533752686564043006387189322467736998297209841197138514624008092952665297074506030396759964773170346856327642777902149445005909504598179054586496247232351389508014081573398665168934777318775791837135956795815584276253258339396528978452820191499230693717636210145879266988271829694083738038077122921912824291024453524934340394022902439339419069066610906029009607658742583030029946393156561520787087964747197937630779342237465827257153805466210260228188924675519409775662832664987585685048138307557155853256492278248578919164433813909200793462409840728598763947896501274688614908225267667177701366807438669326623433058218213443062408099675370787076912329373870411405571681619566725953239506667420107865842757661716617919733022513948046643510651078865572997073260056512303946747105979292110003450407489924836142530065624248678935670746065899317880622000638073367400369402302158314033221251653687424468051520786824115060818437539740055831113916055471483034808874617739843143938172333284262271469979254217432808855959164876994617775909494325360213896498452140653220161981435472501438614603134083005358006470142761755484855437912983836446436796696188799077203473615780300012474195744483595979884254878292198513051622049258764225807542304782444925923341494613428285320468971377328625604051015673705708956626631746891317417396029708456942140863834024650370695696409569123851257481398138888752582030034869787470552028103940729085803240085987569938856671422005581372166650497556769407574429118602955596567887598719046627586511067969787887833869882951233268645804198215954308918671793783729688211286988794688142675294614947234254538088223560934361145676358046211831627683890340178210365154617001635372653348370422726598857026002477929177288289123739070353691365311645518715750245510770260801141976525982246774038853785442558514521428892111522375063439093517487315386834431958429128019507409290585031131279294212910898440219254009319059392162713475019891930586543895163777707714398600339409818266699397506309660607491889862314049922386749339985169589508248405389966372279472368480994566101598780613797426213113809272341186010030687520020604372850246235750477820866306072249009107891882044221153421572454947459745218327822086016027106392614825047067937041894741980478402880643992102437022027245971074555342753214011193822631471157489050501952568860820401920833804902096485703539056563038766617104309221550246208420803236102663918198532911605896456149452566847699113209434574026975730941194301255893892984954283771852399164279918441721650800291777296251806440774844416950920058440264116651186795378697819243783770608877693892976259074109340205317427395771831523271197915676367134269045536541349377669517895718456625645303642348316558188118515730182101737730372539888936801532474040601312554322979825347707786172180885839980406705981955978435796108903153166067253815216088254644383863063765964591075911345075411534030241991912223282597135304726831878735179556423807036390298160370960490420948364372810759652439684318393869597369898890279242300069046830503059657125858043553373113729594871087942860315948055593344147677932119321424028600190292509664619336217631490498027916950777163752425164438252351468600785554531423979834791445600150108890772427261831495874930509509679414887523661977405914784645916502014777727175798319834059621717421648892845862179131151362279648610789587662840109016397812560123410281881558369684764808427158589621053418154441646967665840185085136102607775409115734963155803833286789583501481573372226195484679719674349562964338708154613401347218002057551149833995233231065737207320566592164688912051242035274499618147339269167576074688060033124924140616954310412384530235227956908301847998406574780144353357884105883387959218296741020722854954100887277304947480547152700263711114665576920925961724019512061174430771918685854961160518537953685957360038825116204970615989239857746870933341859397441672382036764530524729808239765622931171203720639459438906663253650619610229282159290703571350858167568164860431176138378765549296218562697437528856056494473388171789278961444737763604387979003662127798027475934505640301147524790717395857232708656327584954348395562117135230986025734451614751913114005140624270977801178582308406486958461409022442175446835595658183592121309722334474915831657286355138025915434411459395393534709704525536550715392.001 +2.10194769648722560638559437493487419692039291281477365763560242583468662402879090222995728254318237304687499e-45 +2.101947696487225606385594374934874196920392912814773657635602425834686624028790902229957282543182373046875e-45 +2.10194769648722560638559437493487419692039291281477365763560242583468662402879090222995728254318237304687501e-45 +-2.10194769648722560638559437493487419692039291281477365763560242583468662402879090222995728254318237304687499e-45 +-2.101947696487225606385594374934874196920392912814773657635602425834686624028790902229957282543182373046875e-45 +-2.10194769648722560638559437493487419692039291281477365763560242583468662402879090222995728254318237304687501e-45 +3.50324616081204267730932395822479032820065485469128942939267070972447770671465150371659547090530395507812499e-45 +3.503246160812042677309323958224790328200654854691289429392670709724477706714651503716595470905303955078125e-45 +3.50324616081204267730932395822479032820065485469128942939267070972447770671465150371659547090530395507812501e-45 +-3.50324616081204267730932395822479032820065485469128942939267070972447770671465150371659547090530395507812499e-45 +-3.503246160812042677309323958224790328200654854691289429392670709724477706714651503716595470905303955078125e-45 +-3.50324616081204267730932395822479032820065485469128942939267070972447770671465150371659547090530395507812501e-45 +7.410984687618698162648531893023320585475897039214871466383785237510132609053131277979497545424539885696948470431685765963899850655339096945981621940161728171894510697854671067917687257517734731555330779540854980960845750095811137303474765809687100959097544227100475730780971111893578483867565399878350301522805593404659373979179073872386829939581848166016912201945649993128979841136206248449867871357218035220901702390328579173252022052897402080290685402160661237554998340267130003581248647904138574340187552090159017259254714629617513415977493871857473787096164563890871811984127167305601704549300470526959016576377688490826798697257336652176556794107250876433756084600398490497214911746308553955635418864151316847843631308023759629577398300170898437499e-324 +7.4109846876186981626485318930233205854758970392148714663837852375101326090531312779794975454245398856969484704316857659638998506553390969459816219401617281718945106978546710679176872575177347315553307795408549809608457500958111373034747658096871009590975442271004757307809711118935784838675653998783503015228055934046593739791790738723868299395818481660169122019456499931289798411362062484498678713572180352209017023903285791732520220528974020802906854021606612375549983402671300035812486479041385743401875520901590172592547146296175134159774938718574737870961645638908718119841271673056017045493004705269590165763776884908267986972573366521765567941072508764337560846003984904972149117463085539556354188641513168478436313080237596295773983001708984375e-324 +7.410984687618698162648531893023320585475897039214871466383785237510132609053131277979497545424539885696948470431685765963899850655339096945981621940161728171894510697854671067917687257517734731555330779540854980960845750095811137303474765809687100959097544227100475730780971111893578483867565399878350301522805593404659373979179073872386829939581848166016912201945649993128979841136206248449867871357218035220901702390328579173252022052897402080290685402160661237554998340267130003581248647904138574340187552090159017259254714629617513415977493871857473787096164563890871811984127167305601704549300470526959016576377688490826798697257336652176556794107250876433756084600398490497214911746308553955635418864151316847843631308023759629577398300170898437501e-324 +-7.410984687618698162648531893023320585475897039214871466383785237510132609053131277979497545424539885696948470431685765963899850655339096945981621940161728171894510697854671067917687257517734731555330779540854980960845750095811137303474765809687100959097544227100475730780971111893578483867565399878350301522805593404659373979179073872386829939581848166016912201945649993128979841136206248449867871357218035220901702390328579173252022052897402080290685402160661237554998340267130003581248647904138574340187552090159017259254714629617513415977493871857473787096164563890871811984127167305601704549300470526959016576377688490826798697257336652176556794107250876433756084600398490497214911746308553955635418864151316847843631308023759629577398300170898437499e-324 +-7.4109846876186981626485318930233205854758970392148714663837852375101326090531312779794975454245398856969484704316857659638998506553390969459816219401617281718945106978546710679176872575177347315553307795408549809608457500958111373034747658096871009590975442271004757307809711118935784838675653998783503015228055934046593739791790738723868299395818481660169122019456499931289798411362062484498678713572180352209017023903285791732520220528974020802906854021606612375549983402671300035812486479041385743401875520901590172592547146296175134159774938718574737870961645638908718119841271673056017045493004705269590165763776884908267986972573366521765567941072508764337560846003984904972149117463085539556354188641513168478436313080237596295773983001708984375e-324 +-7.410984687618698162648531893023320585475897039214871466383785237510132609053131277979497545424539885696948470431685765963899850655339096945981621940161728171894510697854671067917687257517734731555330779540854980960845750095811137303474765809687100959097544227100475730780971111893578483867565399878350301522805593404659373979179073872386829939581848166016912201945649993128979841136206248449867871357218035220901702390328579173252022052897402080290685402160661237554998340267130003581248647904138574340187552090159017259254714629617513415977493871857473787096164563890871811984127167305601704549300470526959016576377688490826798697257336652176556794107250876433756084600398490497214911746308553955635418864151316847843631308023759629577398300170898437501e-324 +5.4677992978237119037926089004291297245985762235403450155814707305425575329500966052143410629387408077958710210208052966529504784489330482549602621133847135082257338717668975178538378957084503396349323438489751160934104796903302909028868611999312592165232778075745690821530731336739429587895774023213939331012985331912661021188896306095323395084578542200319963179359407180003251440084380484161504585462684082946932782829488183829817567452314437076943950532707791252404699268678810198502871250235796855577909830559749628817599194837522029036891995648803056846354520653635957919882905363521007017169741463296044392266269433408052686419017699718627761948763856040592690841721239300491445991666051031755802326720329666454066568630314348735511753639418257984253319063825247065727664852328745422305642626091617823968872438962470092440688372515677832232712866924800106797113478024083516199991991274936894113006233377518471389394984262004503058455485659100090665241525454803628182902241401701783637353179296850056973639305945938813428953287892593620291195986011128990061888798763718548789025717537674780281005583347165047846045925077914824515331335131286063574407181821236377907693209224423490663289916878620725507793163931390372011875799729330162278748985052557432333005334989519381566364065326138465761456173231416844807264090741841972247545424908843928136253653308813487994328446248389608261444391573619177442907290731163188581917588219420107047265367485141413919810885909689112244064797106324295291545892937991321479061743491490060940946128274533657682130125169586930571899403551122506297763180795732325134340989331155893724289358918212707392997768032299997207208451112971425779939507837165263255764268971211819536322993221774123134726665579460265871378186589562858761835613344584269098062275786969729830545786485401407774313414954958161677096004701941411411592755485864471870515173326244464631295701572087440183178339987662926763241220698078822661709054601073523477544653542795020468256078409306409100874886828781860529824879343987945751252081314345990313550683792348814627862441324030155730592166581251009922787324590431548734575328663628650380722603024383412564651446272117561042207738413114131099731016728935023152239431311619533848376583687509108453086730196255111695352464186678221927564757730319825223049341618853631333478241227227268084583396688436229936266854011427192767039363517491659523133852472534104124441112346615696891097070121463652258681270378076538381697594264658479637863087159293838880752928175545408262813403793568695416998388572304528748824756265665683890518422696169422338806137532304784682662448207928681740476188343739117833525916386815135793034906806117413105008719197882837614738262050320291539494104952056471606645482046176634075459021552555959590354956262127809953013679512507451424271839221946794056861055980558363033732905772356986051180966474116423192194741572438649215204229781279620370445373851348786918527399785630808242657122705381806661616271132182017797793661244078445747547535623384548769818529655539279036503234072455810991588075181817695975173110136482659854557506203058080551018873203138260451109855100526720073566126209666125604482413705611996796777927332827103568863352291499261312290355143742018042254470707107847293593205234049774839191754781030496978091006099559675240966730110167624903610656473267105556155633783594089546261107653110531808279445757724399186120387548675148632176049190701680305210224388072261974806791922636412897526952793677946622674149577084803568051242934076450942927092705684547042915490323112457971853658760725588190377666477106903106693847278847646032201293023329503348730723947218797410452333910847913892827195814551858335519518939031446093385329182820714173657946661746005901866885589732922652604573972842197231187365263381958925227970038358064987248233271706462687651143350472018043321314534759819524203308490914358596886150053406629512434788155355109100540319857813535695923273426256911552977539394209918630668466632881929661971212772444625151371953428875491139683919687008724010475217255347915698820960215217257390308560235323463096946442080548018754166369706161589705215873687166365628787796501470056870127729464714362172216802441045276911597009443281135389729130222603185665646434661947627628077723219376892727386120519287577405410510114936151502752997122750262781911372625997223415283516995479265631485799456782561734766648462849641064097181818204279498552827825384186202065516999362573388136163077477126602169410435905014077049808497409025369325795765272066650278004200357878990911374982857977108488482528354406313893864211497105765030504600982253488805474531798742143374465080240030582370086699167937651038307909706139327119325418854546478285735654541635477790346964782617354265050767878335230272194896680141986745074630225893106573559558843545841186025169531604151588481389164948914823593944287133336263680358191369540321930649824471425485137777984823525402115151171093313613251350685343824859052220126891551966018355920872775724807128769003243129486808733796350497668255116485157191011858830643898323628223472099280243583164434348347014910398004439821970508280440872759395827943270985008769143562351938091476215083548164137333541883808870019116234099013452929807950151652297436436006149684939775781234660954156154478642694176038524277810483833149798681345708089152179193979463169402340611793486272301808073267534612685593859596787866884211031341417903391749825320454663508370385251831778477311017089729361152161928815389818579983544490982891734081131312309744330960666031291451740885503458543884956367654943799264600314531815427932691107874782328654759293575803481929361961781073958502075438499070633193799699311694287183299423475339817655608058724723221867087563064557636112380829514501382073257737022472866608244164310385205213523702910787182472517125030106491031844871593141759729773907719510044049352857426592936763727969496103940591601975078602859660478614119405428212830134490731706220583788265344728818766885126977588151111984290444321648931907188080336064713873288834096229203276676119810521851726133377700616341304257822975788967472152742255041912584197045423031298506219011800240120182445838590696647416285334515631019799007515682004250060857020904012215375170479800482680554499806010766109655061507421747722461180617361402575082294678925605271083587897845390768226405648508518103525778638618195775128516073959272990148239415346263486966573934577450787243667063244378381883115827207605856174876350045086885320626669331311880593775916269643646395423220549940790476989709243027420158390806135690975149384714684219964938182719962913931464979458639185519531490009437619838306362365453754807654884704163490469296444427144778593725687358437087390151990694667516279202024332494828210657618261952038597230263799412584275851667403910657370879707181053365818502680037431560091209982641738995652793235851569372314130107647166085235615697257094269133100914135783178856280392139325001352841718610484616627448189556913621837791650699820323059708766420810133584841826718631681683381743511974264126250984214812397119978273917903889865891718836792263377888052458189238746074986456016681098722869419588274020181430652732817858728473849369539367463917171317324882099804999043054467247785592038464723442276239896066431580123756428540074945472427752568981171400621705853374875885943072600692576914790467205905272372594740187988081900317493185005142913607163380720069786786782095331840893694073778325119471833528492917081008547303414509381563617864195257751546539575461435803625993888325647883541039192368366987400263049681218831477776345118518503709588840859023379762456561030683928115349942393963185677123055324771693784214924931737043793679546051454845624150270955450608318747395755728950832754611277041359602301205138509175543313522772786504141007552691902249572375175731740923618769197304652898352694386665448260033458575323252814233868098279476166764258284911434288072243178941698347365985427696983129579496059032032841281149923518087084876885114369033227736521245740554711771423492719899982357711910225545480424688322195336240492253136281857837808491795993788199125205555222116581071134476787468430539307909617442106685159519071053844987343666452494280317720153567054364117244775141336558406098548803924509496052261825198043140272655303625315605326569530252885854991822289219201218313590745412010446642247111703901991591338062693320157180618736569439969283245279430312651192668788340033626825194260296262959884258597703584888770801961209652822982322376122303586169861685106043820510444293432856251210395693261264867823980172683352796141772210301725997652373804152525037162852291403804455997331367378463632437773242905518075065414724295857460288225400061608664961649196400079359622673770607898395269075056596627116148289491042491764170924014885106158235482774778418134123293974436877051995673618683751115353808771434984204447736174758316063096245047311279841579995578186609402864244042751443128536278453430633423118662852688374229600894418958824842459450540826176452145829389286103522774101195556029650753254244433565937938526828990893149766298997738359913887178888607190765709867052470880785937935110091424743449966353497865681753841380246075612094033617488674676296822570077027076266879557913673839341012099558043806442348798053951239274913334631522409564461770434875790402230022872647568436177018658068697071731879399180374560963492726714528729224208938589940272515747888379118461617702271694075087419634147298076764775745707026934442908236664400557265527951453482191684597674273691978253678690951178777239573925410438679099374700609973920128201422381329108236575369403675960765238333778127017096574296148321075566959285042221837159799800133563239963969638610872680393210300180152020613051613414547163713772512617757277955979895866367571776456268564191092477027650135832200376440239783726540552694851717269598489288851529660975027775639565229734596726205832668434979354541943345062977891187146561050118118108223323735210843681128615413601091222007912350536959777114306541514511332368936078560929788143798814391221507522370648646767364209132147312407014953113532379838195728491128536978285918066991040993153064356179903885952027952713749653604502053512355449916680887234238773855581636172479594866871765094513940103284167914110196720261110812716776424260154507395050380575452850420730818412994731079307343538376880280124019321040198038723558784544408584344466090982802067326529000931562048932875469079874956595180595395347093285140279165467965596318365749701535812384333240968283640721344003442002691613772056762099098025739332715913970186225176459563484134139746647940170537900275350480490468851439300771949915194703080576611022590670399844931867609777417528903454731922206378932141464755402629420074293816349270038351339419146768473851353171629153912238797141905920143036064131705230421762305232861503856799511155936565169005916711845389135580928162511912438531204156138447775120789548666143600293412065767167106888509172568003530668539460588248316513392652567856224602697296203328920073354425994044956624831346979458846837597950064151867164583749203433942592178528868981311575331848941597492470436782387502687532649093096498315347403977436001399982102030846763698994785054617523241463186980898394504211430763617825306895065661536045431497903759118007934839122881885863091769469883539876840543521295706315919855784493235603866268925981702690270202829595794350800918257913991744455922683343374046671669930219650268554687499e-4951 +5.46779929782371190379260890042912972459857622354034501558147073054255753295009660521434106293874080779587102102080529665295047844893304825496026211338471350822573387176689751785383789570845033963493234384897511609341047969033029090288686119993125921652327780757456908215307313367394295878957740232139393310129853319126610211888963060953233950845785422003199631793594071800032514400843804841615045854626840829469327828294881838298175674523144370769439505327077912524046992686788101985028712502357968555779098305597496288175991948375220290368919956488030568463545206536359579198829053635210070171697414632960443922662694334080526864190176997186277619487638560405926908417212393004914459916660510317558023267203296664540665686303143487355117536394182579842533190638252470657276648523287454223056426260916178239688724389624700924406883725156778322327128669248001067971134780240835161999919912749368941130062333775184713893949842620045030584554856591000906652415254548036281829022414017017836373531792968500569736393059459388134289532878925936202911959860111289900618887987637185487890257175376747802810055833471650478460459250779148245153313351312860635744071818212363779076932092244234906632899168786207255077931639313903720118757997293301622787489850525574323330053349895193815663640653261384657614561732314168448072640907418419722475454249088439281362536533088134879943284462483896082614443915736191774429072907311631885819175882194201070472653674851414139198108859096891122440647971063242952915458929379913214790617434914900609409461282745336576821301251695869305718994035511225062977631807957323251343409893311558937242893589182127073929977680322999972072084511129714257799395078371652632557642689712118195363229932217741231347266655794602658713781865895628587618356133445842690980622757869697298305457864854014077743134149549581616770960047019414114115927554858644718705151733262444646312957015720874401831783399876629267632412206980788226617090546010735234775446535427950204682560784093064091008748868287818605298248793439879457512520813143459903135506837923488146278624413240301557305921665812510099227873245904315487345753286636286503807226030243834125646514462721175610422077384131141310997310167289350231522394313116195338483765836875091084530867301962551116953524641866782219275647577303198252230493416188536313334782412272272680845833966884362299362668540114271927670393635174916595231338524725341041244411123466156968910970701214636522586812703780765383816975942646584796378630871592938388807529281755454082628134037935686954169983885723045287488247562656656838905184226961694223388061375323047846826624482079286817404761883437391178335259163868151357930349068061174131050087191978828376147382620503202915394941049520564716066454820461766340754590215525559595903549562621278099530136795125074514242718392219467940568610559805583630337329057723569860511809664741164231921947415724386492152042297812796203704453738513487869185273997856308082426571227053818066616162711321820177977936612440784457475475356233845487698185296555392790365032340724558109915880751818176959751731101364826598545575062030580805510188732031382604511098551005267200735661262096661256044824137056119967967779273328271035688633522914992613122903551437420180422544707071078472935932052340497748391917547810304969780910060995596752409667301101676249036106564732671055561556337835940895462611076531105318082794457577243991861203875486751486321760491907016803052102243880722619748067919226364128975269527936779466226741495770848035680512429340764509429270927056845470429154903231124579718536587607255881903776664771069031066938472788476460322012930233295033487307239472187974104523339108479138928271958145518583355195189390314460933853291828207141736579466617460059018668855897329226526045739728421972311873652633819589252279700383580649872482332717064626876511433504720180433213145347598195242033084909143585968861500534066295124347881553551091005403198578135356959232734262569115529775393942099186306684666328819296619712127724446251513719534288754911396839196870087240104752172553479156988209602152172573903085602353234630969464420805480187541663697061615897052158736871663656287877965014700568701277294647143621722168024410452769115970094432811353897291302226031856656464346619476276280777232193768927273861205192875774054105101149361515027529971227502627819113726259972234152835169954792656314857994567825617347666484628496410640971818182042794985528278253841862020655169993625733881361630774771266021694104359050140770498084974090253693257957652720666502780042003578789909113749828579771084884825283544063138938642114971057650305046009822534888054745317987421433744650802400305823700866991679376510383079097061393271193254188545464782857356545416354777903469647826173542650507678783352302721948966801419867450746302258931065735595588435458411860251695316041515884813891649489148235939442871333362636803581913695403219306498244714254851377779848235254021151511710933136132513506853438248590522201268915519660183559208727757248071287690032431294868087337963504976682551164851571910118588306438983236282234720992802435831644343483470149103980044398219705082804408727593958279432709850087691435623519380914762150835481641373335418838088700191162340990134529298079501516522974364360061496849397757812346609541561544786426941760385242778104838331497986813457080891521791939794631694023406117934862723018080732675346126855938595967878668842110313414179033917498253204546635083703852518317784773110170897293611521619288153898185799835444909828917340811313123097443309606660312914517408855034585438849563676549437992646003145318154279326911078747823286547592935758034819293619617810739585020754384990706331937996993116942871832994234753398176556080587247232218670875630645576361123808295145013820732577370224728666082441643103852052135237029107871824725171250301064910318448715931417597297739077195100440493528574265929367637279694961039405916019750786028596604786141194054282128301344907317062205837882653447288187668851269775881511119842904443216489319071880803360647138732888340962292032766761198105218517261333777006163413042578229757889674721527422550419125841970454230312985062190118002401201824458385906966474162853345156310197990075156820042500608570209040122153751704798004826805544998060107661096550615074217477224611806173614025750822946789256052710835878978453907682264056485085181035257786386181957751285160739592729901482394153462634869665739345774507872436670632443783818831158272076058561748763500450868853206266693313118805937759162696436463954232205499407904769897092430274201583908061356909751493847146842199649381827199629139314649794586391855195314900094376198383063623654537548076548847041634904692964444271447785937256873584370873901519906946675162792020243324948282106576182619520385972302637994125842758516674039106573708797071810533658185026800374315600912099826417389956527932358515693723141301076471660852356156972570942691331009141357831788562803921393250013528417186104846166274481895569136218377916506998203230597087664208101335848418267186316816833817435119742641262509842148123971199782739179038898658917188367922633778880524581892387460749864560166810987228694195882740201814306527328178587284738493695393674639171713173248820998049990430544672477855920384647234422762398960664315801237564285400749454724277525689811714006217058533748758859430726006925769147904672059052723725947401879880819003174931850051429136071633807200697867867820953318408936940737783251194718335284929170810085473034145093815636178641952577515465395754614358036259938883256478835410391923683669874002630496812188314777763451185185037095888408590233797624565610306839281153499423939631856771230553247716937842149249317370437936795460514548456241502709554506083187473957557289508327546112770413596023012051385091755433135227727865041410075526919022495723751757317409236187691973046528983526943866654482600334585753232528142338680982794761667642582849114342880722431789416983473659854276969831295794960590320328412811499235180870848768851143690332277365212457405547117714234927198999823577119102255454804246883221953362404922531362818578378084917959937881991252055552221165810711344767874684305393079096174421066851595190710538449873436664524942803177201535670543641172447751413365584060985488039245094960522618251980431402726553036253156053265695302528858549918222892192012183135907454120104466422471117039019915913380626933201571806187365694399692832452794303126511926687883400336268251942602962629598842585977035848887708019612096528229823223761223035861698616851060438205104442934328562512103956932612648678239801726833527961417722103017259976523738041525250371628522914038044559973313673784636324377732429055180750654147242958574602882254000616086649616491964000793596226737706078983952690750565966271161482894910424917641709240148851061582354827747784181341232939744368770519956736186837511153538087714349842044477361747583160630962450473112798415799955781866094028642440427514431285362784534306334231186628526883742296008944189588248424594505408261764521458293892861035227741011955560296507532542444335659379385268289908931497662989977383599138871788886071907657098670524708807859379351100914247434499663534978656817538413802460756120940336174886746762968225700770270762668795579136738393410120995580438064423487980539512392749133346315224095644617704348757904022300228726475684361770186580686970717318793991803745609634927267145287292242089385899402725157478883791184616177022716940750874196341472980767647757457070269344429082366644005572655279514534821916845976742736919782536786909511787772395739254104386790993747006099739201282014223813291082365753694036759607652383337781270170965742961483210755669592850422218371597998001335632399639696386108726803932103001801520206130516134145471637137725126177572779559798958663675717764562685641910924770276501358322003764402397837265405526948517172695984892888515296609750277756395652297345967262058326684349793545419433450629778911871465610501181181082233237352108436811286154136010912220079123505369597771143065415145113323689360785609297881437988143912215075223706486467673642091321473124070149531135323798381957284911285369782859180669910409931530643561799038859520279527137496536045020535123554499166808872342387738555816361724795948668717650945139401032841679141101967202611108127167764242601545073950503805754528504207308184129947310793073435383768802801240193210401980387235587845444085843444660909828020673265290009315620489328754690798749565951805953953470932851402791654679655963183657497015358123843332409682836407213440034420026916137720567620990980257393327159139701862251764595634841341397466479401705379002753504804904688514393007719499151947030805766110225906703998449318676097774175289034547319222063789321414647554026294200742938163492700383513394191467684738513531716291539122387971419059201430360641317052304217623052328615038567995111559365651690059167118453891355809281625119124385312041561384477751207895486661436002934120657671671068885091725680035306685394605882483165133926525678562246026972962033289200733544259940449566248313469794588468375979500641518671645837492034339425921785288689813115753318489415974924704367823875026875326490930964983153474039774360013999821020308467636989947850546175232414631869808983945042114307636178253068950656615360454314979037591180079348391228818858630917694698835398768405435212957063159198557844932356038662689259817026902702028295957943508009182579139917444559226833433740466716699302196502685546875e-4951 +5.4677992978237119037926089004291297245985762235403450155814707305425575329500966052143410629387408077958710210208052966529504784489330482549602621133847135082257338717668975178538378957084503396349323438489751160934104796903302909028868611999312592165232778075745690821530731336739429587895774023213939331012985331912661021188896306095323395084578542200319963179359407180003251440084380484161504585462684082946932782829488183829817567452314437076943950532707791252404699268678810198502871250235796855577909830559749628817599194837522029036891995648803056846354520653635957919882905363521007017169741463296044392266269433408052686419017699718627761948763856040592690841721239300491445991666051031755802326720329666454066568630314348735511753639418257984253319063825247065727664852328745422305642626091617823968872438962470092440688372515677832232712866924800106797113478024083516199991991274936894113006233377518471389394984262004503058455485659100090665241525454803628182902241401701783637353179296850056973639305945938813428953287892593620291195986011128990061888798763718548789025717537674780281005583347165047846045925077914824515331335131286063574407181821236377907693209224423490663289916878620725507793163931390372011875799729330162278748985052557432333005334989519381566364065326138465761456173231416844807264090741841972247545424908843928136253653308813487994328446248389608261444391573619177442907290731163188581917588219420107047265367485141413919810885909689112244064797106324295291545892937991321479061743491490060940946128274533657682130125169586930571899403551122506297763180795732325134340989331155893724289358918212707392997768032299997207208451112971425779939507837165263255764268971211819536322993221774123134726665579460265871378186589562858761835613344584269098062275786969729830545786485401407774313414954958161677096004701941411411592755485864471870515173326244464631295701572087440183178339987662926763241220698078822661709054601073523477544653542795020468256078409306409100874886828781860529824879343987945751252081314345990313550683792348814627862441324030155730592166581251009922787324590431548734575328663628650380722603024383412564651446272117561042207738413114131099731016728935023152239431311619533848376583687509108453086730196255111695352464186678221927564757730319825223049341618853631333478241227227268084583396688436229936266854011427192767039363517491659523133852472534104124441112346615696891097070121463652258681270378076538381697594264658479637863087159293838880752928175545408262813403793568695416998388572304528748824756265665683890518422696169422338806137532304784682662448207928681740476188343739117833525916386815135793034906806117413105008719197882837614738262050320291539494104952056471606645482046176634075459021552555959590354956262127809953013679512507451424271839221946794056861055980558363033732905772356986051180966474116423192194741572438649215204229781279620370445373851348786918527399785630808242657122705381806661616271132182017797793661244078445747547535623384548769818529655539279036503234072455810991588075181817695975173110136482659854557506203058080551018873203138260451109855100526720073566126209666125604482413705611996796777927332827103568863352291499261312290355143742018042254470707107847293593205234049774839191754781030496978091006099559675240966730110167624903610656473267105556155633783594089546261107653110531808279445757724399186120387548675148632176049190701680305210224388072261974806791922636412897526952793677946622674149577084803568051242934076450942927092705684547042915490323112457971853658760725588190377666477106903106693847278847646032201293023329503348730723947218797410452333910847913892827195814551858335519518939031446093385329182820714173657946661746005901866885589732922652604573972842197231187365263381958925227970038358064987248233271706462687651143350472018043321314534759819524203308490914358596886150053406629512434788155355109100540319857813535695923273426256911552977539394209918630668466632881929661971212772444625151371953428875491139683919687008724010475217255347915698820960215217257390308560235323463096946442080548018754166369706161589705215873687166365628787796501470056870127729464714362172216802441045276911597009443281135389729130222603185665646434661947627628077723219376892727386120519287577405410510114936151502752997122750262781911372625997223415283516995479265631485799456782561734766648462849641064097181818204279498552827825384186202065516999362573388136163077477126602169410435905014077049808497409025369325795765272066650278004200357878990911374982857977108488482528354406313893864211497105765030504600982253488805474531798742143374465080240030582370086699167937651038307909706139327119325418854546478285735654541635477790346964782617354265050767878335230272194896680141986745074630225893106573559558843545841186025169531604151588481389164948914823593944287133336263680358191369540321930649824471425485137777984823525402115151171093313613251350685343824859052220126891551966018355920872775724807128769003243129486808733796350497668255116485157191011858830643898323628223472099280243583164434348347014910398004439821970508280440872759395827943270985008769143562351938091476215083548164137333541883808870019116234099013452929807950151652297436436006149684939775781234660954156154478642694176038524277810483833149798681345708089152179193979463169402340611793486272301808073267534612685593859596787866884211031341417903391749825320454663508370385251831778477311017089729361152161928815389818579983544490982891734081131312309744330960666031291451740885503458543884956367654943799264600314531815427932691107874782328654759293575803481929361961781073958502075438499070633193799699311694287183299423475339817655608058724723221867087563064557636112380829514501382073257737022472866608244164310385205213523702910787182472517125030106491031844871593141759729773907719510044049352857426592936763727969496103940591601975078602859660478614119405428212830134490731706220583788265344728818766885126977588151111984290444321648931907188080336064713873288834096229203276676119810521851726133377700616341304257822975788967472152742255041912584197045423031298506219011800240120182445838590696647416285334515631019799007515682004250060857020904012215375170479800482680554499806010766109655061507421747722461180617361402575082294678925605271083587897845390768226405648508518103525778638618195775128516073959272990148239415346263486966573934577450787243667063244378381883115827207605856174876350045086885320626669331311880593775916269643646395423220549940790476989709243027420158390806135690975149384714684219964938182719962913931464979458639185519531490009437619838306362365453754807654884704163490469296444427144778593725687358437087390151990694667516279202024332494828210657618261952038597230263799412584275851667403910657370879707181053365818502680037431560091209982641738995652793235851569372314130107647166085235615697257094269133100914135783178856280392139325001352841718610484616627448189556913621837791650699820323059708766420810133584841826718631681683381743511974264126250984214812397119978273917903889865891718836792263377888052458189238746074986456016681098722869419588274020181430652732817858728473849369539367463917171317324882099804999043054467247785592038464723442276239896066431580123756428540074945472427752568981171400621705853374875885943072600692576914790467205905272372594740187988081900317493185005142913607163380720069786786782095331840893694073778325119471833528492917081008547303414509381563617864195257751546539575461435803625993888325647883541039192368366987400263049681218831477776345118518503709588840859023379762456561030683928115349942393963185677123055324771693784214924931737043793679546051454845624150270955450608318747395755728950832754611277041359602301205138509175543313522772786504141007552691902249572375175731740923618769197304652898352694386665448260033458575323252814233868098279476166764258284911434288072243178941698347365985427696983129579496059032032841281149923518087084876885114369033227736521245740554711771423492719899982357711910225545480424688322195336240492253136281857837808491795993788199125205555222116581071134476787468430539307909617442106685159519071053844987343666452494280317720153567054364117244775141336558406098548803924509496052261825198043140272655303625315605326569530252885854991822289219201218313590745412010446642247111703901991591338062693320157180618736569439969283245279430312651192668788340033626825194260296262959884258597703584888770801961209652822982322376122303586169861685106043820510444293432856251210395693261264867823980172683352796141772210301725997652373804152525037162852291403804455997331367378463632437773242905518075065414724295857460288225400061608664961649196400079359622673770607898395269075056596627116148289491042491764170924014885106158235482774778418134123293974436877051995673618683751115353808771434984204447736174758316063096245047311279841579995578186609402864244042751443128536278453430633423118662852688374229600894418958824842459450540826176452145829389286103522774101195556029650753254244433565937938526828990893149766298997738359913887178888607190765709867052470880785937935110091424743449966353497865681753841380246075612094033617488674676296822570077027076266879557913673839341012099558043806442348798053951239274913334631522409564461770434875790402230022872647568436177018658068697071731879399180374560963492726714528729224208938589940272515747888379118461617702271694075087419634147298076764775745707026934442908236664400557265527951453482191684597674273691978253678690951178777239573925410438679099374700609973920128201422381329108236575369403675960765238333778127017096574296148321075566959285042221837159799800133563239963969638610872680393210300180152020613051613414547163713772512617757277955979895866367571776456268564191092477027650135832200376440239783726540552694851717269598489288851529660975027775639565229734596726205832668434979354541943345062977891187146561050118118108223323735210843681128615413601091222007912350536959777114306541514511332368936078560929788143798814391221507522370648646767364209132147312407014953113532379838195728491128536978285918066991040993153064356179903885952027952713749653604502053512355449916680887234238773855581636172479594866871765094513940103284167914110196720261110812716776424260154507395050380575452850420730818412994731079307343538376880280124019321040198038723558784544408584344466090982802067326529000931562048932875469079874956595180595395347093285140279165467965596318365749701535812384333240968283640721344003442002691613772056762099098025739332715913970186225176459563484134139746647940170537900275350480490468851439300771949915194703080576611022590670399844931867609777417528903454731922206378932141464755402629420074293816349270038351339419146768473851353171629153912238797141905920143036064131705230421762305232861503856799511155936565169005916711845389135580928162511912438531204156138447775120789548666143600293412065767167106888509172568003530668539460588248316513392652567856224602697296203328920073354425994044956624831346979458846837597950064151867164583749203433942592178528868981311575331848941597492470436782387502687532649093096498315347403977436001399982102030846763698994785054617523241463186980898394504211430763617825306895065661536045431497903759118007934839122881885863091769469883539876840543521295706315919855784493235603866268925981702690270202829595794350800918257913991744455922683343374046671669930219650268554687501e-4951 +-5.4677992978237119037926089004291297245985762235403450155814707305425575329500966052143410629387408077958710210208052966529504784489330482549602621133847135082257338717668975178538378957084503396349323438489751160934104796903302909028868611999312592165232778075745690821530731336739429587895774023213939331012985331912661021188896306095323395084578542200319963179359407180003251440084380484161504585462684082946932782829488183829817567452314437076943950532707791252404699268678810198502871250235796855577909830559749628817599194837522029036891995648803056846354520653635957919882905363521007017169741463296044392266269433408052686419017699718627761948763856040592690841721239300491445991666051031755802326720329666454066568630314348735511753639418257984253319063825247065727664852328745422305642626091617823968872438962470092440688372515677832232712866924800106797113478024083516199991991274936894113006233377518471389394984262004503058455485659100090665241525454803628182902241401701783637353179296850056973639305945938813428953287892593620291195986011128990061888798763718548789025717537674780281005583347165047846045925077914824515331335131286063574407181821236377907693209224423490663289916878620725507793163931390372011875799729330162278748985052557432333005334989519381566364065326138465761456173231416844807264090741841972247545424908843928136253653308813487994328446248389608261444391573619177442907290731163188581917588219420107047265367485141413919810885909689112244064797106324295291545892937991321479061743491490060940946128274533657682130125169586930571899403551122506297763180795732325134340989331155893724289358918212707392997768032299997207208451112971425779939507837165263255764268971211819536322993221774123134726665579460265871378186589562858761835613344584269098062275786969729830545786485401407774313414954958161677096004701941411411592755485864471870515173326244464631295701572087440183178339987662926763241220698078822661709054601073523477544653542795020468256078409306409100874886828781860529824879343987945751252081314345990313550683792348814627862441324030155730592166581251009922787324590431548734575328663628650380722603024383412564651446272117561042207738413114131099731016728935023152239431311619533848376583687509108453086730196255111695352464186678221927564757730319825223049341618853631333478241227227268084583396688436229936266854011427192767039363517491659523133852472534104124441112346615696891097070121463652258681270378076538381697594264658479637863087159293838880752928175545408262813403793568695416998388572304528748824756265665683890518422696169422338806137532304784682662448207928681740476188343739117833525916386815135793034906806117413105008719197882837614738262050320291539494104952056471606645482046176634075459021552555959590354956262127809953013679512507451424271839221946794056861055980558363033732905772356986051180966474116423192194741572438649215204229781279620370445373851348786918527399785630808242657122705381806661616271132182017797793661244078445747547535623384548769818529655539279036503234072455810991588075181817695975173110136482659854557506203058080551018873203138260451109855100526720073566126209666125604482413705611996796777927332827103568863352291499261312290355143742018042254470707107847293593205234049774839191754781030496978091006099559675240966730110167624903610656473267105556155633783594089546261107653110531808279445757724399186120387548675148632176049190701680305210224388072261974806791922636412897526952793677946622674149577084803568051242934076450942927092705684547042915490323112457971853658760725588190377666477106903106693847278847646032201293023329503348730723947218797410452333910847913892827195814551858335519518939031446093385329182820714173657946661746005901866885589732922652604573972842197231187365263381958925227970038358064987248233271706462687651143350472018043321314534759819524203308490914358596886150053406629512434788155355109100540319857813535695923273426256911552977539394209918630668466632881929661971212772444625151371953428875491139683919687008724010475217255347915698820960215217257390308560235323463096946442080548018754166369706161589705215873687166365628787796501470056870127729464714362172216802441045276911597009443281135389729130222603185665646434661947627628077723219376892727386120519287577405410510114936151502752997122750262781911372625997223415283516995479265631485799456782561734766648462849641064097181818204279498552827825384186202065516999362573388136163077477126602169410435905014077049808497409025369325795765272066650278004200357878990911374982857977108488482528354406313893864211497105765030504600982253488805474531798742143374465080240030582370086699167937651038307909706139327119325418854546478285735654541635477790346964782617354265050767878335230272194896680141986745074630225893106573559558843545841186025169531604151588481389164948914823593944287133336263680358191369540321930649824471425485137777984823525402115151171093313613251350685343824859052220126891551966018355920872775724807128769003243129486808733796350497668255116485157191011858830643898323628223472099280243583164434348347014910398004439821970508280440872759395827943270985008769143562351938091476215083548164137333541883808870019116234099013452929807950151652297436436006149684939775781234660954156154478642694176038524277810483833149798681345708089152179193979463169402340611793486272301808073267534612685593859596787866884211031341417903391749825320454663508370385251831778477311017089729361152161928815389818579983544490982891734081131312309744330960666031291451740885503458543884956367654943799264600314531815427932691107874782328654759293575803481929361961781073958502075438499070633193799699311694287183299423475339817655608058724723221867087563064557636112380829514501382073257737022472866608244164310385205213523702910787182472517125030106491031844871593141759729773907719510044049352857426592936763727969496103940591601975078602859660478614119405428212830134490731706220583788265344728818766885126977588151111984290444321648931907188080336064713873288834096229203276676119810521851726133377700616341304257822975788967472152742255041912584197045423031298506219011800240120182445838590696647416285334515631019799007515682004250060857020904012215375170479800482680554499806010766109655061507421747722461180617361402575082294678925605271083587897845390768226405648508518103525778638618195775128516073959272990148239415346263486966573934577450787243667063244378381883115827207605856174876350045086885320626669331311880593775916269643646395423220549940790476989709243027420158390806135690975149384714684219964938182719962913931464979458639185519531490009437619838306362365453754807654884704163490469296444427144778593725687358437087390151990694667516279202024332494828210657618261952038597230263799412584275851667403910657370879707181053365818502680037431560091209982641738995652793235851569372314130107647166085235615697257094269133100914135783178856280392139325001352841718610484616627448189556913621837791650699820323059708766420810133584841826718631681683381743511974264126250984214812397119978273917903889865891718836792263377888052458189238746074986456016681098722869419588274020181430652732817858728473849369539367463917171317324882099804999043054467247785592038464723442276239896066431580123756428540074945472427752568981171400621705853374875885943072600692576914790467205905272372594740187988081900317493185005142913607163380720069786786782095331840893694073778325119471833528492917081008547303414509381563617864195257751546539575461435803625993888325647883541039192368366987400263049681218831477776345118518503709588840859023379762456561030683928115349942393963185677123055324771693784214924931737043793679546051454845624150270955450608318747395755728950832754611277041359602301205138509175543313522772786504141007552691902249572375175731740923618769197304652898352694386665448260033458575323252814233868098279476166764258284911434288072243178941698347365985427696983129579496059032032841281149923518087084876885114369033227736521245740554711771423492719899982357711910225545480424688322195336240492253136281857837808491795993788199125205555222116581071134476787468430539307909617442106685159519071053844987343666452494280317720153567054364117244775141336558406098548803924509496052261825198043140272655303625315605326569530252885854991822289219201218313590745412010446642247111703901991591338062693320157180618736569439969283245279430312651192668788340033626825194260296262959884258597703584888770801961209652822982322376122303586169861685106043820510444293432856251210395693261264867823980172683352796141772210301725997652373804152525037162852291403804455997331367378463632437773242905518075065414724295857460288225400061608664961649196400079359622673770607898395269075056596627116148289491042491764170924014885106158235482774778418134123293974436877051995673618683751115353808771434984204447736174758316063096245047311279841579995578186609402864244042751443128536278453430633423118662852688374229600894418958824842459450540826176452145829389286103522774101195556029650753254244433565937938526828990893149766298997738359913887178888607190765709867052470880785937935110091424743449966353497865681753841380246075612094033617488674676296822570077027076266879557913673839341012099558043806442348798053951239274913334631522409564461770434875790402230022872647568436177018658068697071731879399180374560963492726714528729224208938589940272515747888379118461617702271694075087419634147298076764775745707026934442908236664400557265527951453482191684597674273691978253678690951178777239573925410438679099374700609973920128201422381329108236575369403675960765238333778127017096574296148321075566959285042221837159799800133563239963969638610872680393210300180152020613051613414547163713772512617757277955979895866367571776456268564191092477027650135832200376440239783726540552694851717269598489288851529660975027775639565229734596726205832668434979354541943345062977891187146561050118118108223323735210843681128615413601091222007912350536959777114306541514511332368936078560929788143798814391221507522370648646767364209132147312407014953113532379838195728491128536978285918066991040993153064356179903885952027952713749653604502053512355449916680887234238773855581636172479594866871765094513940103284167914110196720261110812716776424260154507395050380575452850420730818412994731079307343538376880280124019321040198038723558784544408584344466090982802067326529000931562048932875469079874956595180595395347093285140279165467965596318365749701535812384333240968283640721344003442002691613772056762099098025739332715913970186225176459563484134139746647940170537900275350480490468851439300771949915194703080576611022590670399844931867609777417528903454731922206378932141464755402629420074293816349270038351339419146768473851353171629153912238797141905920143036064131705230421762305232861503856799511155936565169005916711845389135580928162511912438531204156138447775120789548666143600293412065767167106888509172568003530668539460588248316513392652567856224602697296203328920073354425994044956624831346979458846837597950064151867164583749203433942592178528868981311575331848941597492470436782387502687532649093096498315347403977436001399982102030846763698994785054617523241463186980898394504211430763617825306895065661536045431497903759118007934839122881885863091769469883539876840543521295706315919855784493235603866268925981702690270202829595794350800918257913991744455922683343374046671669930219650268554687499e-4951 +-5.46779929782371190379260890042912972459857622354034501558147073054255753295009660521434106293874080779587102102080529665295047844893304825496026211338471350822573387176689751785383789570845033963493234384897511609341047969033029090288686119993125921652327780757456908215307313367394295878957740232139393310129853319126610211888963060953233950845785422003199631793594071800032514400843804841615045854626840829469327828294881838298175674523144370769439505327077912524046992686788101985028712502357968555779098305597496288175991948375220290368919956488030568463545206536359579198829053635210070171697414632960443922662694334080526864190176997186277619487638560405926908417212393004914459916660510317558023267203296664540665686303143487355117536394182579842533190638252470657276648523287454223056426260916178239688724389624700924406883725156778322327128669248001067971134780240835161999919912749368941130062333775184713893949842620045030584554856591000906652415254548036281829022414017017836373531792968500569736393059459388134289532878925936202911959860111289900618887987637185487890257175376747802810055833471650478460459250779148245153313351312860635744071818212363779076932092244234906632899168786207255077931639313903720118757997293301622787489850525574323330053349895193815663640653261384657614561732314168448072640907418419722475454249088439281362536533088134879943284462483896082614443915736191774429072907311631885819175882194201070472653674851414139198108859096891122440647971063242952915458929379913214790617434914900609409461282745336576821301251695869305718994035511225062977631807957323251343409893311558937242893589182127073929977680322999972072084511129714257799395078371652632557642689712118195363229932217741231347266655794602658713781865895628587618356133445842690980622757869697298305457864854014077743134149549581616770960047019414114115927554858644718705151733262444646312957015720874401831783399876629267632412206980788226617090546010735234775446535427950204682560784093064091008748868287818605298248793439879457512520813143459903135506837923488146278624413240301557305921665812510099227873245904315487345753286636286503807226030243834125646514462721175610422077384131141310997310167289350231522394313116195338483765836875091084530867301962551116953524641866782219275647577303198252230493416188536313334782412272272680845833966884362299362668540114271927670393635174916595231338524725341041244411123466156968910970701214636522586812703780765383816975942646584796378630871592938388807529281755454082628134037935686954169983885723045287488247562656656838905184226961694223388061375323047846826624482079286817404761883437391178335259163868151357930349068061174131050087191978828376147382620503202915394941049520564716066454820461766340754590215525559595903549562621278099530136795125074514242718392219467940568610559805583630337329057723569860511809664741164231921947415724386492152042297812796203704453738513487869185273997856308082426571227053818066616162711321820177977936612440784457475475356233845487698185296555392790365032340724558109915880751818176959751731101364826598545575062030580805510188732031382604511098551005267200735661262096661256044824137056119967967779273328271035688633522914992613122903551437420180422544707071078472935932052340497748391917547810304969780910060995596752409667301101676249036106564732671055561556337835940895462611076531105318082794457577243991861203875486751486321760491907016803052102243880722619748067919226364128975269527936779466226741495770848035680512429340764509429270927056845470429154903231124579718536587607255881903776664771069031066938472788476460322012930233295033487307239472187974104523339108479138928271958145518583355195189390314460933853291828207141736579466617460059018668855897329226526045739728421972311873652633819589252279700383580649872482332717064626876511433504720180433213145347598195242033084909143585968861500534066295124347881553551091005403198578135356959232734262569115529775393942099186306684666328819296619712127724446251513719534288754911396839196870087240104752172553479156988209602152172573903085602353234630969464420805480187541663697061615897052158736871663656287877965014700568701277294647143621722168024410452769115970094432811353897291302226031856656464346619476276280777232193768927273861205192875774054105101149361515027529971227502627819113726259972234152835169954792656314857994567825617347666484628496410640971818182042794985528278253841862020655169993625733881361630774771266021694104359050140770498084974090253693257957652720666502780042003578789909113749828579771084884825283544063138938642114971057650305046009822534888054745317987421433744650802400305823700866991679376510383079097061393271193254188545464782857356545416354777903469647826173542650507678783352302721948966801419867450746302258931065735595588435458411860251695316041515884813891649489148235939442871333362636803581913695403219306498244714254851377779848235254021151511710933136132513506853438248590522201268915519660183559208727757248071287690032431294868087337963504976682551164851571910118588306438983236282234720992802435831644343483470149103980044398219705082804408727593958279432709850087691435623519380914762150835481641373335418838088700191162340990134529298079501516522974364360061496849397757812346609541561544786426941760385242778104838331497986813457080891521791939794631694023406117934862723018080732675346126855938595967878668842110313414179033917498253204546635083703852518317784773110170897293611521619288153898185799835444909828917340811313123097443309606660312914517408855034585438849563676549437992646003145318154279326911078747823286547592935758034819293619617810739585020754384990706331937996993116942871832994234753398176556080587247232218670875630645576361123808295145013820732577370224728666082441643103852052135237029107871824725171250301064910318448715931417597297739077195100440493528574265929367637279694961039405916019750786028596604786141194054282128301344907317062205837882653447288187668851269775881511119842904443216489319071880803360647138732888340962292032766761198105218517261333777006163413042578229757889674721527422550419125841970454230312985062190118002401201824458385906966474162853345156310197990075156820042500608570209040122153751704798004826805544998060107661096550615074217477224611806173614025750822946789256052710835878978453907682264056485085181035257786386181957751285160739592729901482394153462634869665739345774507872436670632443783818831158272076058561748763500450868853206266693313118805937759162696436463954232205499407904769897092430274201583908061356909751493847146842199649381827199629139314649794586391855195314900094376198383063623654537548076548847041634904692964444271447785937256873584370873901519906946675162792020243324948282106576182619520385972302637994125842758516674039106573708797071810533658185026800374315600912099826417389956527932358515693723141301076471660852356156972570942691331009141357831788562803921393250013528417186104846166274481895569136218377916506998203230597087664208101335848418267186316816833817435119742641262509842148123971199782739179038898658917188367922633778880524581892387460749864560166810987228694195882740201814306527328178587284738493695393674639171713173248820998049990430544672477855920384647234422762398960664315801237564285400749454724277525689811714006217058533748758859430726006925769147904672059052723725947401879880819003174931850051429136071633807200697867867820953318408936940737783251194718335284929170810085473034145093815636178641952577515465395754614358036259938883256478835410391923683669874002630496812188314777763451185185037095888408590233797624565610306839281153499423939631856771230553247716937842149249317370437936795460514548456241502709554506083187473957557289508327546112770413596023012051385091755433135227727865041410075526919022495723751757317409236187691973046528983526943866654482600334585753232528142338680982794761667642582849114342880722431789416983473659854276969831295794960590320328412811499235180870848768851143690332277365212457405547117714234927198999823577119102255454804246883221953362404922531362818578378084917959937881991252055552221165810711344767874684305393079096174421066851595190710538449873436664524942803177201535670543641172447751413365584060985488039245094960522618251980431402726553036253156053265695302528858549918222892192012183135907454120104466422471117039019915913380626933201571806187365694399692832452794303126511926687883400336268251942602962629598842585977035848887708019612096528229823223761223035861698616851060438205104442934328562512103956932612648678239801726833527961417722103017259976523738041525250371628522914038044559973313673784636324377732429055180750654147242958574602882254000616086649616491964000793596226737706078983952690750565966271161482894910424917641709240148851061582354827747784181341232939744368770519956736186837511153538087714349842044477361747583160630962450473112798415799955781866094028642440427514431285362784534306334231186628526883742296008944189588248424594505408261764521458293892861035227741011955560296507532542444335659379385268289908931497662989977383599138871788886071907657098670524708807859379351100914247434499663534978656817538413802460756120940336174886746762968225700770270762668795579136738393410120995580438064423487980539512392749133346315224095644617704348757904022300228726475684361770186580686970717318793991803745609634927267145287292242089385899402725157478883791184616177022716940750874196341472980767647757457070269344429082366644005572655279514534821916845976742736919782536786909511787772395739254104386790993747006099739201282014223813291082365753694036759607652383337781270170965742961483210755669592850422218371597998001335632399639696386108726803932103001801520206130516134145471637137725126177572779559798958663675717764562685641910924770276501358322003764402397837265405526948517172695984892888515296609750277756395652297345967262058326684349793545419433450629778911871465610501181181082233237352108436811286154136010912220079123505369597771143065415145113323689360785609297881437988143912215075223706486467673642091321473124070149531135323798381957284911285369782859180669910409931530643561799038859520279527137496536045020535123554499166808872342387738555816361724795948668717650945139401032841679141101967202611108127167764242601545073950503805754528504207308184129947310793073435383768802801240193210401980387235587845444085843444660909828020673265290009315620489328754690798749565951805953953470932851402791654679655963183657497015358123843332409682836407213440034420026916137720567620990980257393327159139701862251764595634841341397466479401705379002753504804904688514393007719499151947030805766110225906703998449318676097774175289034547319222063789321414647554026294200742938163492700383513394191467684738513531716291539122387971419059201430360641317052304217623052328615038567995111559365651690059167118453891355809281625119124385312041561384477751207895486661436002934120657671671068885091725680035306685394605882483165133926525678562246026972962033289200733544259940449566248313469794588468375979500641518671645837492034339425921785288689813115753318489415974924704367823875026875326490930964983153474039774360013999821020308467636989947850546175232414631869808983945042114307636178253068950656615360454314979037591180079348391228818858630917694698835398768405435212957063159198557844932356038662689259817026902702028295957943508009182579139917444559226833433740466716699302196502685546875e-4951 +-5.4677992978237119037926089004291297245985762235403450155814707305425575329500966052143410629387408077958710210208052966529504784489330482549602621133847135082257338717668975178538378957084503396349323438489751160934104796903302909028868611999312592165232778075745690821530731336739429587895774023213939331012985331912661021188896306095323395084578542200319963179359407180003251440084380484161504585462684082946932782829488183829817567452314437076943950532707791252404699268678810198502871250235796855577909830559749628817599194837522029036891995648803056846354520653635957919882905363521007017169741463296044392266269433408052686419017699718627761948763856040592690841721239300491445991666051031755802326720329666454066568630314348735511753639418257984253319063825247065727664852328745422305642626091617823968872438962470092440688372515677832232712866924800106797113478024083516199991991274936894113006233377518471389394984262004503058455485659100090665241525454803628182902241401701783637353179296850056973639305945938813428953287892593620291195986011128990061888798763718548789025717537674780281005583347165047846045925077914824515331335131286063574407181821236377907693209224423490663289916878620725507793163931390372011875799729330162278748985052557432333005334989519381566364065326138465761456173231416844807264090741841972247545424908843928136253653308813487994328446248389608261444391573619177442907290731163188581917588219420107047265367485141413919810885909689112244064797106324295291545892937991321479061743491490060940946128274533657682130125169586930571899403551122506297763180795732325134340989331155893724289358918212707392997768032299997207208451112971425779939507837165263255764268971211819536322993221774123134726665579460265871378186589562858761835613344584269098062275786969729830545786485401407774313414954958161677096004701941411411592755485864471870515173326244464631295701572087440183178339987662926763241220698078822661709054601073523477544653542795020468256078409306409100874886828781860529824879343987945751252081314345990313550683792348814627862441324030155730592166581251009922787324590431548734575328663628650380722603024383412564651446272117561042207738413114131099731016728935023152239431311619533848376583687509108453086730196255111695352464186678221927564757730319825223049341618853631333478241227227268084583396688436229936266854011427192767039363517491659523133852472534104124441112346615696891097070121463652258681270378076538381697594264658479637863087159293838880752928175545408262813403793568695416998388572304528748824756265665683890518422696169422338806137532304784682662448207928681740476188343739117833525916386815135793034906806117413105008719197882837614738262050320291539494104952056471606645482046176634075459021552555959590354956262127809953013679512507451424271839221946794056861055980558363033732905772356986051180966474116423192194741572438649215204229781279620370445373851348786918527399785630808242657122705381806661616271132182017797793661244078445747547535623384548769818529655539279036503234072455810991588075181817695975173110136482659854557506203058080551018873203138260451109855100526720073566126209666125604482413705611996796777927332827103568863352291499261312290355143742018042254470707107847293593205234049774839191754781030496978091006099559675240966730110167624903610656473267105556155633783594089546261107653110531808279445757724399186120387548675148632176049190701680305210224388072261974806791922636412897526952793677946622674149577084803568051242934076450942927092705684547042915490323112457971853658760725588190377666477106903106693847278847646032201293023329503348730723947218797410452333910847913892827195814551858335519518939031446093385329182820714173657946661746005901866885589732922652604573972842197231187365263381958925227970038358064987248233271706462687651143350472018043321314534759819524203308490914358596886150053406629512434788155355109100540319857813535695923273426256911552977539394209918630668466632881929661971212772444625151371953428875491139683919687008724010475217255347915698820960215217257390308560235323463096946442080548018754166369706161589705215873687166365628787796501470056870127729464714362172216802441045276911597009443281135389729130222603185665646434661947627628077723219376892727386120519287577405410510114936151502752997122750262781911372625997223415283516995479265631485799456782561734766648462849641064097181818204279498552827825384186202065516999362573388136163077477126602169410435905014077049808497409025369325795765272066650278004200357878990911374982857977108488482528354406313893864211497105765030504600982253488805474531798742143374465080240030582370086699167937651038307909706139327119325418854546478285735654541635477790346964782617354265050767878335230272194896680141986745074630225893106573559558843545841186025169531604151588481389164948914823593944287133336263680358191369540321930649824471425485137777984823525402115151171093313613251350685343824859052220126891551966018355920872775724807128769003243129486808733796350497668255116485157191011858830643898323628223472099280243583164434348347014910398004439821970508280440872759395827943270985008769143562351938091476215083548164137333541883808870019116234099013452929807950151652297436436006149684939775781234660954156154478642694176038524277810483833149798681345708089152179193979463169402340611793486272301808073267534612685593859596787866884211031341417903391749825320454663508370385251831778477311017089729361152161928815389818579983544490982891734081131312309744330960666031291451740885503458543884956367654943799264600314531815427932691107874782328654759293575803481929361961781073958502075438499070633193799699311694287183299423475339817655608058724723221867087563064557636112380829514501382073257737022472866608244164310385205213523702910787182472517125030106491031844871593141759729773907719510044049352857426592936763727969496103940591601975078602859660478614119405428212830134490731706220583788265344728818766885126977588151111984290444321648931907188080336064713873288834096229203276676119810521851726133377700616341304257822975788967472152742255041912584197045423031298506219011800240120182445838590696647416285334515631019799007515682004250060857020904012215375170479800482680554499806010766109655061507421747722461180617361402575082294678925605271083587897845390768226405648508518103525778638618195775128516073959272990148239415346263486966573934577450787243667063244378381883115827207605856174876350045086885320626669331311880593775916269643646395423220549940790476989709243027420158390806135690975149384714684219964938182719962913931464979458639185519531490009437619838306362365453754807654884704163490469296444427144778593725687358437087390151990694667516279202024332494828210657618261952038597230263799412584275851667403910657370879707181053365818502680037431560091209982641738995652793235851569372314130107647166085235615697257094269133100914135783178856280392139325001352841718610484616627448189556913621837791650699820323059708766420810133584841826718631681683381743511974264126250984214812397119978273917903889865891718836792263377888052458189238746074986456016681098722869419588274020181430652732817858728473849369539367463917171317324882099804999043054467247785592038464723442276239896066431580123756428540074945472427752568981171400621705853374875885943072600692576914790467205905272372594740187988081900317493185005142913607163380720069786786782095331840893694073778325119471833528492917081008547303414509381563617864195257751546539575461435803625993888325647883541039192368366987400263049681218831477776345118518503709588840859023379762456561030683928115349942393963185677123055324771693784214924931737043793679546051454845624150270955450608318747395755728950832754611277041359602301205138509175543313522772786504141007552691902249572375175731740923618769197304652898352694386665448260033458575323252814233868098279476166764258284911434288072243178941698347365985427696983129579496059032032841281149923518087084876885114369033227736521245740554711771423492719899982357711910225545480424688322195336240492253136281857837808491795993788199125205555222116581071134476787468430539307909617442106685159519071053844987343666452494280317720153567054364117244775141336558406098548803924509496052261825198043140272655303625315605326569530252885854991822289219201218313590745412010446642247111703901991591338062693320157180618736569439969283245279430312651192668788340033626825194260296262959884258597703584888770801961209652822982322376122303586169861685106043820510444293432856251210395693261264867823980172683352796141772210301725997652373804152525037162852291403804455997331367378463632437773242905518075065414724295857460288225400061608664961649196400079359622673770607898395269075056596627116148289491042491764170924014885106158235482774778418134123293974436877051995673618683751115353808771434984204447736174758316063096245047311279841579995578186609402864244042751443128536278453430633423118662852688374229600894418958824842459450540826176452145829389286103522774101195556029650753254244433565937938526828990893149766298997738359913887178888607190765709867052470880785937935110091424743449966353497865681753841380246075612094033617488674676296822570077027076266879557913673839341012099558043806442348798053951239274913334631522409564461770434875790402230022872647568436177018658068697071731879399180374560963492726714528729224208938589940272515747888379118461617702271694075087419634147298076764775745707026934442908236664400557265527951453482191684597674273691978253678690951178777239573925410438679099374700609973920128201422381329108236575369403675960765238333778127017096574296148321075566959285042221837159799800133563239963969638610872680393210300180152020613051613414547163713772512617757277955979895866367571776456268564191092477027650135832200376440239783726540552694851717269598489288851529660975027775639565229734596726205832668434979354541943345062977891187146561050118118108223323735210843681128615413601091222007912350536959777114306541514511332368936078560929788143798814391221507522370648646767364209132147312407014953113532379838195728491128536978285918066991040993153064356179903885952027952713749653604502053512355449916680887234238773855581636172479594866871765094513940103284167914110196720261110812716776424260154507395050380575452850420730818412994731079307343538376880280124019321040198038723558784544408584344466090982802067326529000931562048932875469079874956595180595395347093285140279165467965596318365749701535812384333240968283640721344003442002691613772056762099098025739332715913970186225176459563484134139746647940170537900275350480490468851439300771949915194703080576611022590670399844931867609777417528903454731922206378932141464755402629420074293816349270038351339419146768473851353171629153912238797141905920143036064131705230421762305232861503856799511155936565169005916711845389135580928162511912438531204156138447775120789548666143600293412065767167106888509172568003530668539460588248316513392652567856224602697296203328920073354425994044956624831346979458846837597950064151867164583749203433942592178528868981311575331848941597492470436782387502687532649093096498315347403977436001399982102030846763698994785054617523241463186980898394504211430763617825306895065661536045431497903759118007934839122881885863091769469883539876840543521295706315919855784493235603866268925981702690270202829595794350800918257913991744455922683343374046671669930219650268554687501e-4951 +5.4677992978237119037926089004291297245985762235403450155814707305425575329500966052143410629387408077958710210208052966529504784489330482549602621133847135082257338717668975178538378957084503396349323438489751160934104796903302909028868611999312592165232778075745690821530731336739429587895774023213939331012985331912661021188896306095323395084578542200319963179359407180003251440084380484161504585462684082946932782829488183829817567452314437076943950532707791252404699268678810198502871250235796855577909830559749628817599194837522029036891995648803056846354520653635957919882905363521007017169741463296044392266269433408052686419017699718627761948763856040592690841721239300491445991666051031755802326720329666454066568630314348735511753639418257984253319063825247065727664852328745422305642626091617823968872438962470092440688372515677832232712866924800106797113478024083516199991991274936894113006233377518471389394984262004503058455485659100090665241525454803628182902241401701783637353179296850056973639305945938813428953287892593620291195986011128990061888798763718548789025717537674780281005583347165047846045925077914824515331335131286063574407181821236377907693209224423490663289916878620725507793163931390372011875799729330162278748985052557432333005334989519381566364065326138465761456173231416844807264090741841972247545424908843928136253653308813487994328446248389608261444391573619177442907290731163188581917588219420107047265367485141413919810885909689112244064797106324295291545892937991321479061743491490060940946128274533657682130125169586930571899403551122506297763180795732325134340989331155893724289358918212707392997768032299997207208451112971425779939507837165263255764268971211819536322993221774123134726665579460265871378186589562858761835613344584269098062275786969729830545786485401407774313414954958161677096004701941411411592755485864471870515173326244464631295701572087440183178339987662926763241220698078822661709054601073523477544653542795020468256078409306409100874886828781860529824879343987945751252081314345990313550683792348814627862441324030155730592166581251009922787324590431548734575328663628650380722603024383412564651446272117561042207738413114131099731016728935023152239431311619533848376583687509108453086730196255111695352464186678221927564757730319825223049341618853631333478241227227268084583396688436229936266854011427192767039363517491659523133852472534104124441112346615696891097070121463652258681270378076538381697594264658479637863087159293838880752928175545408262813403793568695416998388572304528748824756265665683890518422696169422338806137532304784682662448207928681740476188343739117833525916386815135793034906806117413105008719197882837614738262050320291539494104952056471606645482046176634075459021552555959590354956262127809953013679512507451424271839221946794056861055980558363033732905772356986051180966474116423192194741572438649215204229781279620370445373851348786918527399785630808242657122705381806661616271132182017797793661244078445747547535623384548769818529655539279036503234072455810991588075181817695975173110136482659854557506203058080551018873203138260451109855100526720073566126209666125604482413705611996796777927332827103568863352291499261312290355143742018042254470707107847293593205234049774839191754781030496978091006099559675240966730110167624903610656473267105556155633783594089546261107653110531808279445757724399186120387548675148632176049190701680305210224388072261974806791922636412897526952793677946622674149577084803568051242934076450942927092705684547042915490323112457971853658760725588190377666477106903106693847278847646032201293023329503348730723947218797410452333910847913892827195814551858335519518939031446093385329182820714173657946661746005901866885589732922652604573972842197231187365263381958925227970038358064987248233271706462687651143350472018043321314534759819524203308490914358596886150053406629512434788155355109100540319857813535695923273426256911552977539394209918630668466632881929661971212772444625151371953428875491139683919687008724010475217255347915698820960215217257390308560235323463096946442080548018754166369706161589705215873687166365628787796501470056870127729464714362172216802441045276911597009443281135389729130222603185665646434661947627628077723219376892727386120519287577405410510114936151502752997122750262781911372625997223415283516995479265631485799456782561734766648462849641064097181818204279498552827825384186202065516999362573388136163077477126602169410435905014077049808497409025369325795765272066650278004200357878990911374982857977108488482528354406313893864211497105765030504600982253488805474531798742143374465080240030582370086699167937651038307909706139327119325418854546478285735654541635477790346964782617354265050767878335230272194896680141986745074630225893106573559558843545841186025169531604151588481389164948914823593944287133336263680358191369540321930649824471425485137777984823525402115151171093313613251350685343824859052220126891551966018355920872775724807128769003243129486808733796350497668255116485157191011858830643898323628223472099280243583164434348347014910398004439821970508280440872759395827943270985008769143562351938091476215083548164137333541883808870019116234099013452929807950151652297436436006149684939775781234660954156154478642694176038524277810483833149798681345708089152179193979463169402340611793486272301808073267534612685593859596787866884211031341417903391749825320454663508370385251831778477311017089729361152161928815389818579983544490982891734081131312309744330960666031291451740885503458543884956367654943799264600314531815427932691107874782328654759293575803481929361961781073958502075438499070633193799699311694287183299423475339817655608058724723221867087563064557636112380829514501382073257737022472866608244164310385205213523702910787182472517125030106491031844871593141759729773907719510044049352857426592936763727969496103940591601975078602859660478614119405428212830134490731706220583788265344728818766885126977588151111984290444321648931907188080336064713873288834096229203276676119810521851726133377700616341304257822975788967472152742255041912584197045423031298506219011800240120182445838590696647416285334515631019799007515682004250060857020904012215375170479800482680554499806010766109655061507421747722461180617361402575082294678925605271083587897845390768226405648508518103525778638618195775128516073959272990148239415346263486966573934577450787243667063244378381883115827207605856174876350045086885320626669331311880593775916269643646395423220549940790476989709243027420158390806135690975149384714684219964938182719962913931464979458639185519531490009437619838306362365453754807654884704163490469296444427144778593725687358437087390151990694667516279202024332494828210657618261952038597230263799412584275851667403910657370879707181053365818502680037431560091209982641738995652793235851569372314130107647166085235615697257094269133100914135783178856280392139325001352841718610484616627448189556913621837791650699820323059708766420810133584841826718631681683381743511974264126250984214812397119978273917903889865891718836792263377888052458189238746074986456016681098722869419588274020181430652732817858728473849369539367463917171317324882099804999043054467247785592038464723442276239896066431580123756428540074945472427752568981171400621705853374875885943072600692576914790467205905272372594740187988081900317493185005142913607163380720069786786782095331840893694073778325119471833528492917081008547303414509381563617864195257751546539575461435803625993888325647883541039192368366987400263049681218831477776345118518503709588840859023379762456561030683928115349942393963185677123055324771693784214924931737043793679546051454845624150270955450608318747395755728950832754611277041359602301205138509175543313522772786504141007552691902249572375175731740923618769197304652898352694386665448260033458575323252814233868098279476166764258284911434288072243178941698347365985427696983129579496059032032841281149923518087084876885114369033227736521245740554711771423492719899982357711910225545480424688322195336240492253136281857837808491795993788199125205555222116581071134476787468430539307909617442106685159519071053844987343666452494280317720153567054364117244775141336558406098548803924509496052261825198043140272655303625315605326569530252885854991822289219201218313590745412010446642247111703901991591338062693320157180618736569439969283245279430312651192668788340033626825194260296262959884258597703584888770801961209652822982322376122303586169861685106043820510444293432856251210395693261264867823980172683352796141772210301725997652373804152525037162852291403804455997331367378463632437773242905518075065414724295857460288225400061608664961649196400079359622673770607898395269075056596627116148289491042491764170924014885106158235482774778418134123293974436877051995673618683751115353808771434984204447736174758316063096245047311279841579995578186609402864244042751443128536278453430633423118662852688374229600894418958824842459450540826176452145829389286103522774101195556029650753254244433565937938526828990893149766298997738359913887178888607190765709867052470880785937935110091424743449966353497865681753841380246075612094033617488674676296822570077027076266879557913673839341012099558043806442348798053951239274913334631522409564461770434875790402230022872647568436177018658068697071731879399180374560963492726714528729224208938589940272515747888379118461617702271694075087419634147298076764775745707026934442908236664400557265527951453482191684597674273691978253678690951178777239573925410438679099374700609973920128201422381329108236575369403675960765238333778127017096574296148321075566959285042221837159799800133563239963969638610872680393210300180152020613051613414547163713772512617757277955979895866367571776456268564191092477027650135832200376440239783726540552694851717269598489288851529660975027775639565229734596726205832668434979354541943345062977891187146561050118118108223323735210843681128615413601091222007912350536959777114306541514511332368936078560929788143798814391221507522370648646767364209132147312407014953113532379838195728491128536978285918066991040993153064356179903885952027952713749653604502053512355449916680887234238773855581636172479594866871765094513940103284167914110196720261110812716776424260154507395050380575452850420730818412994731079307343538376880280124019321040198038723558784544408584344466090982802067326529000931562048932875469079874956595180595395347093285140279165467965596318365749701535812384333240968283640721344003442002691613772056762099098025739332715913970186225176459563484134139746647940170537900275350480490468851439300771949915194703080576611022590670399844931867609777417528903454731922206378932141464755402629420074293816349270038351339419146768473851353171629153912238797141905920143036064131705230421762305232861503856799511155936565169005916711845389135580928162511912438531204156138447775120789548666143600293412065767167106888509172568003530668539460588248316513392652567856224602697296203328920073354425994044956624831346979458846837597950064151867164583749203433942592178528868981311575331848941597492470436782387502687532649093096498315347403977436001399982102030846763698994785054617523241463186980898394504211430763617825306895065661536045431497903759118007934839122881885863091769469883539876840543521295706315919855784493235603866268925981702690270202829595794350800918257913991744455922683343374046671669930219650268554687499e-4951 +5.46779929782371190379260890042912972459857622354034501558147073054255753295009660521434106293874080779587102102080529665295047844893304825496026211338471350822573387176689751785383789570845033963493234384897511609341047969033029090288686119993125921652327780757456908215307313367394295878957740232139393310129853319126610211888963060953233950845785422003199631793594071800032514400843804841615045854626840829469327828294881838298175674523144370769439505327077912524046992686788101985028712502357968555779098305597496288175991948375220290368919956488030568463545206536359579198829053635210070171697414632960443922662694334080526864190176997186277619487638560405926908417212393004914459916660510317558023267203296664540665686303143487355117536394182579842533190638252470657276648523287454223056426260916178239688724389624700924406883725156778322327128669248001067971134780240835161999919912749368941130062333775184713893949842620045030584554856591000906652415254548036281829022414017017836373531792968500569736393059459388134289532878925936202911959860111289900618887987637185487890257175376747802810055833471650478460459250779148245153313351312860635744071818212363779076932092244234906632899168786207255077931639313903720118757997293301622787489850525574323330053349895193815663640653261384657614561732314168448072640907418419722475454249088439281362536533088134879943284462483896082614443915736191774429072907311631885819175882194201070472653674851414139198108859096891122440647971063242952915458929379913214790617434914900609409461282745336576821301251695869305718994035511225062977631807957323251343409893311558937242893589182127073929977680322999972072084511129714257799395078371652632557642689712118195363229932217741231347266655794602658713781865895628587618356133445842690980622757869697298305457864854014077743134149549581616770960047019414114115927554858644718705151733262444646312957015720874401831783399876629267632412206980788226617090546010735234775446535427950204682560784093064091008748868287818605298248793439879457512520813143459903135506837923488146278624413240301557305921665812510099227873245904315487345753286636286503807226030243834125646514462721175610422077384131141310997310167289350231522394313116195338483765836875091084530867301962551116953524641866782219275647577303198252230493416188536313334782412272272680845833966884362299362668540114271927670393635174916595231338524725341041244411123466156968910970701214636522586812703780765383816975942646584796378630871592938388807529281755454082628134037935686954169983885723045287488247562656656838905184226961694223388061375323047846826624482079286817404761883437391178335259163868151357930349068061174131050087191978828376147382620503202915394941049520564716066454820461766340754590215525559595903549562621278099530136795125074514242718392219467940568610559805583630337329057723569860511809664741164231921947415724386492152042297812796203704453738513487869185273997856308082426571227053818066616162711321820177977936612440784457475475356233845487698185296555392790365032340724558109915880751818176959751731101364826598545575062030580805510188732031382604511098551005267200735661262096661256044824137056119967967779273328271035688633522914992613122903551437420180422544707071078472935932052340497748391917547810304969780910060995596752409667301101676249036106564732671055561556337835940895462611076531105318082794457577243991861203875486751486321760491907016803052102243880722619748067919226364128975269527936779466226741495770848035680512429340764509429270927056845470429154903231124579718536587607255881903776664771069031066938472788476460322012930233295033487307239472187974104523339108479138928271958145518583355195189390314460933853291828207141736579466617460059018668855897329226526045739728421972311873652633819589252279700383580649872482332717064626876511433504720180433213145347598195242033084909143585968861500534066295124347881553551091005403198578135356959232734262569115529775393942099186306684666328819296619712127724446251513719534288754911396839196870087240104752172553479156988209602152172573903085602353234630969464420805480187541663697061615897052158736871663656287877965014700568701277294647143621722168024410452769115970094432811353897291302226031856656464346619476276280777232193768927273861205192875774054105101149361515027529971227502627819113726259972234152835169954792656314857994567825617347666484628496410640971818182042794985528278253841862020655169993625733881361630774771266021694104359050140770498084974090253693257957652720666502780042003578789909113749828579771084884825283544063138938642114971057650305046009822534888054745317987421433744650802400305823700866991679376510383079097061393271193254188545464782857356545416354777903469647826173542650507678783352302721948966801419867450746302258931065735595588435458411860251695316041515884813891649489148235939442871333362636803581913695403219306498244714254851377779848235254021151511710933136132513506853438248590522201268915519660183559208727757248071287690032431294868087337963504976682551164851571910118588306438983236282234720992802435831644343483470149103980044398219705082804408727593958279432709850087691435623519380914762150835481641373335418838088700191162340990134529298079501516522974364360061496849397757812346609541561544786426941760385242778104838331497986813457080891521791939794631694023406117934862723018080732675346126855938595967878668842110313414179033917498253204546635083703852518317784773110170897293611521619288153898185799835444909828917340811313123097443309606660312914517408855034585438849563676549437992646003145318154279326911078747823286547592935758034819293619617810739585020754384990706331937996993116942871832994234753398176556080587247232218670875630645576361123808295145013820732577370224728666082441643103852052135237029107871824725171250301064910318448715931417597297739077195100440493528574265929367637279694961039405916019750786028596604786141194054282128301344907317062205837882653447288187668851269775881511119842904443216489319071880803360647138732888340962292032766761198105218517261333777006163413042578229757889674721527422550419125841970454230312985062190118002401201824458385906966474162853345156310197990075156820042500608570209040122153751704798004826805544998060107661096550615074217477224611806173614025750822946789256052710835878978453907682264056485085181035257786386181957751285160739592729901482394153462634869665739345774507872436670632443783818831158272076058561748763500450868853206266693313118805937759162696436463954232205499407904769897092430274201583908061356909751493847146842199649381827199629139314649794586391855195314900094376198383063623654537548076548847041634904692964444271447785937256873584370873901519906946675162792020243324948282106576182619520385972302637994125842758516674039106573708797071810533658185026800374315600912099826417389956527932358515693723141301076471660852356156972570942691331009141357831788562803921393250013528417186104846166274481895569136218377916506998203230597087664208101335848418267186316816833817435119742641262509842148123971199782739179038898658917188367922633778880524581892387460749864560166810987228694195882740201814306527328178587284738493695393674639171713173248820998049990430544672477855920384647234422762398960664315801237564285400749454724277525689811714006217058533748758859430726006925769147904672059052723725947401879880819003174931850051429136071633807200697867867820953318408936940737783251194718335284929170810085473034145093815636178641952577515465395754614358036259938883256478835410391923683669874002630496812188314777763451185185037095888408590233797624565610306839281153499423939631856771230553247716937842149249317370437936795460514548456241502709554506083187473957557289508327546112770413596023012051385091755433135227727865041410075526919022495723751757317409236187691973046528983526943866654482600334585753232528142338680982794761667642582849114342880722431789416983473659854276969831295794960590320328412811499235180870848768851143690332277365212457405547117714234927198999823577119102255454804246883221953362404922531362818578378084917959937881991252055552221165810711344767874684305393079096174421066851595190710538449873436664524942803177201535670543641172447751413365584060985488039245094960522618251980431402726553036253156053265695302528858549918222892192012183135907454120104466422471117039019915913380626933201571806187365694399692832452794303126511926687883400336268251942602962629598842585977035848887708019612096528229823223761223035861698616851060438205104442934328562512103956932612648678239801726833527961417722103017259976523738041525250371628522914038044559973313673784636324377732429055180750654147242958574602882254000616086649616491964000793596226737706078983952690750565966271161482894910424917641709240148851061582354827747784181341232939744368770519956736186837511153538087714349842044477361747583160630962450473112798415799955781866094028642440427514431285362784534306334231186628526883742296008944189588248424594505408261764521458293892861035227741011955560296507532542444335659379385268289908931497662989977383599138871788886071907657098670524708807859379351100914247434499663534978656817538413802460756120940336174886746762968225700770270762668795579136738393410120995580438064423487980539512392749133346315224095644617704348757904022300228726475684361770186580686970717318793991803745609634927267145287292242089385899402725157478883791184616177022716940750874196341472980767647757457070269344429082366644005572655279514534821916845976742736919782536786909511787772395739254104386790993747006099739201282014223813291082365753694036759607652383337781270170965742961483210755669592850422218371597998001335632399639696386108726803932103001801520206130516134145471637137725126177572779559798958663675717764562685641910924770276501358322003764402397837265405526948517172695984892888515296609750277756395652297345967262058326684349793545419433450629778911871465610501181181082233237352108436811286154136010912220079123505369597771143065415145113323689360785609297881437988143912215075223706486467673642091321473124070149531135323798381957284911285369782859180669910409931530643561799038859520279527137496536045020535123554499166808872342387738555816361724795948668717650945139401032841679141101967202611108127167764242601545073950503805754528504207308184129947310793073435383768802801240193210401980387235587845444085843444660909828020673265290009315620489328754690798749565951805953953470932851402791654679655963183657497015358123843332409682836407213440034420026916137720567620990980257393327159139701862251764595634841341397466479401705379002753504804904688514393007719499151947030805766110225906703998449318676097774175289034547319222063789321414647554026294200742938163492700383513394191467684738513531716291539122387971419059201430360641317052304217623052328615038567995111559365651690059167118453891355809281625119124385312041561384477751207895486661436002934120657671671068885091725680035306685394605882483165133926525678562246026972962033289200733544259940449566248313469794588468375979500641518671645837492034339425921785288689813115753318489415974924704367823875026875326490930964983153474039774360013999821020308467636989947850546175232414631869808983945042114307636178253068950656615360454314979037591180079348391228818858630917694698835398768405435212957063159198557844932356038662689259817026902702028295957943508009182579139917444559226833433740466716699302196502685546875e-4951 +5.4677992978237119037926089004291297245985762235403450155814707305425575329500966052143410629387408077958710210208052966529504784489330482549602621133847135082257338717668975178538378957084503396349323438489751160934104796903302909028868611999312592165232778075745690821530731336739429587895774023213939331012985331912661021188896306095323395084578542200319963179359407180003251440084380484161504585462684082946932782829488183829817567452314437076943950532707791252404699268678810198502871250235796855577909830559749628817599194837522029036891995648803056846354520653635957919882905363521007017169741463296044392266269433408052686419017699718627761948763856040592690841721239300491445991666051031755802326720329666454066568630314348735511753639418257984253319063825247065727664852328745422305642626091617823968872438962470092440688372515677832232712866924800106797113478024083516199991991274936894113006233377518471389394984262004503058455485659100090665241525454803628182902241401701783637353179296850056973639305945938813428953287892593620291195986011128990061888798763718548789025717537674780281005583347165047846045925077914824515331335131286063574407181821236377907693209224423490663289916878620725507793163931390372011875799729330162278748985052557432333005334989519381566364065326138465761456173231416844807264090741841972247545424908843928136253653308813487994328446248389608261444391573619177442907290731163188581917588219420107047265367485141413919810885909689112244064797106324295291545892937991321479061743491490060940946128274533657682130125169586930571899403551122506297763180795732325134340989331155893724289358918212707392997768032299997207208451112971425779939507837165263255764268971211819536322993221774123134726665579460265871378186589562858761835613344584269098062275786969729830545786485401407774313414954958161677096004701941411411592755485864471870515173326244464631295701572087440183178339987662926763241220698078822661709054601073523477544653542795020468256078409306409100874886828781860529824879343987945751252081314345990313550683792348814627862441324030155730592166581251009922787324590431548734575328663628650380722603024383412564651446272117561042207738413114131099731016728935023152239431311619533848376583687509108453086730196255111695352464186678221927564757730319825223049341618853631333478241227227268084583396688436229936266854011427192767039363517491659523133852472534104124441112346615696891097070121463652258681270378076538381697594264658479637863087159293838880752928175545408262813403793568695416998388572304528748824756265665683890518422696169422338806137532304784682662448207928681740476188343739117833525916386815135793034906806117413105008719197882837614738262050320291539494104952056471606645482046176634075459021552555959590354956262127809953013679512507451424271839221946794056861055980558363033732905772356986051180966474116423192194741572438649215204229781279620370445373851348786918527399785630808242657122705381806661616271132182017797793661244078445747547535623384548769818529655539279036503234072455810991588075181817695975173110136482659854557506203058080551018873203138260451109855100526720073566126209666125604482413705611996796777927332827103568863352291499261312290355143742018042254470707107847293593205234049774839191754781030496978091006099559675240966730110167624903610656473267105556155633783594089546261107653110531808279445757724399186120387548675148632176049190701680305210224388072261974806791922636412897526952793677946622674149577084803568051242934076450942927092705684547042915490323112457971853658760725588190377666477106903106693847278847646032201293023329503348730723947218797410452333910847913892827195814551858335519518939031446093385329182820714173657946661746005901866885589732922652604573972842197231187365263381958925227970038358064987248233271706462687651143350472018043321314534759819524203308490914358596886150053406629512434788155355109100540319857813535695923273426256911552977539394209918630668466632881929661971212772444625151371953428875491139683919687008724010475217255347915698820960215217257390308560235323463096946442080548018754166369706161589705215873687166365628787796501470056870127729464714362172216802441045276911597009443281135389729130222603185665646434661947627628077723219376892727386120519287577405410510114936151502752997122750262781911372625997223415283516995479265631485799456782561734766648462849641064097181818204279498552827825384186202065516999362573388136163077477126602169410435905014077049808497409025369325795765272066650278004200357878990911374982857977108488482528354406313893864211497105765030504600982253488805474531798742143374465080240030582370086699167937651038307909706139327119325418854546478285735654541635477790346964782617354265050767878335230272194896680141986745074630225893106573559558843545841186025169531604151588481389164948914823593944287133336263680358191369540321930649824471425485137777984823525402115151171093313613251350685343824859052220126891551966018355920872775724807128769003243129486808733796350497668255116485157191011858830643898323628223472099280243583164434348347014910398004439821970508280440872759395827943270985008769143562351938091476215083548164137333541883808870019116234099013452929807950151652297436436006149684939775781234660954156154478642694176038524277810483833149798681345708089152179193979463169402340611793486272301808073267534612685593859596787866884211031341417903391749825320454663508370385251831778477311017089729361152161928815389818579983544490982891734081131312309744330960666031291451740885503458543884956367654943799264600314531815427932691107874782328654759293575803481929361961781073958502075438499070633193799699311694287183299423475339817655608058724723221867087563064557636112380829514501382073257737022472866608244164310385205213523702910787182472517125030106491031844871593141759729773907719510044049352857426592936763727969496103940591601975078602859660478614119405428212830134490731706220583788265344728818766885126977588151111984290444321648931907188080336064713873288834096229203276676119810521851726133377700616341304257822975788967472152742255041912584197045423031298506219011800240120182445838590696647416285334515631019799007515682004250060857020904012215375170479800482680554499806010766109655061507421747722461180617361402575082294678925605271083587897845390768226405648508518103525778638618195775128516073959272990148239415346263486966573934577450787243667063244378381883115827207605856174876350045086885320626669331311880593775916269643646395423220549940790476989709243027420158390806135690975149384714684219964938182719962913931464979458639185519531490009437619838306362365453754807654884704163490469296444427144778593725687358437087390151990694667516279202024332494828210657618261952038597230263799412584275851667403910657370879707181053365818502680037431560091209982641738995652793235851569372314130107647166085235615697257094269133100914135783178856280392139325001352841718610484616627448189556913621837791650699820323059708766420810133584841826718631681683381743511974264126250984214812397119978273917903889865891718836792263377888052458189238746074986456016681098722869419588274020181430652732817858728473849369539367463917171317324882099804999043054467247785592038464723442276239896066431580123756428540074945472427752568981171400621705853374875885943072600692576914790467205905272372594740187988081900317493185005142913607163380720069786786782095331840893694073778325119471833528492917081008547303414509381563617864195257751546539575461435803625993888325647883541039192368366987400263049681218831477776345118518503709588840859023379762456561030683928115349942393963185677123055324771693784214924931737043793679546051454845624150270955450608318747395755728950832754611277041359602301205138509175543313522772786504141007552691902249572375175731740923618769197304652898352694386665448260033458575323252814233868098279476166764258284911434288072243178941698347365985427696983129579496059032032841281149923518087084876885114369033227736521245740554711771423492719899982357711910225545480424688322195336240492253136281857837808491795993788199125205555222116581071134476787468430539307909617442106685159519071053844987343666452494280317720153567054364117244775141336558406098548803924509496052261825198043140272655303625315605326569530252885854991822289219201218313590745412010446642247111703901991591338062693320157180618736569439969283245279430312651192668788340033626825194260296262959884258597703584888770801961209652822982322376122303586169861685106043820510444293432856251210395693261264867823980172683352796141772210301725997652373804152525037162852291403804455997331367378463632437773242905518075065414724295857460288225400061608664961649196400079359622673770607898395269075056596627116148289491042491764170924014885106158235482774778418134123293974436877051995673618683751115353808771434984204447736174758316063096245047311279841579995578186609402864244042751443128536278453430633423118662852688374229600894418958824842459450540826176452145829389286103522774101195556029650753254244433565937938526828990893149766298997738359913887178888607190765709867052470880785937935110091424743449966353497865681753841380246075612094033617488674676296822570077027076266879557913673839341012099558043806442348798053951239274913334631522409564461770434875790402230022872647568436177018658068697071731879399180374560963492726714528729224208938589940272515747888379118461617702271694075087419634147298076764775745707026934442908236664400557265527951453482191684597674273691978253678690951178777239573925410438679099374700609973920128201422381329108236575369403675960765238333778127017096574296148321075566959285042221837159799800133563239963969638610872680393210300180152020613051613414547163713772512617757277955979895866367571776456268564191092477027650135832200376440239783726540552694851717269598489288851529660975027775639565229734596726205832668434979354541943345062977891187146561050118118108223323735210843681128615413601091222007912350536959777114306541514511332368936078560929788143798814391221507522370648646767364209132147312407014953113532379838195728491128536978285918066991040993153064356179903885952027952713749653604502053512355449916680887234238773855581636172479594866871765094513940103284167914110196720261110812716776424260154507395050380575452850420730818412994731079307343538376880280124019321040198038723558784544408584344466090982802067326529000931562048932875469079874956595180595395347093285140279165467965596318365749701535812384333240968283640721344003442002691613772056762099098025739332715913970186225176459563484134139746647940170537900275350480490468851439300771949915194703080576611022590670399844931867609777417528903454731922206378932141464755402629420074293816349270038351339419146768473851353171629153912238797141905920143036064131705230421762305232861503856799511155936565169005916711845389135580928162511912438531204156138447775120789548666143600293412065767167106888509172568003530668539460588248316513392652567856224602697296203328920073354425994044956624831346979458846837597950064151867164583749203433942592178528868981311575331848941597492470436782387502687532649093096498315347403977436001399982102030846763698994785054617523241463186980898394504211430763617825306895065661536045431497903759118007934839122881885863091769469883539876840543521295706315919855784493235603866268925981702690270202829595794350800918257913991744455922683343374046671669930219650268554687501e-4951 +-5.4677992978237119037926089004291297245985762235403450155814707305425575329500966052143410629387408077958710210208052966529504784489330482549602621133847135082257338717668975178538378957084503396349323438489751160934104796903302909028868611999312592165232778075745690821530731336739429587895774023213939331012985331912661021188896306095323395084578542200319963179359407180003251440084380484161504585462684082946932782829488183829817567452314437076943950532707791252404699268678810198502871250235796855577909830559749628817599194837522029036891995648803056846354520653635957919882905363521007017169741463296044392266269433408052686419017699718627761948763856040592690841721239300491445991666051031755802326720329666454066568630314348735511753639418257984253319063825247065727664852328745422305642626091617823968872438962470092440688372515677832232712866924800106797113478024083516199991991274936894113006233377518471389394984262004503058455485659100090665241525454803628182902241401701783637353179296850056973639305945938813428953287892593620291195986011128990061888798763718548789025717537674780281005583347165047846045925077914824515331335131286063574407181821236377907693209224423490663289916878620725507793163931390372011875799729330162278748985052557432333005334989519381566364065326138465761456173231416844807264090741841972247545424908843928136253653308813487994328446248389608261444391573619177442907290731163188581917588219420107047265367485141413919810885909689112244064797106324295291545892937991321479061743491490060940946128274533657682130125169586930571899403551122506297763180795732325134340989331155893724289358918212707392997768032299997207208451112971425779939507837165263255764268971211819536322993221774123134726665579460265871378186589562858761835613344584269098062275786969729830545786485401407774313414954958161677096004701941411411592755485864471870515173326244464631295701572087440183178339987662926763241220698078822661709054601073523477544653542795020468256078409306409100874886828781860529824879343987945751252081314345990313550683792348814627862441324030155730592166581251009922787324590431548734575328663628650380722603024383412564651446272117561042207738413114131099731016728935023152239431311619533848376583687509108453086730196255111695352464186678221927564757730319825223049341618853631333478241227227268084583396688436229936266854011427192767039363517491659523133852472534104124441112346615696891097070121463652258681270378076538381697594264658479637863087159293838880752928175545408262813403793568695416998388572304528748824756265665683890518422696169422338806137532304784682662448207928681740476188343739117833525916386815135793034906806117413105008719197882837614738262050320291539494104952056471606645482046176634075459021552555959590354956262127809953013679512507451424271839221946794056861055980558363033732905772356986051180966474116423192194741572438649215204229781279620370445373851348786918527399785630808242657122705381806661616271132182017797793661244078445747547535623384548769818529655539279036503234072455810991588075181817695975173110136482659854557506203058080551018873203138260451109855100526720073566126209666125604482413705611996796777927332827103568863352291499261312290355143742018042254470707107847293593205234049774839191754781030496978091006099559675240966730110167624903610656473267105556155633783594089546261107653110531808279445757724399186120387548675148632176049190701680305210224388072261974806791922636412897526952793677946622674149577084803568051242934076450942927092705684547042915490323112457971853658760725588190377666477106903106693847278847646032201293023329503348730723947218797410452333910847913892827195814551858335519518939031446093385329182820714173657946661746005901866885589732922652604573972842197231187365263381958925227970038358064987248233271706462687651143350472018043321314534759819524203308490914358596886150053406629512434788155355109100540319857813535695923273426256911552977539394209918630668466632881929661971212772444625151371953428875491139683919687008724010475217255347915698820960215217257390308560235323463096946442080548018754166369706161589705215873687166365628787796501470056870127729464714362172216802441045276911597009443281135389729130222603185665646434661947627628077723219376892727386120519287577405410510114936151502752997122750262781911372625997223415283516995479265631485799456782561734766648462849641064097181818204279498552827825384186202065516999362573388136163077477126602169410435905014077049808497409025369325795765272066650278004200357878990911374982857977108488482528354406313893864211497105765030504600982253488805474531798742143374465080240030582370086699167937651038307909706139327119325418854546478285735654541635477790346964782617354265050767878335230272194896680141986745074630225893106573559558843545841186025169531604151588481389164948914823593944287133336263680358191369540321930649824471425485137777984823525402115151171093313613251350685343824859052220126891551966018355920872775724807128769003243129486808733796350497668255116485157191011858830643898323628223472099280243583164434348347014910398004439821970508280440872759395827943270985008769143562351938091476215083548164137333541883808870019116234099013452929807950151652297436436006149684939775781234660954156154478642694176038524277810483833149798681345708089152179193979463169402340611793486272301808073267534612685593859596787866884211031341417903391749825320454663508370385251831778477311017089729361152161928815389818579983544490982891734081131312309744330960666031291451740885503458543884956367654943799264600314531815427932691107874782328654759293575803481929361961781073958502075438499070633193799699311694287183299423475339817655608058724723221867087563064557636112380829514501382073257737022472866608244164310385205213523702910787182472517125030106491031844871593141759729773907719510044049352857426592936763727969496103940591601975078602859660478614119405428212830134490731706220583788265344728818766885126977588151111984290444321648931907188080336064713873288834096229203276676119810521851726133377700616341304257822975788967472152742255041912584197045423031298506219011800240120182445838590696647416285334515631019799007515682004250060857020904012215375170479800482680554499806010766109655061507421747722461180617361402575082294678925605271083587897845390768226405648508518103525778638618195775128516073959272990148239415346263486966573934577450787243667063244378381883115827207605856174876350045086885320626669331311880593775916269643646395423220549940790476989709243027420158390806135690975149384714684219964938182719962913931464979458639185519531490009437619838306362365453754807654884704163490469296444427144778593725687358437087390151990694667516279202024332494828210657618261952038597230263799412584275851667403910657370879707181053365818502680037431560091209982641738995652793235851569372314130107647166085235615697257094269133100914135783178856280392139325001352841718610484616627448189556913621837791650699820323059708766420810133584841826718631681683381743511974264126250984214812397119978273917903889865891718836792263377888052458189238746074986456016681098722869419588274020181430652732817858728473849369539367463917171317324882099804999043054467247785592038464723442276239896066431580123756428540074945472427752568981171400621705853374875885943072600692576914790467205905272372594740187988081900317493185005142913607163380720069786786782095331840893694073778325119471833528492917081008547303414509381563617864195257751546539575461435803625993888325647883541039192368366987400263049681218831477776345118518503709588840859023379762456561030683928115349942393963185677123055324771693784214924931737043793679546051454845624150270955450608318747395755728950832754611277041359602301205138509175543313522772786504141007552691902249572375175731740923618769197304652898352694386665448260033458575323252814233868098279476166764258284911434288072243178941698347365985427696983129579496059032032841281149923518087084876885114369033227736521245740554711771423492719899982357711910225545480424688322195336240492253136281857837808491795993788199125205555222116581071134476787468430539307909617442106685159519071053844987343666452494280317720153567054364117244775141336558406098548803924509496052261825198043140272655303625315605326569530252885854991822289219201218313590745412010446642247111703901991591338062693320157180618736569439969283245279430312651192668788340033626825194260296262959884258597703584888770801961209652822982322376122303586169861685106043820510444293432856251210395693261264867823980172683352796141772210301725997652373804152525037162852291403804455997331367378463632437773242905518075065414724295857460288225400061608664961649196400079359622673770607898395269075056596627116148289491042491764170924014885106158235482774778418134123293974436877051995673618683751115353808771434984204447736174758316063096245047311279841579995578186609402864244042751443128536278453430633423118662852688374229600894418958824842459450540826176452145829389286103522774101195556029650753254244433565937938526828990893149766298997738359913887178888607190765709867052470880785937935110091424743449966353497865681753841380246075612094033617488674676296822570077027076266879557913673839341012099558043806442348798053951239274913334631522409564461770434875790402230022872647568436177018658068697071731879399180374560963492726714528729224208938589940272515747888379118461617702271694075087419634147298076764775745707026934442908236664400557265527951453482191684597674273691978253678690951178777239573925410438679099374700609973920128201422381329108236575369403675960765238333778127017096574296148321075566959285042221837159799800133563239963969638610872680393210300180152020613051613414547163713772512617757277955979895866367571776456268564191092477027650135832200376440239783726540552694851717269598489288851529660975027775639565229734596726205832668434979354541943345062977891187146561050118118108223323735210843681128615413601091222007912350536959777114306541514511332368936078560929788143798814391221507522370648646767364209132147312407014953113532379838195728491128536978285918066991040993153064356179903885952027952713749653604502053512355449916680887234238773855581636172479594866871765094513940103284167914110196720261110812716776424260154507395050380575452850420730818412994731079307343538376880280124019321040198038723558784544408584344466090982802067326529000931562048932875469079874956595180595395347093285140279165467965596318365749701535812384333240968283640721344003442002691613772056762099098025739332715913970186225176459563484134139746647940170537900275350480490468851439300771949915194703080576611022590670399844931867609777417528903454731922206378932141464755402629420074293816349270038351339419146768473851353171629153912238797141905920143036064131705230421762305232861503856799511155936565169005916711845389135580928162511912438531204156138447775120789548666143600293412065767167106888509172568003530668539460588248316513392652567856224602697296203328920073354425994044956624831346979458846837597950064151867164583749203433942592178528868981311575331848941597492470436782387502687532649093096498315347403977436001399982102030846763698994785054617523241463186980898394504211430763617825306895065661536045431497903759118007934839122881885863091769469883539876840543521295706315919855784493235603866268925981702690270202829595794350800918257913991744455922683343374046671669930219650268554687499e-4951 +-5.46779929782371190379260890042912972459857622354034501558147073054255753295009660521434106293874080779587102102080529665295047844893304825496026211338471350822573387176689751785383789570845033963493234384897511609341047969033029090288686119993125921652327780757456908215307313367394295878957740232139393310129853319126610211888963060953233950845785422003199631793594071800032514400843804841615045854626840829469327828294881838298175674523144370769439505327077912524046992686788101985028712502357968555779098305597496288175991948375220290368919956488030568463545206536359579198829053635210070171697414632960443922662694334080526864190176997186277619487638560405926908417212393004914459916660510317558023267203296664540665686303143487355117536394182579842533190638252470657276648523287454223056426260916178239688724389624700924406883725156778322327128669248001067971134780240835161999919912749368941130062333775184713893949842620045030584554856591000906652415254548036281829022414017017836373531792968500569736393059459388134289532878925936202911959860111289900618887987637185487890257175376747802810055833471650478460459250779148245153313351312860635744071818212363779076932092244234906632899168786207255077931639313903720118757997293301622787489850525574323330053349895193815663640653261384657614561732314168448072640907418419722475454249088439281362536533088134879943284462483896082614443915736191774429072907311631885819175882194201070472653674851414139198108859096891122440647971063242952915458929379913214790617434914900609409461282745336576821301251695869305718994035511225062977631807957323251343409893311558937242893589182127073929977680322999972072084511129714257799395078371652632557642689712118195363229932217741231347266655794602658713781865895628587618356133445842690980622757869697298305457864854014077743134149549581616770960047019414114115927554858644718705151733262444646312957015720874401831783399876629267632412206980788226617090546010735234775446535427950204682560784093064091008748868287818605298248793439879457512520813143459903135506837923488146278624413240301557305921665812510099227873245904315487345753286636286503807226030243834125646514462721175610422077384131141310997310167289350231522394313116195338483765836875091084530867301962551116953524641866782219275647577303198252230493416188536313334782412272272680845833966884362299362668540114271927670393635174916595231338524725341041244411123466156968910970701214636522586812703780765383816975942646584796378630871592938388807529281755454082628134037935686954169983885723045287488247562656656838905184226961694223388061375323047846826624482079286817404761883437391178335259163868151357930349068061174131050087191978828376147382620503202915394941049520564716066454820461766340754590215525559595903549562621278099530136795125074514242718392219467940568610559805583630337329057723569860511809664741164231921947415724386492152042297812796203704453738513487869185273997856308082426571227053818066616162711321820177977936612440784457475475356233845487698185296555392790365032340724558109915880751818176959751731101364826598545575062030580805510188732031382604511098551005267200735661262096661256044824137056119967967779273328271035688633522914992613122903551437420180422544707071078472935932052340497748391917547810304969780910060995596752409667301101676249036106564732671055561556337835940895462611076531105318082794457577243991861203875486751486321760491907016803052102243880722619748067919226364128975269527936779466226741495770848035680512429340764509429270927056845470429154903231124579718536587607255881903776664771069031066938472788476460322012930233295033487307239472187974104523339108479138928271958145518583355195189390314460933853291828207141736579466617460059018668855897329226526045739728421972311873652633819589252279700383580649872482332717064626876511433504720180433213145347598195242033084909143585968861500534066295124347881553551091005403198578135356959232734262569115529775393942099186306684666328819296619712127724446251513719534288754911396839196870087240104752172553479156988209602152172573903085602353234630969464420805480187541663697061615897052158736871663656287877965014700568701277294647143621722168024410452769115970094432811353897291302226031856656464346619476276280777232193768927273861205192875774054105101149361515027529971227502627819113726259972234152835169954792656314857994567825617347666484628496410640971818182042794985528278253841862020655169993625733881361630774771266021694104359050140770498084974090253693257957652720666502780042003578789909113749828579771084884825283544063138938642114971057650305046009822534888054745317987421433744650802400305823700866991679376510383079097061393271193254188545464782857356545416354777903469647826173542650507678783352302721948966801419867450746302258931065735595588435458411860251695316041515884813891649489148235939442871333362636803581913695403219306498244714254851377779848235254021151511710933136132513506853438248590522201268915519660183559208727757248071287690032431294868087337963504976682551164851571910118588306438983236282234720992802435831644343483470149103980044398219705082804408727593958279432709850087691435623519380914762150835481641373335418838088700191162340990134529298079501516522974364360061496849397757812346609541561544786426941760385242778104838331497986813457080891521791939794631694023406117934862723018080732675346126855938595967878668842110313414179033917498253204546635083703852518317784773110170897293611521619288153898185799835444909828917340811313123097443309606660312914517408855034585438849563676549437992646003145318154279326911078747823286547592935758034819293619617810739585020754384990706331937996993116942871832994234753398176556080587247232218670875630645576361123808295145013820732577370224728666082441643103852052135237029107871824725171250301064910318448715931417597297739077195100440493528574265929367637279694961039405916019750786028596604786141194054282128301344907317062205837882653447288187668851269775881511119842904443216489319071880803360647138732888340962292032766761198105218517261333777006163413042578229757889674721527422550419125841970454230312985062190118002401201824458385906966474162853345156310197990075156820042500608570209040122153751704798004826805544998060107661096550615074217477224611806173614025750822946789256052710835878978453907682264056485085181035257786386181957751285160739592729901482394153462634869665739345774507872436670632443783818831158272076058561748763500450868853206266693313118805937759162696436463954232205499407904769897092430274201583908061356909751493847146842199649381827199629139314649794586391855195314900094376198383063623654537548076548847041634904692964444271447785937256873584370873901519906946675162792020243324948282106576182619520385972302637994125842758516674039106573708797071810533658185026800374315600912099826417389956527932358515693723141301076471660852356156972570942691331009141357831788562803921393250013528417186104846166274481895569136218377916506998203230597087664208101335848418267186316816833817435119742641262509842148123971199782739179038898658917188367922633778880524581892387460749864560166810987228694195882740201814306527328178587284738493695393674639171713173248820998049990430544672477855920384647234422762398960664315801237564285400749454724277525689811714006217058533748758859430726006925769147904672059052723725947401879880819003174931850051429136071633807200697867867820953318408936940737783251194718335284929170810085473034145093815636178641952577515465395754614358036259938883256478835410391923683669874002630496812188314777763451185185037095888408590233797624565610306839281153499423939631856771230553247716937842149249317370437936795460514548456241502709554506083187473957557289508327546112770413596023012051385091755433135227727865041410075526919022495723751757317409236187691973046528983526943866654482600334585753232528142338680982794761667642582849114342880722431789416983473659854276969831295794960590320328412811499235180870848768851143690332277365212457405547117714234927198999823577119102255454804246883221953362404922531362818578378084917959937881991252055552221165810711344767874684305393079096174421066851595190710538449873436664524942803177201535670543641172447751413365584060985488039245094960522618251980431402726553036253156053265695302528858549918222892192012183135907454120104466422471117039019915913380626933201571806187365694399692832452794303126511926687883400336268251942602962629598842585977035848887708019612096528229823223761223035861698616851060438205104442934328562512103956932612648678239801726833527961417722103017259976523738041525250371628522914038044559973313673784636324377732429055180750654147242958574602882254000616086649616491964000793596226737706078983952690750565966271161482894910424917641709240148851061582354827747784181341232939744368770519956736186837511153538087714349842044477361747583160630962450473112798415799955781866094028642440427514431285362784534306334231186628526883742296008944189588248424594505408261764521458293892861035227741011955560296507532542444335659379385268289908931497662989977383599138871788886071907657098670524708807859379351100914247434499663534978656817538413802460756120940336174886746762968225700770270762668795579136738393410120995580438064423487980539512392749133346315224095644617704348757904022300228726475684361770186580686970717318793991803745609634927267145287292242089385899402725157478883791184616177022716940750874196341472980767647757457070269344429082366644005572655279514534821916845976742736919782536786909511787772395739254104386790993747006099739201282014223813291082365753694036759607652383337781270170965742961483210755669592850422218371597998001335632399639696386108726803932103001801520206130516134145471637137725126177572779559798958663675717764562685641910924770276501358322003764402397837265405526948517172695984892888515296609750277756395652297345967262058326684349793545419433450629778911871465610501181181082233237352108436811286154136010912220079123505369597771143065415145113323689360785609297881437988143912215075223706486467673642091321473124070149531135323798381957284911285369782859180669910409931530643561799038859520279527137496536045020535123554499166808872342387738555816361724795948668717650945139401032841679141101967202611108127167764242601545073950503805754528504207308184129947310793073435383768802801240193210401980387235587845444085843444660909828020673265290009315620489328754690798749565951805953953470932851402791654679655963183657497015358123843332409682836407213440034420026916137720567620990980257393327159139701862251764595634841341397466479401705379002753504804904688514393007719499151947030805766110225906703998449318676097774175289034547319222063789321414647554026294200742938163492700383513394191467684738513531716291539122387971419059201430360641317052304217623052328615038567995111559365651690059167118453891355809281625119124385312041561384477751207895486661436002934120657671671068885091725680035306685394605882483165133926525678562246026972962033289200733544259940449566248313469794588468375979500641518671645837492034339425921785288689813115753318489415974924704367823875026875326490930964983153474039774360013999821020308467636989947850546175232414631869808983945042114307636178253068950656615360454314979037591180079348391228818858630917694698835398768405435212957063159198557844932356038662689259817026902702028295957943508009182579139917444559226833433740466716699302196502685546875e-4951 +-5.4677992978237119037926089004291297245985762235403450155814707305425575329500966052143410629387408077958710210208052966529504784489330482549602621133847135082257338717668975178538378957084503396349323438489751160934104796903302909028868611999312592165232778075745690821530731336739429587895774023213939331012985331912661021188896306095323395084578542200319963179359407180003251440084380484161504585462684082946932782829488183829817567452314437076943950532707791252404699268678810198502871250235796855577909830559749628817599194837522029036891995648803056846354520653635957919882905363521007017169741463296044392266269433408052686419017699718627761948763856040592690841721239300491445991666051031755802326720329666454066568630314348735511753639418257984253319063825247065727664852328745422305642626091617823968872438962470092440688372515677832232712866924800106797113478024083516199991991274936894113006233377518471389394984262004503058455485659100090665241525454803628182902241401701783637353179296850056973639305945938813428953287892593620291195986011128990061888798763718548789025717537674780281005583347165047846045925077914824515331335131286063574407181821236377907693209224423490663289916878620725507793163931390372011875799729330162278748985052557432333005334989519381566364065326138465761456173231416844807264090741841972247545424908843928136253653308813487994328446248389608261444391573619177442907290731163188581917588219420107047265367485141413919810885909689112244064797106324295291545892937991321479061743491490060940946128274533657682130125169586930571899403551122506297763180795732325134340989331155893724289358918212707392997768032299997207208451112971425779939507837165263255764268971211819536322993221774123134726665579460265871378186589562858761835613344584269098062275786969729830545786485401407774313414954958161677096004701941411411592755485864471870515173326244464631295701572087440183178339987662926763241220698078822661709054601073523477544653542795020468256078409306409100874886828781860529824879343987945751252081314345990313550683792348814627862441324030155730592166581251009922787324590431548734575328663628650380722603024383412564651446272117561042207738413114131099731016728935023152239431311619533848376583687509108453086730196255111695352464186678221927564757730319825223049341618853631333478241227227268084583396688436229936266854011427192767039363517491659523133852472534104124441112346615696891097070121463652258681270378076538381697594264658479637863087159293838880752928175545408262813403793568695416998388572304528748824756265665683890518422696169422338806137532304784682662448207928681740476188343739117833525916386815135793034906806117413105008719197882837614738262050320291539494104952056471606645482046176634075459021552555959590354956262127809953013679512507451424271839221946794056861055980558363033732905772356986051180966474116423192194741572438649215204229781279620370445373851348786918527399785630808242657122705381806661616271132182017797793661244078445747547535623384548769818529655539279036503234072455810991588075181817695975173110136482659854557506203058080551018873203138260451109855100526720073566126209666125604482413705611996796777927332827103568863352291499261312290355143742018042254470707107847293593205234049774839191754781030496978091006099559675240966730110167624903610656473267105556155633783594089546261107653110531808279445757724399186120387548675148632176049190701680305210224388072261974806791922636412897526952793677946622674149577084803568051242934076450942927092705684547042915490323112457971853658760725588190377666477106903106693847278847646032201293023329503348730723947218797410452333910847913892827195814551858335519518939031446093385329182820714173657946661746005901866885589732922652604573972842197231187365263381958925227970038358064987248233271706462687651143350472018043321314534759819524203308490914358596886150053406629512434788155355109100540319857813535695923273426256911552977539394209918630668466632881929661971212772444625151371953428875491139683919687008724010475217255347915698820960215217257390308560235323463096946442080548018754166369706161589705215873687166365628787796501470056870127729464714362172216802441045276911597009443281135389729130222603185665646434661947627628077723219376892727386120519287577405410510114936151502752997122750262781911372625997223415283516995479265631485799456782561734766648462849641064097181818204279498552827825384186202065516999362573388136163077477126602169410435905014077049808497409025369325795765272066650278004200357878990911374982857977108488482528354406313893864211497105765030504600982253488805474531798742143374465080240030582370086699167937651038307909706139327119325418854546478285735654541635477790346964782617354265050767878335230272194896680141986745074630225893106573559558843545841186025169531604151588481389164948914823593944287133336263680358191369540321930649824471425485137777984823525402115151171093313613251350685343824859052220126891551966018355920872775724807128769003243129486808733796350497668255116485157191011858830643898323628223472099280243583164434348347014910398004439821970508280440872759395827943270985008769143562351938091476215083548164137333541883808870019116234099013452929807950151652297436436006149684939775781234660954156154478642694176038524277810483833149798681345708089152179193979463169402340611793486272301808073267534612685593859596787866884211031341417903391749825320454663508370385251831778477311017089729361152161928815389818579983544490982891734081131312309744330960666031291451740885503458543884956367654943799264600314531815427932691107874782328654759293575803481929361961781073958502075438499070633193799699311694287183299423475339817655608058724723221867087563064557636112380829514501382073257737022472866608244164310385205213523702910787182472517125030106491031844871593141759729773907719510044049352857426592936763727969496103940591601975078602859660478614119405428212830134490731706220583788265344728818766885126977588151111984290444321648931907188080336064713873288834096229203276676119810521851726133377700616341304257822975788967472152742255041912584197045423031298506219011800240120182445838590696647416285334515631019799007515682004250060857020904012215375170479800482680554499806010766109655061507421747722461180617361402575082294678925605271083587897845390768226405648508518103525778638618195775128516073959272990148239415346263486966573934577450787243667063244378381883115827207605856174876350045086885320626669331311880593775916269643646395423220549940790476989709243027420158390806135690975149384714684219964938182719962913931464979458639185519531490009437619838306362365453754807654884704163490469296444427144778593725687358437087390151990694667516279202024332494828210657618261952038597230263799412584275851667403910657370879707181053365818502680037431560091209982641738995652793235851569372314130107647166085235615697257094269133100914135783178856280392139325001352841718610484616627448189556913621837791650699820323059708766420810133584841826718631681683381743511974264126250984214812397119978273917903889865891718836792263377888052458189238746074986456016681098722869419588274020181430652732817858728473849369539367463917171317324882099804999043054467247785592038464723442276239896066431580123756428540074945472427752568981171400621705853374875885943072600692576914790467205905272372594740187988081900317493185005142913607163380720069786786782095331840893694073778325119471833528492917081008547303414509381563617864195257751546539575461435803625993888325647883541039192368366987400263049681218831477776345118518503709588840859023379762456561030683928115349942393963185677123055324771693784214924931737043793679546051454845624150270955450608318747395755728950832754611277041359602301205138509175543313522772786504141007552691902249572375175731740923618769197304652898352694386665448260033458575323252814233868098279476166764258284911434288072243178941698347365985427696983129579496059032032841281149923518087084876885114369033227736521245740554711771423492719899982357711910225545480424688322195336240492253136281857837808491795993788199125205555222116581071134476787468430539307909617442106685159519071053844987343666452494280317720153567054364117244775141336558406098548803924509496052261825198043140272655303625315605326569530252885854991822289219201218313590745412010446642247111703901991591338062693320157180618736569439969283245279430312651192668788340033626825194260296262959884258597703584888770801961209652822982322376122303586169861685106043820510444293432856251210395693261264867823980172683352796141772210301725997652373804152525037162852291403804455997331367378463632437773242905518075065414724295857460288225400061608664961649196400079359622673770607898395269075056596627116148289491042491764170924014885106158235482774778418134123293974436877051995673618683751115353808771434984204447736174758316063096245047311279841579995578186609402864244042751443128536278453430633423118662852688374229600894418958824842459450540826176452145829389286103522774101195556029650753254244433565937938526828990893149766298997738359913887178888607190765709867052470880785937935110091424743449966353497865681753841380246075612094033617488674676296822570077027076266879557913673839341012099558043806442348798053951239274913334631522409564461770434875790402230022872647568436177018658068697071731879399180374560963492726714528729224208938589940272515747888379118461617702271694075087419634147298076764775745707026934442908236664400557265527951453482191684597674273691978253678690951178777239573925410438679099374700609973920128201422381329108236575369403675960765238333778127017096574296148321075566959285042221837159799800133563239963969638610872680393210300180152020613051613414547163713772512617757277955979895866367571776456268564191092477027650135832200376440239783726540552694851717269598489288851529660975027775639565229734596726205832668434979354541943345062977891187146561050118118108223323735210843681128615413601091222007912350536959777114306541514511332368936078560929788143798814391221507522370648646767364209132147312407014953113532379838195728491128536978285918066991040993153064356179903885952027952713749653604502053512355449916680887234238773855581636172479594866871765094513940103284167914110196720261110812716776424260154507395050380575452850420730818412994731079307343538376880280124019321040198038723558784544408584344466090982802067326529000931562048932875469079874956595180595395347093285140279165467965596318365749701535812384333240968283640721344003442002691613772056762099098025739332715913970186225176459563484134139746647940170537900275350480490468851439300771949915194703080576611022590670399844931867609777417528903454731922206378932141464755402629420074293816349270038351339419146768473851353171629153912238797141905920143036064131705230421762305232861503856799511155936565169005916711845389135580928162511912438531204156138447775120789548666143600293412065767167106888509172568003530668539460588248316513392652567856224602697296203328920073354425994044956624831346979458846837597950064151867164583749203433942592178528868981311575331848941597492470436782387502687532649093096498315347403977436001399982102030846763698994785054617523241463186980898394504211430763617825306895065661536045431497903759118007934839122881885863091769469883539876840543521295706315919855784493235603866268925981702690270202829595794350800918257913991744455922683343374046671669930219650268554687501e-4951 +-0x0.7p-149 +-0x0.7p-1074 +-0x0.7p-16445 +-0x0.7p-16494 +0x1p-150 +0x1p-1075 +0x1p-16446 +0x1p-16495 +-0x1p-150 +-0x1p-1075 +-0x1p-16446 +-0x1p-16495 +.70064923216240853546186479164495807e-45 +7.00649232162408535461864791644958065640130970938257885878534141944895541342930300743319094181060791015624e-46 +7.00649232162408535461864791644958065640130970938257885878534141944895541342930300743319094181060791015625e-46 +7.00649232162408535461864791644958065640130970938257885878534141944895541342930300743319094181060791015626e-46 +-7.00649232162408535461864791644958065640130970938257885878534141944895541342930300743319094181060791015624e-46 +-7.00649232162408535461864791644958065640130970938257885878534141944895541342930300743319094181060791015625e-46 +-7.00649232162408535461864791644958065640130970938257885878534141944895541342930300743319094181060791015626e-46 +2.4703282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772285886546332835517796989819938739800539093906315035659515570226392290858392449105184435931802849936536152500319370457678249219365623669863658480757001585769269903706311928279558551332927834338409351978015531246597263579574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324673600968951340535537458516661134223766678604162159680461914467291840300530057530849048765391711386591646239524912623653881879636239373280423891018672348497668235089863388587925628302755995657524455507255189313690836254779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328124e-324 +2.4703282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772285886546332835517796989819938739800539093906315035659515570226392290858392449105184435931802849936536152500319370457678249219365623669863658480757001585769269903706311928279558551332927834338409351978015531246597263579574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324673600968951340535537458516661134223766678604162159680461914467291840300530057530849048765391711386591646239524912623653881879636239373280423891018672348497668235089863388587925628302755995657524455507255189313690836254779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328125e-324 +2.4703282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772285886546332835517796989819938739800539093906315035659515570226392290858392449105184435931802849936536152500319370457678249219365623669863658480757001585769269903706311928279558551332927834338409351978015531246597263579574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324673600968951340535537458516661134223766678604162159680461914467291840300530057530849048765391711386591646239524912623653881879636239373280423891018672348497668235089863388587925628302755995657524455507255189313690836254779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328126e-324 +-2.4703282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772285886546332835517796989819938739800539093906315035659515570226392290858392449105184435931802849936536152500319370457678249219365623669863658480757001585769269903706311928279558551332927834338409351978015531246597263579574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324673600968951340535537458516661134223766678604162159680461914467291840300530057530849048765391711386591646239524912623653881879636239373280423891018672348497668235089863388587925628302755995657524455507255189313690836254779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328124e-324 +-2.4703282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772285886546332835517796989819938739800539093906315035659515570226392290858392449105184435931802849936536152500319370457678249219365623669863658480757001585769269903706311928279558551332927834338409351978015531246597263579574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324673600968951340535537458516661134223766678604162159680461914467291840300530057530849048765391711386591646239524912623653881879636239373280423891018672348497668235089863388587925628302755995657524455507255189313690836254779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328125e-324 +-2.4703282292062327208828439643411068618252990130716238221279284125033775363510437593264991818081799618989828234772285886546332835517796989819938739800539093906315035659515570226392290858392449105184435931802849936536152500319370457678249219365623669863658480757001585769269903706311928279558551332927834338409351978015531246597263579574622766465272827220056374006485499977096599470454020828166226237857393450736339007967761930577506740176324673600968951340535537458516661134223766678604162159680461914467291840300530057530849048765391711386591646239524912623653881879636239373280423891018672348497668235089863388587925628302755995657524455507255189313690836254779186948667994968324049705821028513185451396213837722826145437693412532098591327667236328126e-324 +1.82259976594123730126420296680970990819952540784678167186049024351418584431669886840478035431291360259862367367360176555098349281631101608498675403779490450274191129058896583928461263190281677987831078128299170536447015989677676363429562039997708640550775926919152302738435771122464765292985913410713131103376617773042203403962987686984411316948595140667733210597864690600010838133614601613871681951542280276489775942764960612766058558174381456923146501775692637508015664228929367328342904167452656185259699435199165429391997316125073430122973318829343522821181735512119859732943017878403356723899138210986814640887564778026842288063392332395425873162546186801975636139070797668304819972220170105852674422401098888180221895434381162451705845464727526614177730212750823552425549507762484741018808753638726079896241463208233641468961241718926107442376223082667022657044926746945053999973304249789647043354111258394904631316614206681676861518285530333635550805084849345427276340804672339278791177264322833523245464353153129378096510959641978734303986620037096633539629329212395162630085725125582600936685277823883492820153083593049415051104450437620211914690606070787926358977364081411635544299722928735751692643879771301240039585999097767207595829950175191441110017783298397938554546884420461552538187244104722816024213635806139907491818083029479760454178844362711626647761487494632027538147971912063924809690969103877295273058627398067023490884558283804713066036286365630374146882657021080984305152976459971071596872478304966869803153760915112192273767083898623101906331345170408354325877269319107750447803297770519645747631196394042357976659226774333324024028170376571419266465026123884210852547563237372731787743310739247077115755551931534219571260621965209529206118711148614230326874252623232432768485954951338025914378049849860538923653349006471371371975851619548239568383911087481548770985671906958133943927799958876422544137402326929408872363515336911744925148845142650068227520261364354697002916289429272868432749597813293152504173604381153301045168945974496048759541471080100519101973888604170033075957748634771829115251095545428834602408676747944708548838154240391870140692461377047103665770055763116743840798104372065112827921945625030361510289100654183705651174880622260739758549192434399417410164472062845437778260804090757560281944655628120766454222846704757309223464545058305531743779508241780347081470374488718989636990233738212174195604234593588461272325314215528265459543623864312796269176427251818027542711345978562318056661295241015095829415854218885612968394742320564741129353791774349282275541494026428939134920627812463726111753054622717119310116356020391377016695730659609458715794206834400971798313683173521572022151606820588780251530071841853198634516520873759366510045598375024838080906130739822646856203519935194543445776352574523286837269888247054743973982471908128830717347432604265401234817912837829289728424665952102694142190409017939355538720903773940059325978870813594819158491785411281829232728432185130930121677446908186036638626917272725653250577033788275532848525020676860268503396244010460868170366183668422400245220420698887085348274712352039989322593091109423678562877840971664204374301183812473393474181569023692824311977350780165916130639182603434989926970020331865584136555767033892083012035521577557018520518779278646965154203692177035106027598152525747997287067958495583828773920163969005601017367414626907539916022639742121376325089842645593155408913831923616011893504143113588169809756975685615156809718301077041526572845529202418627301258888257023010355646157596158820107337643411098344495769079824062658034841113036159712976090652715172861118398396463438153644617763942735713912193155539153353006222951965776408842015246576140657437291217544606529750759900127860216624160777572354875625503811168240060144404381782532731747344361636381195322953833511355431708115960517850363668467732859378452319744244754189705176591797980699728768894888776273098873237375908148750504573178096251637132279732290029080034917390851159718996069867384057524634361867451078210323154806935160062513887899020538632350719578957221218762625988338233522900425764882381207240722674803484256371990031477603784632430434075343952218821448873158758760259077397922975757953735064291924684701700383120505009176657075834209273037908753324078050945056651597552104952664855941872449222161542832136880323939394014264995176092751280620673551723331208577960453876924923755340564701453016713590166028324696751231085985884240222167593347334526263303037916609526590361628275094514687712979547371657019216768348669940844962684915105995807144581550267466768607900288997226458836794359699020464423731084729515154927619118848472118259301156549275391180883502559594450767573982988933806622483582100752977021911865196145152803953417231772013838628271297216496382745313147623777787545601193971231801073102166081571418283792593282745084673717170570311045377504502284479416196840733756305173220061186402909252416023762563344143764956029112654501658894183721617190636706196102146327745427411573664267478610548114494490049701326681466073235027601469575864652759810903283362563811874506460304920716945160547124445139612696233397054113663378176432693167172174324788120020498949799252604115536513853848262142313920128414259368279443832662271152360297173930646598210564674468705978287574339360244225115375618646198655959556280703437804726344639166084401515545027901284172772594924370056965764537173873096051299395266611814969942972446937104374365814436535553437638172469618344861812949854558849812664215334381772718093108970359582607762182530978586011606431206539270246528340251461663568777312665664372314290610998078251132725518693529082410739556958543548525453707936098381671273577525790074909555360813881034617350711745676369290608241723750100354970106149571977139199099246359065033480164509524755309789212426564987013135305339916928676198868262047064684760709433781635772354068612627551149096062556283756591960503706614301481072163106357293601120215712910962780320764010922253732701739505753777925668721137680859409919296558240509140850139708613990151410104328354063372667467067274819461968988824720951115052103399330025052273347500202856736346707384583901599334942268514999353369220365516871691405825741537268724538008583607648929752017570278626326151302560754685495028393678419262128727319250428386913197576633827464717820878289888579781924835957478890210814594606277052757358686187249587833483622951068755564437706268645919720898812154651410735166469301589965697476758067194636020452303250497949048947399883127275733209713104883264862130618398438300031458732794354541218179182692182949013878301564321481423815928645752291194790291300506635648891720930673414441649427368858727539840128657434212664708614252838891346368857902932357270177886061675600124771866970699942139129985509310786171897907713767025490553617452052324190314230443669713785943929520934640464416671176139062034948722091493965189712072792638835666067743532362554736033778616139422395438938944605811706580880420836614049374657066594246393012966219639062789307544592960174860630795820249954853388936995742898065294246733938102175776059529094912831231797891546390571057749606999349996810181557492618640128215744807587466320221438600412521428466916484908092508563270571335405686177916252953143575335641923049301557353017574575315800626626939667724977283350476378690544602400232622622606984439469645646912594417064906111761643056936695157678048364605212059547317525838488465251538119345419979627752159611803463974561223291334210165604062771592587817061728345698629469530077932541521870102279760384499807979877285590410184415905645947383083105790145978931820171516152080500903184835361062491319185763169442515370923471198674337350461697251811045075909288347136691842306340831907917252439136412062563991015509661175647955551494200111528584410842714112893660931587222547527616371447626907477263138994491219951425656610431931653530106776137603833078393623616256283714563444092455070819135182372571411642399666607859039700751818268082294407317787468307510454272859459361639319979293997084018517407055270237114922624894768464359698724807022283865063570179483291145554841647601059067178556847880390815917137788528020328496013081698320174206083993477134242184345417718684421898434176286183306074297397337394378635818040034822140823705679673305304460208977733857268729121898133230944150931434375503975562627800112089417314200987543199614195325678616295902673204032176076607741253741011953899538950353479401701480978109520837367985644204216226079933908944509320472574034339086658841246013841750123876174304679348186657771224594878774792577476351726916884715747652858200960751333538695549872163988000264532075579235359661317563583521988757053827631636808305880569746716283687194118275915928060447077646581456256839985578728945837051179362571449947348159120582527720210320816824370932805266651927288698009547480142504810428454261511435444743728876175627914098669648063196082808198168469420588173819431297620345075913670651853432169177514148111886459795089429969643832554329992461199712957262962023969219032890174902935953126450366971415811499887844992885605846137934153585373646778724962248920989408566923423587556265193045579464470040331860146021474495993513170797583044448771741365214872568116252634674100076242158561453923395526895656905772931330601248536544975755715095764080696461966467575052492961263728205392340905646916958065447157660255882585819023423114809694122214668524218426504844940638948658914245639927512262303170595924131913084701462263664582335366579733760671407937763694121917898012253202550794445927090056988580987161070251889864283474072790532666000445210799879898795369575601310701000600506735376838711381823879045908375392524259853266319554558572588187561880636974923425500452774001254800799279088468508982839057565328297629505098869916759252131884099115322420686108894783264515139811150209926303957155203500393727027411079117369478937095384712003637406693041168456532590381021805048371107896453595203099293812662714637405025074568828822557880697107157708023383177045107932793985761637095123260953060223303469977176881187266346286506759842379165512015006845041184833055602957447462579518605453908265316222905883648379800344280559713700655734203702709055921414200515024650167935251509501402436061376649103597691145127922934267080064403467326795745195948481361947814886969942673557755096669771873496442918230266249855317268651317823644283800930551559885321061219165671786041281110803227612135737813344806675638712573522540330326752464442386379900620750588198544947113799155493133901793000917834934968229504797669239833050649010268588703408635567999483106225365924725096344849106407354596440471549184675431400247646054497566794504464730489228246171177238763846374129323806353067143453547105684101405874350776205012855998370519788550563353055706151297118603093875039708128437347187128159250402631828887145334311373552557223689628363908560011768895131535294161055044642175226187415342324320677763066911181419980149855416104489931529489458659833547172890548612497344779808640595096229937705251106163138658308234789274625008958442163643654994384491346591453337999940340102822545663315950182058410804877289936327981680704769212059417689650218871786818104993012530393359782797076272952876972564899611799589468478404319021053066185948310785346220896419939008967567342765319314502669727526379972481519742277811246822238899767398834228515624e-4951 +1.82259976594123730126420296680970990819952540784678167186049024351418584431669886840478035431291360259862367367360176555098349281631101608498675403779490450274191129058896583928461263190281677987831078128299170536447015989677676363429562039997708640550775926919152302738435771122464765292985913410713131103376617773042203403962987686984411316948595140667733210597864690600010838133614601613871681951542280276489775942764960612766058558174381456923146501775692637508015664228929367328342904167452656185259699435199165429391997316125073430122973318829343522821181735512119859732943017878403356723899138210986814640887564778026842288063392332395425873162546186801975636139070797668304819972220170105852674422401098888180221895434381162451705845464727526614177730212750823552425549507762484741018808753638726079896241463208233641468961241718926107442376223082667022657044926746945053999973304249789647043354111258394904631316614206681676861518285530333635550805084849345427276340804672339278791177264322833523245464353153129378096510959641978734303986620037096633539629329212395162630085725125582600936685277823883492820153083593049415051104450437620211914690606070787926358977364081411635544299722928735751692643879771301240039585999097767207595829950175191441110017783298397938554546884420461552538187244104722816024213635806139907491818083029479760454178844362711626647761487494632027538147971912063924809690969103877295273058627398067023490884558283804713066036286365630374146882657021080984305152976459971071596872478304966869803153760915112192273767083898623101906331345170408354325877269319107750447803297770519645747631196394042357976659226774333324024028170376571419266465026123884210852547563237372731787743310739247077115755551931534219571260621965209529206118711148614230326874252623232432768485954951338025914378049849860538923653349006471371371975851619548239568383911087481548770985671906958133943927799958876422544137402326929408872363515336911744925148845142650068227520261364354697002916289429272868432749597813293152504173604381153301045168945974496048759541471080100519101973888604170033075957748634771829115251095545428834602408676747944708548838154240391870140692461377047103665770055763116743840798104372065112827921945625030361510289100654183705651174880622260739758549192434399417410164472062845437778260804090757560281944655628120766454222846704757309223464545058305531743779508241780347081470374488718989636990233738212174195604234593588461272325314215528265459543623864312796269176427251818027542711345978562318056661295241015095829415854218885612968394742320564741129353791774349282275541494026428939134920627812463726111753054622717119310116356020391377016695730659609458715794206834400971798313683173521572022151606820588780251530071841853198634516520873759366510045598375024838080906130739822646856203519935194543445776352574523286837269888247054743973982471908128830717347432604265401234817912837829289728424665952102694142190409017939355538720903773940059325978870813594819158491785411281829232728432185130930121677446908186036638626917272725653250577033788275532848525020676860268503396244010460868170366183668422400245220420698887085348274712352039989322593091109423678562877840971664204374301183812473393474181569023692824311977350780165916130639182603434989926970020331865584136555767033892083012035521577557018520518779278646965154203692177035106027598152525747997287067958495583828773920163969005601017367414626907539916022639742121376325089842645593155408913831923616011893504143113588169809756975685615156809718301077041526572845529202418627301258888257023010355646157596158820107337643411098344495769079824062658034841113036159712976090652715172861118398396463438153644617763942735713912193155539153353006222951965776408842015246576140657437291217544606529750759900127860216624160777572354875625503811168240060144404381782532731747344361636381195322953833511355431708115960517850363668467732859378452319744244754189705176591797980699728768894888776273098873237375908148750504573178096251637132279732290029080034917390851159718996069867384057524634361867451078210323154806935160062513887899020538632350719578957221218762625988338233522900425764882381207240722674803484256371990031477603784632430434075343952218821448873158758760259077397922975757953735064291924684701700383120505009176657075834209273037908753324078050945056651597552104952664855941872449222161542832136880323939394014264995176092751280620673551723331208577960453876924923755340564701453016713590166028324696751231085985884240222167593347334526263303037916609526590361628275094514687712979547371657019216768348669940844962684915105995807144581550267466768607900288997226458836794359699020464423731084729515154927619118848472118259301156549275391180883502559594450767573982988933806622483582100752977021911865196145152803953417231772013838628271297216496382745313147623777787545601193971231801073102166081571418283792593282745084673717170570311045377504502284479416196840733756305173220061186402909252416023762563344143764956029112654501658894183721617190636706196102146327745427411573664267478610548114494490049701326681466073235027601469575864652759810903283362563811874506460304920716945160547124445139612696233397054113663378176432693167172174324788120020498949799252604115536513853848262142313920128414259368279443832662271152360297173930646598210564674468705978287574339360244225115375618646198655959556280703437804726344639166084401515545027901284172772594924370056965764537173873096051299395266611814969942972446937104374365814436535553437638172469618344861812949854558849812664215334381772718093108970359582607762182530978586011606431206539270246528340251461663568777312665664372314290610998078251132725518693529082410739556958543548525453707936098381671273577525790074909555360813881034617350711745676369290608241723750100354970106149571977139199099246359065033480164509524755309789212426564987013135305339916928676198868262047064684760709433781635772354068612627551149096062556283756591960503706614301481072163106357293601120215712910962780320764010922253732701739505753777925668721137680859409919296558240509140850139708613990151410104328354063372667467067274819461968988824720951115052103399330025052273347500202856736346707384583901599334942268514999353369220365516871691405825741537268724538008583607648929752017570278626326151302560754685495028393678419262128727319250428386913197576633827464717820878289888579781924835957478890210814594606277052757358686187249587833483622951068755564437706268645919720898812154651410735166469301589965697476758067194636020452303250497949048947399883127275733209713104883264862130618398438300031458732794354541218179182692182949013878301564321481423815928645752291194790291300506635648891720930673414441649427368858727539840128657434212664708614252838891346368857902932357270177886061675600124771866970699942139129985509310786171897907713767025490553617452052324190314230443669713785943929520934640464416671176139062034948722091493965189712072792638835666067743532362554736033778616139422395438938944605811706580880420836614049374657066594246393012966219639062789307544592960174860630795820249954853388936995742898065294246733938102175776059529094912831231797891546390571057749606999349996810181557492618640128215744807587466320221438600412521428466916484908092508563270571335405686177916252953143575335641923049301557353017574575315800626626939667724977283350476378690544602400232622622606984439469645646912594417064906111761643056936695157678048364605212059547317525838488465251538119345419979627752159611803463974561223291334210165604062771592587817061728345698629469530077932541521870102279760384499807979877285590410184415905645947383083105790145978931820171516152080500903184835361062491319185763169442515370923471198674337350461697251811045075909288347136691842306340831907917252439136412062563991015509661175647955551494200111528584410842714112893660931587222547527616371447626907477263138994491219951425656610431931653530106776137603833078393623616256283714563444092455070819135182372571411642399666607859039700751818268082294407317787468307510454272859459361639319979293997084018517407055270237114922624894768464359698724807022283865063570179483291145554841647601059067178556847880390815917137788528020328496013081698320174206083993477134242184345417718684421898434176286183306074297397337394378635818040034822140823705679673305304460208977733857268729121898133230944150931434375503975562627800112089417314200987543199614195325678616295902673204032176076607741253741011953899538950353479401701480978109520837367985644204216226079933908944509320472574034339086658841246013841750123876174304679348186657771224594878774792577476351726916884715747652858200960751333538695549872163988000264532075579235359661317563583521988757053827631636808305880569746716283687194118275915928060447077646581456256839985578728945837051179362571449947348159120582527720210320816824370932805266651927288698009547480142504810428454261511435444743728876175627914098669648063196082808198168469420588173819431297620345075913670651853432169177514148111886459795089429969643832554329992461199712957262962023969219032890174902935953126450366971415811499887844992885605846137934153585373646778724962248920989408566923423587556265193045579464470040331860146021474495993513170797583044448771741365214872568116252634674100076242158561453923395526895656905772931330601248536544975755715095764080696461966467575052492961263728205392340905646916958065447157660255882585819023423114809694122214668524218426504844940638948658914245639927512262303170595924131913084701462263664582335366579733760671407937763694121917898012253202550794445927090056988580987161070251889864283474072790532666000445210799879898795369575601310701000600506735376838711381823879045908375392524259853266319554558572588187561880636974923425500452774001254800799279088468508982839057565328297629505098869916759252131884099115322420686108894783264515139811150209926303957155203500393727027411079117369478937095384712003637406693041168456532590381021805048371107896453595203099293812662714637405025074568828822557880697107157708023383177045107932793985761637095123260953060223303469977176881187266346286506759842379165512015006845041184833055602957447462579518605453908265316222905883648379800344280559713700655734203702709055921414200515024650167935251509501402436061376649103597691145127922934267080064403467326795745195948481361947814886969942673557755096669771873496442918230266249855317268651317823644283800930551559885321061219165671786041281110803227612135737813344806675638712573522540330326752464442386379900620750588198544947113799155493133901793000917834934968229504797669239833050649010268588703408635567999483106225365924725096344849106407354596440471549184675431400247646054497566794504464730489228246171177238763846374129323806353067143453547105684101405874350776205012855998370519788550563353055706151297118603093875039708128437347187128159250402631828887145334311373552557223689628363908560011768895131535294161055044642175226187415342324320677763066911181419980149855416104489931529489458659833547172890548612497344779808640595096229937705251106163138658308234789274625008958442163643654994384491346591453337999940340102822545663315950182058410804877289936327981680704769212059417689650218871786818104993012530393359782797076272952876972564899611799589468478404319021053066185948310785346220896419939008967567342765319314502669727526379972481519742277811246822238899767398834228515625e-4951 +1.82259976594123730126420296680970990819952540784678167186049024351418584431669886840478035431291360259862367367360176555098349281631101608498675403779490450274191129058896583928461263190281677987831078128299170536447015989677676363429562039997708640550775926919152302738435771122464765292985913410713131103376617773042203403962987686984411316948595140667733210597864690600010838133614601613871681951542280276489775942764960612766058558174381456923146501775692637508015664228929367328342904167452656185259699435199165429391997316125073430122973318829343522821181735512119859732943017878403356723899138210986814640887564778026842288063392332395425873162546186801975636139070797668304819972220170105852674422401098888180221895434381162451705845464727526614177730212750823552425549507762484741018808753638726079896241463208233641468961241718926107442376223082667022657044926746945053999973304249789647043354111258394904631316614206681676861518285530333635550805084849345427276340804672339278791177264322833523245464353153129378096510959641978734303986620037096633539629329212395162630085725125582600936685277823883492820153083593049415051104450437620211914690606070787926358977364081411635544299722928735751692643879771301240039585999097767207595829950175191441110017783298397938554546884420461552538187244104722816024213635806139907491818083029479760454178844362711626647761487494632027538147971912063924809690969103877295273058627398067023490884558283804713066036286365630374146882657021080984305152976459971071596872478304966869803153760915112192273767083898623101906331345170408354325877269319107750447803297770519645747631196394042357976659226774333324024028170376571419266465026123884210852547563237372731787743310739247077115755551931534219571260621965209529206118711148614230326874252623232432768485954951338025914378049849860538923653349006471371371975851619548239568383911087481548770985671906958133943927799958876422544137402326929408872363515336911744925148845142650068227520261364354697002916289429272868432749597813293152504173604381153301045168945974496048759541471080100519101973888604170033075957748634771829115251095545428834602408676747944708548838154240391870140692461377047103665770055763116743840798104372065112827921945625030361510289100654183705651174880622260739758549192434399417410164472062845437778260804090757560281944655628120766454222846704757309223464545058305531743779508241780347081470374488718989636990233738212174195604234593588461272325314215528265459543623864312796269176427251818027542711345978562318056661295241015095829415854218885612968394742320564741129353791774349282275541494026428939134920627812463726111753054622717119310116356020391377016695730659609458715794206834400971798313683173521572022151606820588780251530071841853198634516520873759366510045598375024838080906130739822646856203519935194543445776352574523286837269888247054743973982471908128830717347432604265401234817912837829289728424665952102694142190409017939355538720903773940059325978870813594819158491785411281829232728432185130930121677446908186036638626917272725653250577033788275532848525020676860268503396244010460868170366183668422400245220420698887085348274712352039989322593091109423678562877840971664204374301183812473393474181569023692824311977350780165916130639182603434989926970020331865584136555767033892083012035521577557018520518779278646965154203692177035106027598152525747997287067958495583828773920163969005601017367414626907539916022639742121376325089842645593155408913831923616011893504143113588169809756975685615156809718301077041526572845529202418627301258888257023010355646157596158820107337643411098344495769079824062658034841113036159712976090652715172861118398396463438153644617763942735713912193155539153353006222951965776408842015246576140657437291217544606529750759900127860216624160777572354875625503811168240060144404381782532731747344361636381195322953833511355431708115960517850363668467732859378452319744244754189705176591797980699728768894888776273098873237375908148750504573178096251637132279732290029080034917390851159718996069867384057524634361867451078210323154806935160062513887899020538632350719578957221218762625988338233522900425764882381207240722674803484256371990031477603784632430434075343952218821448873158758760259077397922975757953735064291924684701700383120505009176657075834209273037908753324078050945056651597552104952664855941872449222161542832136880323939394014264995176092751280620673551723331208577960453876924923755340564701453016713590166028324696751231085985884240222167593347334526263303037916609526590361628275094514687712979547371657019216768348669940844962684915105995807144581550267466768607900288997226458836794359699020464423731084729515154927619118848472118259301156549275391180883502559594450767573982988933806622483582100752977021911865196145152803953417231772013838628271297216496382745313147623777787545601193971231801073102166081571418283792593282745084673717170570311045377504502284479416196840733756305173220061186402909252416023762563344143764956029112654501658894183721617190636706196102146327745427411573664267478610548114494490049701326681466073235027601469575864652759810903283362563811874506460304920716945160547124445139612696233397054113663378176432693167172174324788120020498949799252604115536513853848262142313920128414259368279443832662271152360297173930646598210564674468705978287574339360244225115375618646198655959556280703437804726344639166084401515545027901284172772594924370056965764537173873096051299395266611814969942972446937104374365814436535553437638172469618344861812949854558849812664215334381772718093108970359582607762182530978586011606431206539270246528340251461663568777312665664372314290610998078251132725518693529082410739556958543548525453707936098381671273577525790074909555360813881034617350711745676369290608241723750100354970106149571977139199099246359065033480164509524755309789212426564987013135305339916928676198868262047064684760709433781635772354068612627551149096062556283756591960503706614301481072163106357293601120215712910962780320764010922253732701739505753777925668721137680859409919296558240509140850139708613990151410104328354063372667467067274819461968988824720951115052103399330025052273347500202856736346707384583901599334942268514999353369220365516871691405825741537268724538008583607648929752017570278626326151302560754685495028393678419262128727319250428386913197576633827464717820878289888579781924835957478890210814594606277052757358686187249587833483622951068755564437706268645919720898812154651410735166469301589965697476758067194636020452303250497949048947399883127275733209713104883264862130618398438300031458732794354541218179182692182949013878301564321481423815928645752291194790291300506635648891720930673414441649427368858727539840128657434212664708614252838891346368857902932357270177886061675600124771866970699942139129985509310786171897907713767025490553617452052324190314230443669713785943929520934640464416671176139062034948722091493965189712072792638835666067743532362554736033778616139422395438938944605811706580880420836614049374657066594246393012966219639062789307544592960174860630795820249954853388936995742898065294246733938102175776059529094912831231797891546390571057749606999349996810181557492618640128215744807587466320221438600412521428466916484908092508563270571335405686177916252953143575335641923049301557353017574575315800626626939667724977283350476378690544602400232622622606984439469645646912594417064906111761643056936695157678048364605212059547317525838488465251538119345419979627752159611803463974561223291334210165604062771592587817061728345698629469530077932541521870102279760384499807979877285590410184415905645947383083105790145978931820171516152080500903184835361062491319185763169442515370923471198674337350461697251811045075909288347136691842306340831907917252439136412062563991015509661175647955551494200111528584410842714112893660931587222547527616371447626907477263138994491219951425656610431931653530106776137603833078393623616256283714563444092455070819135182372571411642399666607859039700751818268082294407317787468307510454272859459361639319979293997084018517407055270237114922624894768464359698724807022283865063570179483291145554841647601059067178556847880390815917137788528020328496013081698320174206083993477134242184345417718684421898434176286183306074297397337394378635818040034822140823705679673305304460208977733857268729121898133230944150931434375503975562627800112089417314200987543199614195325678616295902673204032176076607741253741011953899538950353479401701480978109520837367985644204216226079933908944509320472574034339086658841246013841750123876174304679348186657771224594878774792577476351726916884715747652858200960751333538695549872163988000264532075579235359661317563583521988757053827631636808305880569746716283687194118275915928060447077646581456256839985578728945837051179362571449947348159120582527720210320816824370932805266651927288698009547480142504810428454261511435444743728876175627914098669648063196082808198168469420588173819431297620345075913670651853432169177514148111886459795089429969643832554329992461199712957262962023969219032890174902935953126450366971415811499887844992885605846137934153585373646778724962248920989408566923423587556265193045579464470040331860146021474495993513170797583044448771741365214872568116252634674100076242158561453923395526895656905772931330601248536544975755715095764080696461966467575052492961263728205392340905646916958065447157660255882585819023423114809694122214668524218426504844940638948658914245639927512262303170595924131913084701462263664582335366579733760671407937763694121917898012253202550794445927090056988580987161070251889864283474072790532666000445210799879898795369575601310701000600506735376838711381823879045908375392524259853266319554558572588187561880636974923425500452774001254800799279088468508982839057565328297629505098869916759252131884099115322420686108894783264515139811150209926303957155203500393727027411079117369478937095384712003637406693041168456532590381021805048371107896453595203099293812662714637405025074568828822557880697107157708023383177045107932793985761637095123260953060223303469977176881187266346286506759842379165512015006845041184833055602957447462579518605453908265316222905883648379800344280559713700655734203702709055921414200515024650167935251509501402436061376649103597691145127922934267080064403467326795745195948481361947814886969942673557755096669771873496442918230266249855317268651317823644283800930551559885321061219165671786041281110803227612135737813344806675638712573522540330326752464442386379900620750588198544947113799155493133901793000917834934968229504797669239833050649010268588703408635567999483106225365924725096344849106407354596440471549184675431400247646054497566794504464730489228246171177238763846374129323806353067143453547105684101405874350776205012855998370519788550563353055706151297118603093875039708128437347187128159250402631828887145334311373552557223689628363908560011768895131535294161055044642175226187415342324320677763066911181419980149855416104489931529489458659833547172890548612497344779808640595096229937705251106163138658308234789274625008958442163643654994384491346591453337999940340102822545663315950182058410804877289936327981680704769212059417689650218871786818104993012530393359782797076272952876972564899611799589468478404319021053066185948310785346220896419939008967567342765319314502669727526379972481519742277811246822238899767398834228515626e-4951 +-1.82259976594123730126420296680970990819952540784678167186049024351418584431669886840478035431291360259862367367360176555098349281631101608498675403779490450274191129058896583928461263190281677987831078128299170536447015989677676363429562039997708640550775926919152302738435771122464765292985913410713131103376617773042203403962987686984411316948595140667733210597864690600010838133614601613871681951542280276489775942764960612766058558174381456923146501775692637508015664228929367328342904167452656185259699435199165429391997316125073430122973318829343522821181735512119859732943017878403356723899138210986814640887564778026842288063392332395425873162546186801975636139070797668304819972220170105852674422401098888180221895434381162451705845464727526614177730212750823552425549507762484741018808753638726079896241463208233641468961241718926107442376223082667022657044926746945053999973304249789647043354111258394904631316614206681676861518285530333635550805084849345427276340804672339278791177264322833523245464353153129378096510959641978734303986620037096633539629329212395162630085725125582600936685277823883492820153083593049415051104450437620211914690606070787926358977364081411635544299722928735751692643879771301240039585999097767207595829950175191441110017783298397938554546884420461552538187244104722816024213635806139907491818083029479760454178844362711626647761487494632027538147971912063924809690969103877295273058627398067023490884558283804713066036286365630374146882657021080984305152976459971071596872478304966869803153760915112192273767083898623101906331345170408354325877269319107750447803297770519645747631196394042357976659226774333324024028170376571419266465026123884210852547563237372731787743310739247077115755551931534219571260621965209529206118711148614230326874252623232432768485954951338025914378049849860538923653349006471371371975851619548239568383911087481548770985671906958133943927799958876422544137402326929408872363515336911744925148845142650068227520261364354697002916289429272868432749597813293152504173604381153301045168945974496048759541471080100519101973888604170033075957748634771829115251095545428834602408676747944708548838154240391870140692461377047103665770055763116743840798104372065112827921945625030361510289100654183705651174880622260739758549192434399417410164472062845437778260804090757560281944655628120766454222846704757309223464545058305531743779508241780347081470374488718989636990233738212174195604234593588461272325314215528265459543623864312796269176427251818027542711345978562318056661295241015095829415854218885612968394742320564741129353791774349282275541494026428939134920627812463726111753054622717119310116356020391377016695730659609458715794206834400971798313683173521572022151606820588780251530071841853198634516520873759366510045598375024838080906130739822646856203519935194543445776352574523286837269888247054743973982471908128830717347432604265401234817912837829289728424665952102694142190409017939355538720903773940059325978870813594819158491785411281829232728432185130930121677446908186036638626917272725653250577033788275532848525020676860268503396244010460868170366183668422400245220420698887085348274712352039989322593091109423678562877840971664204374301183812473393474181569023692824311977350780165916130639182603434989926970020331865584136555767033892083012035521577557018520518779278646965154203692177035106027598152525747997287067958495583828773920163969005601017367414626907539916022639742121376325089842645593155408913831923616011893504143113588169809756975685615156809718301077041526572845529202418627301258888257023010355646157596158820107337643411098344495769079824062658034841113036159712976090652715172861118398396463438153644617763942735713912193155539153353006222951965776408842015246576140657437291217544606529750759900127860216624160777572354875625503811168240060144404381782532731747344361636381195322953833511355431708115960517850363668467732859378452319744244754189705176591797980699728768894888776273098873237375908148750504573178096251637132279732290029080034917390851159718996069867384057524634361867451078210323154806935160062513887899020538632350719578957221218762625988338233522900425764882381207240722674803484256371990031477603784632430434075343952218821448873158758760259077397922975757953735064291924684701700383120505009176657075834209273037908753324078050945056651597552104952664855941872449222161542832136880323939394014264995176092751280620673551723331208577960453876924923755340564701453016713590166028324696751231085985884240222167593347334526263303037916609526590361628275094514687712979547371657019216768348669940844962684915105995807144581550267466768607900288997226458836794359699020464423731084729515154927619118848472118259301156549275391180883502559594450767573982988933806622483582100752977021911865196145152803953417231772013838628271297216496382745313147623777787545601193971231801073102166081571418283792593282745084673717170570311045377504502284479416196840733756305173220061186402909252416023762563344143764956029112654501658894183721617190636706196102146327745427411573664267478610548114494490049701326681466073235027601469575864652759810903283362563811874506460304920716945160547124445139612696233397054113663378176432693167172174324788120020498949799252604115536513853848262142313920128414259368279443832662271152360297173930646598210564674468705978287574339360244225115375618646198655959556280703437804726344639166084401515545027901284172772594924370056965764537173873096051299395266611814969942972446937104374365814436535553437638172469618344861812949854558849812664215334381772718093108970359582607762182530978586011606431206539270246528340251461663568777312665664372314290610998078251132725518693529082410739556958543548525453707936098381671273577525790074909555360813881034617350711745676369290608241723750100354970106149571977139199099246359065033480164509524755309789212426564987013135305339916928676198868262047064684760709433781635772354068612627551149096062556283756591960503706614301481072163106357293601120215712910962780320764010922253732701739505753777925668721137680859409919296558240509140850139708613990151410104328354063372667467067274819461968988824720951115052103399330025052273347500202856736346707384583901599334942268514999353369220365516871691405825741537268724538008583607648929752017570278626326151302560754685495028393678419262128727319250428386913197576633827464717820878289888579781924835957478890210814594606277052757358686187249587833483622951068755564437706268645919720898812154651410735166469301589965697476758067194636020452303250497949048947399883127275733209713104883264862130618398438300031458732794354541218179182692182949013878301564321481423815928645752291194790291300506635648891720930673414441649427368858727539840128657434212664708614252838891346368857902932357270177886061675600124771866970699942139129985509310786171897907713767025490553617452052324190314230443669713785943929520934640464416671176139062034948722091493965189712072792638835666067743532362554736033778616139422395438938944605811706580880420836614049374657066594246393012966219639062789307544592960174860630795820249954853388936995742898065294246733938102175776059529094912831231797891546390571057749606999349996810181557492618640128215744807587466320221438600412521428466916484908092508563270571335405686177916252953143575335641923049301557353017574575315800626626939667724977283350476378690544602400232622622606984439469645646912594417064906111761643056936695157678048364605212059547317525838488465251538119345419979627752159611803463974561223291334210165604062771592587817061728345698629469530077932541521870102279760384499807979877285590410184415905645947383083105790145978931820171516152080500903184835361062491319185763169442515370923471198674337350461697251811045075909288347136691842306340831907917252439136412062563991015509661175647955551494200111528584410842714112893660931587222547527616371447626907477263138994491219951425656610431931653530106776137603833078393623616256283714563444092455070819135182372571411642399666607859039700751818268082294407317787468307510454272859459361639319979293997084018517407055270237114922624894768464359698724807022283865063570179483291145554841647601059067178556847880390815917137788528020328496013081698320174206083993477134242184345417718684421898434176286183306074297397337394378635818040034822140823705679673305304460208977733857268729121898133230944150931434375503975562627800112089417314200987543199614195325678616295902673204032176076607741253741011953899538950353479401701480978109520837367985644204216226079933908944509320472574034339086658841246013841750123876174304679348186657771224594878774792577476351726916884715747652858200960751333538695549872163988000264532075579235359661317563583521988757053827631636808305880569746716283687194118275915928060447077646581456256839985578728945837051179362571449947348159120582527720210320816824370932805266651927288698009547480142504810428454261511435444743728876175627914098669648063196082808198168469420588173819431297620345075913670651853432169177514148111886459795089429969643832554329992461199712957262962023969219032890174902935953126450366971415811499887844992885605846137934153585373646778724962248920989408566923423587556265193045579464470040331860146021474495993513170797583044448771741365214872568116252634674100076242158561453923395526895656905772931330601248536544975755715095764080696461966467575052492961263728205392340905646916958065447157660255882585819023423114809694122214668524218426504844940638948658914245639927512262303170595924131913084701462263664582335366579733760671407937763694121917898012253202550794445927090056988580987161070251889864283474072790532666000445210799879898795369575601310701000600506735376838711381823879045908375392524259853266319554558572588187561880636974923425500452774001254800799279088468508982839057565328297629505098869916759252131884099115322420686108894783264515139811150209926303957155203500393727027411079117369478937095384712003637406693041168456532590381021805048371107896453595203099293812662714637405025074568828822557880697107157708023383177045107932793985761637095123260953060223303469977176881187266346286506759842379165512015006845041184833055602957447462579518605453908265316222905883648379800344280559713700655734203702709055921414200515024650167935251509501402436061376649103597691145127922934267080064403467326795745195948481361947814886969942673557755096669771873496442918230266249855317268651317823644283800930551559885321061219165671786041281110803227612135737813344806675638712573522540330326752464442386379900620750588198544947113799155493133901793000917834934968229504797669239833050649010268588703408635567999483106225365924725096344849106407354596440471549184675431400247646054497566794504464730489228246171177238763846374129323806353067143453547105684101405874350776205012855998370519788550563353055706151297118603093875039708128437347187128159250402631828887145334311373552557223689628363908560011768895131535294161055044642175226187415342324320677763066911181419980149855416104489931529489458659833547172890548612497344779808640595096229937705251106163138658308234789274625008958442163643654994384491346591453337999940340102822545663315950182058410804877289936327981680704769212059417689650218871786818104993012530393359782797076272952876972564899611799589468478404319021053066185948310785346220896419939008967567342765319314502669727526379972481519742277811246822238899767398834228515624e-4951 +-1.82259976594123730126420296680970990819952540784678167186049024351418584431669886840478035431291360259862367367360176555098349281631101608498675403779490450274191129058896583928461263190281677987831078128299170536447015989677676363429562039997708640550775926919152302738435771122464765292985913410713131103376617773042203403962987686984411316948595140667733210597864690600010838133614601613871681951542280276489775942764960612766058558174381456923146501775692637508015664228929367328342904167452656185259699435199165429391997316125073430122973318829343522821181735512119859732943017878403356723899138210986814640887564778026842288063392332395425873162546186801975636139070797668304819972220170105852674422401098888180221895434381162451705845464727526614177730212750823552425549507762484741018808753638726079896241463208233641468961241718926107442376223082667022657044926746945053999973304249789647043354111258394904631316614206681676861518285530333635550805084849345427276340804672339278791177264322833523245464353153129378096510959641978734303986620037096633539629329212395162630085725125582600936685277823883492820153083593049415051104450437620211914690606070787926358977364081411635544299722928735751692643879771301240039585999097767207595829950175191441110017783298397938554546884420461552538187244104722816024213635806139907491818083029479760454178844362711626647761487494632027538147971912063924809690969103877295273058627398067023490884558283804713066036286365630374146882657021080984305152976459971071596872478304966869803153760915112192273767083898623101906331345170408354325877269319107750447803297770519645747631196394042357976659226774333324024028170376571419266465026123884210852547563237372731787743310739247077115755551931534219571260621965209529206118711148614230326874252623232432768485954951338025914378049849860538923653349006471371371975851619548239568383911087481548770985671906958133943927799958876422544137402326929408872363515336911744925148845142650068227520261364354697002916289429272868432749597813293152504173604381153301045168945974496048759541471080100519101973888604170033075957748634771829115251095545428834602408676747944708548838154240391870140692461377047103665770055763116743840798104372065112827921945625030361510289100654183705651174880622260739758549192434399417410164472062845437778260804090757560281944655628120766454222846704757309223464545058305531743779508241780347081470374488718989636990233738212174195604234593588461272325314215528265459543623864312796269176427251818027542711345978562318056661295241015095829415854218885612968394742320564741129353791774349282275541494026428939134920627812463726111753054622717119310116356020391377016695730659609458715794206834400971798313683173521572022151606820588780251530071841853198634516520873759366510045598375024838080906130739822646856203519935194543445776352574523286837269888247054743973982471908128830717347432604265401234817912837829289728424665952102694142190409017939355538720903773940059325978870813594819158491785411281829232728432185130930121677446908186036638626917272725653250577033788275532848525020676860268503396244010460868170366183668422400245220420698887085348274712352039989322593091109423678562877840971664204374301183812473393474181569023692824311977350780165916130639182603434989926970020331865584136555767033892083012035521577557018520518779278646965154203692177035106027598152525747997287067958495583828773920163969005601017367414626907539916022639742121376325089842645593155408913831923616011893504143113588169809756975685615156809718301077041526572845529202418627301258888257023010355646157596158820107337643411098344495769079824062658034841113036159712976090652715172861118398396463438153644617763942735713912193155539153353006222951965776408842015246576140657437291217544606529750759900127860216624160777572354875625503811168240060144404381782532731747344361636381195322953833511355431708115960517850363668467732859378452319744244754189705176591797980699728768894888776273098873237375908148750504573178096251637132279732290029080034917390851159718996069867384057524634361867451078210323154806935160062513887899020538632350719578957221218762625988338233522900425764882381207240722674803484256371990031477603784632430434075343952218821448873158758760259077397922975757953735064291924684701700383120505009176657075834209273037908753324078050945056651597552104952664855941872449222161542832136880323939394014264995176092751280620673551723331208577960453876924923755340564701453016713590166028324696751231085985884240222167593347334526263303037916609526590361628275094514687712979547371657019216768348669940844962684915105995807144581550267466768607900288997226458836794359699020464423731084729515154927619118848472118259301156549275391180883502559594450767573982988933806622483582100752977021911865196145152803953417231772013838628271297216496382745313147623777787545601193971231801073102166081571418283792593282745084673717170570311045377504502284479416196840733756305173220061186402909252416023762563344143764956029112654501658894183721617190636706196102146327745427411573664267478610548114494490049701326681466073235027601469575864652759810903283362563811874506460304920716945160547124445139612696233397054113663378176432693167172174324788120020498949799252604115536513853848262142313920128414259368279443832662271152360297173930646598210564674468705978287574339360244225115375618646198655959556280703437804726344639166084401515545027901284172772594924370056965764537173873096051299395266611814969942972446937104374365814436535553437638172469618344861812949854558849812664215334381772718093108970359582607762182530978586011606431206539270246528340251461663568777312665664372314290610998078251132725518693529082410739556958543548525453707936098381671273577525790074909555360813881034617350711745676369290608241723750100354970106149571977139199099246359065033480164509524755309789212426564987013135305339916928676198868262047064684760709433781635772354068612627551149096062556283756591960503706614301481072163106357293601120215712910962780320764010922253732701739505753777925668721137680859409919296558240509140850139708613990151410104328354063372667467067274819461968988824720951115052103399330025052273347500202856736346707384583901599334942268514999353369220365516871691405825741537268724538008583607648929752017570278626326151302560754685495028393678419262128727319250428386913197576633827464717820878289888579781924835957478890210814594606277052757358686187249587833483622951068755564437706268645919720898812154651410735166469301589965697476758067194636020452303250497949048947399883127275733209713104883264862130618398438300031458732794354541218179182692182949013878301564321481423815928645752291194790291300506635648891720930673414441649427368858727539840128657434212664708614252838891346368857902932357270177886061675600124771866970699942139129985509310786171897907713767025490553617452052324190314230443669713785943929520934640464416671176139062034948722091493965189712072792638835666067743532362554736033778616139422395438938944605811706580880420836614049374657066594246393012966219639062789307544592960174860630795820249954853388936995742898065294246733938102175776059529094912831231797891546390571057749606999349996810181557492618640128215744807587466320221438600412521428466916484908092508563270571335405686177916252953143575335641923049301557353017574575315800626626939667724977283350476378690544602400232622622606984439469645646912594417064906111761643056936695157678048364605212059547317525838488465251538119345419979627752159611803463974561223291334210165604062771592587817061728345698629469530077932541521870102279760384499807979877285590410184415905645947383083105790145978931820171516152080500903184835361062491319185763169442515370923471198674337350461697251811045075909288347136691842306340831907917252439136412062563991015509661175647955551494200111528584410842714112893660931587222547527616371447626907477263138994491219951425656610431931653530106776137603833078393623616256283714563444092455070819135182372571411642399666607859039700751818268082294407317787468307510454272859459361639319979293997084018517407055270237114922624894768464359698724807022283865063570179483291145554841647601059067178556847880390815917137788528020328496013081698320174206083993477134242184345417718684421898434176286183306074297397337394378635818040034822140823705679673305304460208977733857268729121898133230944150931434375503975562627800112089417314200987543199614195325678616295902673204032176076607741253741011953899538950353479401701480978109520837367985644204216226079933908944509320472574034339086658841246013841750123876174304679348186657771224594878774792577476351726916884715747652858200960751333538695549872163988000264532075579235359661317563583521988757053827631636808305880569746716283687194118275915928060447077646581456256839985578728945837051179362571449947348159120582527720210320816824370932805266651927288698009547480142504810428454261511435444743728876175627914098669648063196082808198168469420588173819431297620345075913670651853432169177514148111886459795089429969643832554329992461199712957262962023969219032890174902935953126450366971415811499887844992885605846137934153585373646778724962248920989408566923423587556265193045579464470040331860146021474495993513170797583044448771741365214872568116252634674100076242158561453923395526895656905772931330601248536544975755715095764080696461966467575052492961263728205392340905646916958065447157660255882585819023423114809694122214668524218426504844940638948658914245639927512262303170595924131913084701462263664582335366579733760671407937763694121917898012253202550794445927090056988580987161070251889864283474072790532666000445210799879898795369575601310701000600506735376838711381823879045908375392524259853266319554558572588187561880636974923425500452774001254800799279088468508982839057565328297629505098869916759252131884099115322420686108894783264515139811150209926303957155203500393727027411079117369478937095384712003637406693041168456532590381021805048371107896453595203099293812662714637405025074568828822557880697107157708023383177045107932793985761637095123260953060223303469977176881187266346286506759842379165512015006845041184833055602957447462579518605453908265316222905883648379800344280559713700655734203702709055921414200515024650167935251509501402436061376649103597691145127922934267080064403467326795745195948481361947814886969942673557755096669771873496442918230266249855317268651317823644283800930551559885321061219165671786041281110803227612135737813344806675638712573522540330326752464442386379900620750588198544947113799155493133901793000917834934968229504797669239833050649010268588703408635567999483106225365924725096344849106407354596440471549184675431400247646054497566794504464730489228246171177238763846374129323806353067143453547105684101405874350776205012855998370519788550563353055706151297118603093875039708128437347187128159250402631828887145334311373552557223689628363908560011768895131535294161055044642175226187415342324320677763066911181419980149855416104489931529489458659833547172890548612497344779808640595096229937705251106163138658308234789274625008958442163643654994384491346591453337999940340102822545663315950182058410804877289936327981680704769212059417689650218871786818104993012530393359782797076272952876972564899611799589468478404319021053066185948310785346220896419939008967567342765319314502669727526379972481519742277811246822238899767398834228515625e-4951 +-1.82259976594123730126420296680970990819952540784678167186049024351418584431669886840478035431291360259862367367360176555098349281631101608498675403779490450274191129058896583928461263190281677987831078128299170536447015989677676363429562039997708640550775926919152302738435771122464765292985913410713131103376617773042203403962987686984411316948595140667733210597864690600010838133614601613871681951542280276489775942764960612766058558174381456923146501775692637508015664228929367328342904167452656185259699435199165429391997316125073430122973318829343522821181735512119859732943017878403356723899138210986814640887564778026842288063392332395425873162546186801975636139070797668304819972220170105852674422401098888180221895434381162451705845464727526614177730212750823552425549507762484741018808753638726079896241463208233641468961241718926107442376223082667022657044926746945053999973304249789647043354111258394904631316614206681676861518285530333635550805084849345427276340804672339278791177264322833523245464353153129378096510959641978734303986620037096633539629329212395162630085725125582600936685277823883492820153083593049415051104450437620211914690606070787926358977364081411635544299722928735751692643879771301240039585999097767207595829950175191441110017783298397938554546884420461552538187244104722816024213635806139907491818083029479760454178844362711626647761487494632027538147971912063924809690969103877295273058627398067023490884558283804713066036286365630374146882657021080984305152976459971071596872478304966869803153760915112192273767083898623101906331345170408354325877269319107750447803297770519645747631196394042357976659226774333324024028170376571419266465026123884210852547563237372731787743310739247077115755551931534219571260621965209529206118711148614230326874252623232432768485954951338025914378049849860538923653349006471371371975851619548239568383911087481548770985671906958133943927799958876422544137402326929408872363515336911744925148845142650068227520261364354697002916289429272868432749597813293152504173604381153301045168945974496048759541471080100519101973888604170033075957748634771829115251095545428834602408676747944708548838154240391870140692461377047103665770055763116743840798104372065112827921945625030361510289100654183705651174880622260739758549192434399417410164472062845437778260804090757560281944655628120766454222846704757309223464545058305531743779508241780347081470374488718989636990233738212174195604234593588461272325314215528265459543623864312796269176427251818027542711345978562318056661295241015095829415854218885612968394742320564741129353791774349282275541494026428939134920627812463726111753054622717119310116356020391377016695730659609458715794206834400971798313683173521572022151606820588780251530071841853198634516520873759366510045598375024838080906130739822646856203519935194543445776352574523286837269888247054743973982471908128830717347432604265401234817912837829289728424665952102694142190409017939355538720903773940059325978870813594819158491785411281829232728432185130930121677446908186036638626917272725653250577033788275532848525020676860268503396244010460868170366183668422400245220420698887085348274712352039989322593091109423678562877840971664204374301183812473393474181569023692824311977350780165916130639182603434989926970020331865584136555767033892083012035521577557018520518779278646965154203692177035106027598152525747997287067958495583828773920163969005601017367414626907539916022639742121376325089842645593155408913831923616011893504143113588169809756975685615156809718301077041526572845529202418627301258888257023010355646157596158820107337643411098344495769079824062658034841113036159712976090652715172861118398396463438153644617763942735713912193155539153353006222951965776408842015246576140657437291217544606529750759900127860216624160777572354875625503811168240060144404381782532731747344361636381195322953833511355431708115960517850363668467732859378452319744244754189705176591797980699728768894888776273098873237375908148750504573178096251637132279732290029080034917390851159718996069867384057524634361867451078210323154806935160062513887899020538632350719578957221218762625988338233522900425764882381207240722674803484256371990031477603784632430434075343952218821448873158758760259077397922975757953735064291924684701700383120505009176657075834209273037908753324078050945056651597552104952664855941872449222161542832136880323939394014264995176092751280620673551723331208577960453876924923755340564701453016713590166028324696751231085985884240222167593347334526263303037916609526590361628275094514687712979547371657019216768348669940844962684915105995807144581550267466768607900288997226458836794359699020464423731084729515154927619118848472118259301156549275391180883502559594450767573982988933806622483582100752977021911865196145152803953417231772013838628271297216496382745313147623777787545601193971231801073102166081571418283792593282745084673717170570311045377504502284479416196840733756305173220061186402909252416023762563344143764956029112654501658894183721617190636706196102146327745427411573664267478610548114494490049701326681466073235027601469575864652759810903283362563811874506460304920716945160547124445139612696233397054113663378176432693167172174324788120020498949799252604115536513853848262142313920128414259368279443832662271152360297173930646598210564674468705978287574339360244225115375618646198655959556280703437804726344639166084401515545027901284172772594924370056965764537173873096051299395266611814969942972446937104374365814436535553437638172469618344861812949854558849812664215334381772718093108970359582607762182530978586011606431206539270246528340251461663568777312665664372314290610998078251132725518693529082410739556958543548525453707936098381671273577525790074909555360813881034617350711745676369290608241723750100354970106149571977139199099246359065033480164509524755309789212426564987013135305339916928676198868262047064684760709433781635772354068612627551149096062556283756591960503706614301481072163106357293601120215712910962780320764010922253732701739505753777925668721137680859409919296558240509140850139708613990151410104328354063372667467067274819461968988824720951115052103399330025052273347500202856736346707384583901599334942268514999353369220365516871691405825741537268724538008583607648929752017570278626326151302560754685495028393678419262128727319250428386913197576633827464717820878289888579781924835957478890210814594606277052757358686187249587833483622951068755564437706268645919720898812154651410735166469301589965697476758067194636020452303250497949048947399883127275733209713104883264862130618398438300031458732794354541218179182692182949013878301564321481423815928645752291194790291300506635648891720930673414441649427368858727539840128657434212664708614252838891346368857902932357270177886061675600124771866970699942139129985509310786171897907713767025490553617452052324190314230443669713785943929520934640464416671176139062034948722091493965189712072792638835666067743532362554736033778616139422395438938944605811706580880420836614049374657066594246393012966219639062789307544592960174860630795820249954853388936995742898065294246733938102175776059529094912831231797891546390571057749606999349996810181557492618640128215744807587466320221438600412521428466916484908092508563270571335405686177916252953143575335641923049301557353017574575315800626626939667724977283350476378690544602400232622622606984439469645646912594417064906111761643056936695157678048364605212059547317525838488465251538119345419979627752159611803463974561223291334210165604062771592587817061728345698629469530077932541521870102279760384499807979877285590410184415905645947383083105790145978931820171516152080500903184835361062491319185763169442515370923471198674337350461697251811045075909288347136691842306340831907917252439136412062563991015509661175647955551494200111528584410842714112893660931587222547527616371447626907477263138994491219951425656610431931653530106776137603833078393623616256283714563444092455070819135182372571411642399666607859039700751818268082294407317787468307510454272859459361639319979293997084018517407055270237114922624894768464359698724807022283865063570179483291145554841647601059067178556847880390815917137788528020328496013081698320174206083993477134242184345417718684421898434176286183306074297397337394378635818040034822140823705679673305304460208977733857268729121898133230944150931434375503975562627800112089417314200987543199614195325678616295902673204032176076607741253741011953899538950353479401701480978109520837367985644204216226079933908944509320472574034339086658841246013841750123876174304679348186657771224594878774792577476351726916884715747652858200960751333538695549872163988000264532075579235359661317563583521988757053827631636808305880569746716283687194118275915928060447077646581456256839985578728945837051179362571449947348159120582527720210320816824370932805266651927288698009547480142504810428454261511435444743728876175627914098669648063196082808198168469420588173819431297620345075913670651853432169177514148111886459795089429969643832554329992461199712957262962023969219032890174902935953126450366971415811499887844992885605846137934153585373646778724962248920989408566923423587556265193045579464470040331860146021474495993513170797583044448771741365214872568116252634674100076242158561453923395526895656905772931330601248536544975755715095764080696461966467575052492961263728205392340905646916958065447157660255882585819023423114809694122214668524218426504844940638948658914245639927512262303170595924131913084701462263664582335366579733760671407937763694121917898012253202550794445927090056988580987161070251889864283474072790532666000445210799879898795369575601310701000600506735376838711381823879045908375392524259853266319554558572588187561880636974923425500452774001254800799279088468508982839057565328297629505098869916759252131884099115322420686108894783264515139811150209926303957155203500393727027411079117369478937095384712003637406693041168456532590381021805048371107896453595203099293812662714637405025074568828822557880697107157708023383177045107932793985761637095123260953060223303469977176881187266346286506759842379165512015006845041184833055602957447462579518605453908265316222905883648379800344280559713700655734203702709055921414200515024650167935251509501402436061376649103597691145127922934267080064403467326795745195948481361947814886969942673557755096669771873496442918230266249855317268651317823644283800930551559885321061219165671786041281110803227612135737813344806675638712573522540330326752464442386379900620750588198544947113799155493133901793000917834934968229504797669239833050649010268588703408635567999483106225365924725096344849106407354596440471549184675431400247646054497566794504464730489228246171177238763846374129323806353067143453547105684101405874350776205012855998370519788550563353055706151297118603093875039708128437347187128159250402631828887145334311373552557223689628363908560011768895131535294161055044642175226187415342324320677763066911181419980149855416104489931529489458659833547172890548612497344779808640595096229937705251106163138658308234789274625008958442163643654994384491346591453337999940340102822545663315950182058410804877289936327981680704769212059417689650218871786818104993012530393359782797076272952876972564899611799589468478404319021053066185948310785346220896419939008967567342765319314502669727526379972481519742277811246822238899767398834228515626e-4951 +9.11299882970618650632101483404854954099762703923390835930245121757092922158349434202390177156456801299311836836800882775491746408155508042493377018897452251370955645294482919642306315951408389939155390641495852682235079948388381817147810199988543202753879634595761513692178855612323826464929567053565655516883088865211017019814938434922056584742975703338666052989323453000054190668073008069358409757711401382448879713824803063830292790871907284615732508878463187540078321144646836641714520837263280926298497175995827146959986580625367150614866594146717614105908677560599298664715089392016783619495691054934073204437823890134211440316961661977129365812730934009878180695353988341524099861100850529263372112005494440901109477171905812258529227323637633070888651063754117762127747538812423705094043768193630399481207316041168207344806208594630537211881115413335113285224633734725269999866521248948235216770556291974523156583071033408384307591427651668177754025424246727136381704023361696393955886321614167616227321765765646890482554798209893671519933100185483167698146646061975813150428625627913004683426389119417464100765417965247075255522252188101059573453030353939631794886820407058177721498614643678758463219398856506200197929995488836037979149750875957205550088916491989692772734422102307762690936220523614080121068179030699537459090415147398802270894221813558133238807437473160137690739859560319624048454845519386476365293136990335117454422791419023565330181431828151870734413285105404921525764882299855357984362391524834349015768804575560961368835419493115509531656725852041771629386346595538752239016488852598228738155981970211789883296133871666620120140851882857096332325130619421054262737816186863658938716553696235385578777759657671097856303109826047646030593555743071151634371263116162163842429774756690129571890249249302694618266745032356856859879258097741197841919555437407743854928359534790669719638999794382112720687011634647044361817576684558724625744225713250341137601306821773485014581447146364342163747989066465762520868021905766505225844729872480243797707355400502595509869443020850165379788743173859145576255477727144173012043383739723542744190771201959350703462306885235518328850278815583719203990521860325564139609728125151807551445503270918528255874403111303698792745962171997087050822360314227188891304020453787801409723278140603832271114233523786546117322725291527658718897541208901735407351872443594948184951168691060870978021172967942306361626571077641327297718119321563981345882136259090137713556729892811590283306476205075479147079271094428064841973711602823705646768958871746411377707470132144695674603139062318630558765273113585596550581780101956885083478653298047293578971034172004858991568415867607860110758034102943901257650359209265993172582604368796832550227991875124190404530653699113234281017599675972717228881762872616434186349441235273719869912359540644153586737163021327006174089564189146448642123329760513470710952045089696777693604518869700296629894354067974095792458927056409146163642160925654650608387234540930183193134586363628266252885168941377664242625103384301342516981220052304340851830918342112001226102103494435426741373561760199946612965455547118392814389204858321021871505919062366967370907845118464121559886753900829580653195913017174949634850101659327920682778835169460415060177607887785092602593896393234825771018460885175530137990762628739986435339792477919143869600819845028005086837073134537699580113198710606881625449213227965777044569159618080059467520715567940849048784878428075784048591505385207632864227646012093136506294441285115051778230787980794100536688217055491722478845399120313290174205565180798564880453263575864305591991982317190768223088819713678569560965777695766765031114759828882044210076232880703287186456087723032648753799500639301083120803887861774378127519055841200300722021908912663658736721808181905976614769167556777158540579802589251818342338664296892261598721223770948525882958989903498643844474443881365494366186879540743752522865890481258185661398661450145400174586954255798594980349336920287623171809337255391051615774034675800312569439495102693161753597894786106093813129941691167614502128824411906036203613374017421281859950157388018923162152170376719761094107244365793793801295386989614878789768675321459623423508501915602525045883285379171046365189543766620390254725283257987760524763324279709362246110807714160684401619696970071324975880463756403103367758616656042889802269384624618776702823507265083567950830141623483756155429929421201110837966736672631316515189583047632951808141375472573438564897736858285096083841743349704224813424575529979035722907751337333843039501444986132294183971798495102322118655423647575774638095594242360591296505782746376955904417512797972253837869914944669033112417910503764885109559325980725764019767086158860069193141356486082481913726565738118888937728005969856159005365510830407857091418962966413725423368585852851555226887522511422397080984203668781525866100305932014546262080118812816720718824780145563272508294470918608085953183530980510731638727137057868321337393052740572472450248506633407330366175138007347879323263799054516416812819059372532301524603584725802735622225698063481166985270568316890882163465835860871623940600102494748996263020577682569269241310711569600642071296841397219163311355761801485869653232991052823372343529891437871696801221125576878093230993279797781403517189023631723195830422007577725139506420863862974621850284828822685869365480256496976333059074849714862234685521871829072182677767188190862348091724309064749272794249063321076671908863590465544851797913038810912654892930058032156032696351232641701257308317843886563328321861571453054990391255663627593467645412053697784792717742627268539680491908356367887628950374547776804069405173086753558728381846453041208618750501774850530747859885695995496231795325167400822547623776548946062132824935065676526699584643380994341310235323423803547168908178861770343063137755745480312781418782959802518533071507405360815531786468005601078564554813901603820054611268663508697528768889628343605688404297049596482791202545704250698543069950757050521641770316863337335336374097309844944123604755575260516996650125261366737501014283681733536922919507996674711342574996766846101827584358457029128707686343622690042918038244648760087851393131630756512803773427475141968392096310643636596252141934565987883169137323589104391449442898909624179787394451054072973031385263786793430936247939167418114755343777822188531343229598604494060773257053675832346507949828487383790335973180102261516252489745244736999415636378666048565524416324310653091992191500157293663971772706090895913460914745069391507821607407119079643228761455973951456502533178244458604653367072208247136844293637699200643287171063323543071264194456731844289514661786350889430308378000623859334853499710695649927546553930859489538568835127452768087260261620951571152218348568929719647604673202322083355880695310174743610457469825948560363963194178330338717661812773680168893080697111977194694723029058532904402104183070246873285332971231965064831098195313946537722964800874303153979101249774266944684978714490326471233669690510878880297645474564156158989457731952855288748034996749984050907787463093200641078724037937331601107193002062607142334582424540462542816352856677028430889581264765717876678209615246507786765087872876579003133134698338624886416752381893452723012001163113113034922197348228234562972085324530558808215284683475788390241823026060297736587629192442326257690596727099898138760798059017319872806116456671050828020313857962939085308641728493147347650389662707609350511398801922499039899386427952050922079528229736915415528950729894659100857580760402504515924176805312456595928815847212576854617355993371686752308486259055225379546441735683459211531704159539586262195682060312819955077548305878239777757471000557642922054213570564468304657936112737638081857238134537386315694972456099757128283052159658267650533880688019165391968118081281418572817220462275354095675911862857058211998333039295198503759091340411472036588937341537552271364297296808196599896469985420092587035276351185574613124473842321798493624035111419325317850897416455727774208238005295335892784239401954079585688942640101642480065408491600871030419967385671210921727088593422109492170881430916530371486986686971893179090200174110704118528398366526522301044888669286343645609490666154720754657171877519877813139000560447086571004937715998070976628393081479513366020160880383038706268705059769497694751767397008507404890547604186839928221021081130399669544722546602362870171695433294206230069208750619380871523396740933288856122974393873962887381758634584423578738264291004803756667693477749360819940001322660377896176798306587817917609943785269138158184041529402848733581418435970591379579640302235388232907281284199927893644729185255896812857249736740795602912638601051604084121854664026333259636443490047737400712524052142271307557177223718644380878139570493348240315980414040990842347102940869097156488101725379568353259267160845887570740559432298975447149848219162771649962305998564786314810119846095164450874514679765632251834857079057499439224964428029230689670767926868233893624811244604947042834617117937781325965227897322350201659300730107372479967565853987915222243858706826074362840581263173370500381210792807269616977634478284528864656653006242682724878778575478820403482309832337875262464806318641026961704528234584790327235788301279412929095117115574048470611073342621092132524224703194743294571228199637561311515852979620659565423507311318322911676832898668803357039688818470609589490061266012753972229635450284942904935805351259449321417370363952663330002226053999399493976847878006553505003002533676884193556909119395229541876962621299266331597772792862940937809403184874617127502263870006274003996395442342544914195287826641488147525494349583796260659420495576612103430544473916322575699055751049631519785776017501968635137055395586847394685476923560018187033465205842282662951905109025241855539482267976015496469063313573187025125372844144112789403485535788540116915885225539663969928808185475616304765301116517349885884405936331731432533799211895827560075034225205924165278014787237312897593027269541326581114529418241899001721402798568503278671018513545279607071002575123250839676257547507012180306883245517988455725639614671335400322017336633978725979742406809739074434849713367788775483348859367482214591151331249276586343256589118221419004652757799426605306095828358930206405554016138060678689066724033378193562867612701651633762322211931899503103752940992724735568995777465669508965004589174674841147523988346199165253245051342943517043177839997415531126829623625481724245532036772982202357745923377157001238230272487833972522323652446141230855886193819231870646619031765335717267735528420507029371753881025064279991852598942752816765278530756485593015469375198540642186735935640796252013159144435726671556867762786118448141819542800058844475657676470805275223210876130937076711621603388815334555907099900749277080522449657647447293299167735864452743062486723899043202975481149688526255530815693291541173946373125044792210818218274971922456732957266689999701700514112728316579750910292054024386449681639908403523846060297088448251094358934090524965062651966798913985381364764384862824498058997947342392021595105265330929741553926731104482099695044837836713826596572513348637631899862407598711389056234111194498836994171142578124e-4952 +9.11299882970618650632101483404854954099762703923390835930245121757092922158349434202390177156456801299311836836800882775491746408155508042493377018897452251370955645294482919642306315951408389939155390641495852682235079948388381817147810199988543202753879634595761513692178855612323826464929567053565655516883088865211017019814938434922056584742975703338666052989323453000054190668073008069358409757711401382448879713824803063830292790871907284615732508878463187540078321144646836641714520837263280926298497175995827146959986580625367150614866594146717614105908677560599298664715089392016783619495691054934073204437823890134211440316961661977129365812730934009878180695353988341524099861100850529263372112005494440901109477171905812258529227323637633070888651063754117762127747538812423705094043768193630399481207316041168207344806208594630537211881115413335113285224633734725269999866521248948235216770556291974523156583071033408384307591427651668177754025424246727136381704023361696393955886321614167616227321765765646890482554798209893671519933100185483167698146646061975813150428625627913004683426389119417464100765417965247075255522252188101059573453030353939631794886820407058177721498614643678758463219398856506200197929995488836037979149750875957205550088916491989692772734422102307762690936220523614080121068179030699537459090415147398802270894221813558133238807437473160137690739859560319624048454845519386476365293136990335117454422791419023565330181431828151870734413285105404921525764882299855357984362391524834349015768804575560961368835419493115509531656725852041771629386346595538752239016488852598228738155981970211789883296133871666620120140851882857096332325130619421054262737816186863658938716553696235385578777759657671097856303109826047646030593555743071151634371263116162163842429774756690129571890249249302694618266745032356856859879258097741197841919555437407743854928359534790669719638999794382112720687011634647044361817576684558724625744225713250341137601306821773485014581447146364342163747989066465762520868021905766505225844729872480243797707355400502595509869443020850165379788743173859145576255477727144173012043383739723542744190771201959350703462306885235518328850278815583719203990521860325564139609728125151807551445503270918528255874403111303698792745962171997087050822360314227188891304020453787801409723278140603832271114233523786546117322725291527658718897541208901735407351872443594948184951168691060870978021172967942306361626571077641327297718119321563981345882136259090137713556729892811590283306476205075479147079271094428064841973711602823705646768958871746411377707470132144695674603139062318630558765273113585596550581780101956885083478653298047293578971034172004858991568415867607860110758034102943901257650359209265993172582604368796832550227991875124190404530653699113234281017599675972717228881762872616434186349441235273719869912359540644153586737163021327006174089564189146448642123329760513470710952045089696777693604518869700296629894354067974095792458927056409146163642160925654650608387234540930183193134586363628266252885168941377664242625103384301342516981220052304340851830918342112001226102103494435426741373561760199946612965455547118392814389204858321021871505919062366967370907845118464121559886753900829580653195913017174949634850101659327920682778835169460415060177607887785092602593896393234825771018460885175530137990762628739986435339792477919143869600819845028005086837073134537699580113198710606881625449213227965777044569159618080059467520715567940849048784878428075784048591505385207632864227646012093136506294441285115051778230787980794100536688217055491722478845399120313290174205565180798564880453263575864305591991982317190768223088819713678569560965777695766765031114759828882044210076232880703287186456087723032648753799500639301083120803887861774378127519055841200300722021908912663658736721808181905976614769167556777158540579802589251818342338664296892261598721223770948525882958989903498643844474443881365494366186879540743752522865890481258185661398661450145400174586954255798594980349336920287623171809337255391051615774034675800312569439495102693161753597894786106093813129941691167614502128824411906036203613374017421281859950157388018923162152170376719761094107244365793793801295386989614878789768675321459623423508501915602525045883285379171046365189543766620390254725283257987760524763324279709362246110807714160684401619696970071324975880463756403103367758616656042889802269384624618776702823507265083567950830141623483756155429929421201110837966736672631316515189583047632951808141375472573438564897736858285096083841743349704224813424575529979035722907751337333843039501444986132294183971798495102322118655423647575774638095594242360591296505782746376955904417512797972253837869914944669033112417910503764885109559325980725764019767086158860069193141356486082481913726565738118888937728005969856159005365510830407857091418962966413725423368585852851555226887522511422397080984203668781525866100305932014546262080118812816720718824780145563272508294470918608085953183530980510731638727137057868321337393052740572472450248506633407330366175138007347879323263799054516416812819059372532301524603584725802735622225698063481166985270568316890882163465835860871623940600102494748996263020577682569269241310711569600642071296841397219163311355761801485869653232991052823372343529891437871696801221125576878093230993279797781403517189023631723195830422007577725139506420863862974621850284828822685869365480256496976333059074849714862234685521871829072182677767188190862348091724309064749272794249063321076671908863590465544851797913038810912654892930058032156032696351232641701257308317843886563328321861571453054990391255663627593467645412053697784792717742627268539680491908356367887628950374547776804069405173086753558728381846453041208618750501774850530747859885695995496231795325167400822547623776548946062132824935065676526699584643380994341310235323423803547168908178861770343063137755745480312781418782959802518533071507405360815531786468005601078564554813901603820054611268663508697528768889628343605688404297049596482791202545704250698543069950757050521641770316863337335336374097309844944123604755575260516996650125261366737501014283681733536922919507996674711342574996766846101827584358457029128707686343622690042918038244648760087851393131630756512803773427475141968392096310643636596252141934565987883169137323589104391449442898909624179787394451054072973031385263786793430936247939167418114755343777822188531343229598604494060773257053675832346507949828487383790335973180102261516252489745244736999415636378666048565524416324310653091992191500157293663971772706090895913460914745069391507821607407119079643228761455973951456502533178244458604653367072208247136844293637699200643287171063323543071264194456731844289514661786350889430308378000623859334853499710695649927546553930859489538568835127452768087260261620951571152218348568929719647604673202322083355880695310174743610457469825948560363963194178330338717661812773680168893080697111977194694723029058532904402104183070246873285332971231965064831098195313946537722964800874303153979101249774266944684978714490326471233669690510878880297645474564156158989457731952855288748034996749984050907787463093200641078724037937331601107193002062607142334582424540462542816352856677028430889581264765717876678209615246507786765087872876579003133134698338624886416752381893452723012001163113113034922197348228234562972085324530558808215284683475788390241823026060297736587629192442326257690596727099898138760798059017319872806116456671050828020313857962939085308641728493147347650389662707609350511398801922499039899386427952050922079528229736915415528950729894659100857580760402504515924176805312456595928815847212576854617355993371686752308486259055225379546441735683459211531704159539586262195682060312819955077548305878239777757471000557642922054213570564468304657936112737638081857238134537386315694972456099757128283052159658267650533880688019165391968118081281418572817220462275354095675911862857058211998333039295198503759091340411472036588937341537552271364297296808196599896469985420092587035276351185574613124473842321798493624035111419325317850897416455727774208238005295335892784239401954079585688942640101642480065408491600871030419967385671210921727088593422109492170881430916530371486986686971893179090200174110704118528398366526522301044888669286343645609490666154720754657171877519877813139000560447086571004937715998070976628393081479513366020160880383038706268705059769497694751767397008507404890547604186839928221021081130399669544722546602362870171695433294206230069208750619380871523396740933288856122974393873962887381758634584423578738264291004803756667693477749360819940001322660377896176798306587817917609943785269138158184041529402848733581418435970591379579640302235388232907281284199927893644729185255896812857249736740795602912638601051604084121854664026333259636443490047737400712524052142271307557177223718644380878139570493348240315980414040990842347102940869097156488101725379568353259267160845887570740559432298975447149848219162771649962305998564786314810119846095164450874514679765632251834857079057499439224964428029230689670767926868233893624811244604947042834617117937781325965227897322350201659300730107372479967565853987915222243858706826074362840581263173370500381210792807269616977634478284528864656653006242682724878778575478820403482309832337875262464806318641026961704528234584790327235788301279412929095117115574048470611073342621092132524224703194743294571228199637561311515852979620659565423507311318322911676832898668803357039688818470609589490061266012753972229635450284942904935805351259449321417370363952663330002226053999399493976847878006553505003002533676884193556909119395229541876962621299266331597772792862940937809403184874617127502263870006274003996395442342544914195287826641488147525494349583796260659420495576612103430544473916322575699055751049631519785776017501968635137055395586847394685476923560018187033465205842282662951905109025241855539482267976015496469063313573187025125372844144112789403485535788540116915885225539663969928808185475616304765301116517349885884405936331731432533799211895827560075034225205924165278014787237312897593027269541326581114529418241899001721402798568503278671018513545279607071002575123250839676257547507012180306883245517988455725639614671335400322017336633978725979742406809739074434849713367788775483348859367482214591151331249276586343256589118221419004652757799426605306095828358930206405554016138060678689066724033378193562867612701651633762322211931899503103752940992724735568995777465669508965004589174674841147523988346199165253245051342943517043177839997415531126829623625481724245532036772982202357745923377157001238230272487833972522323652446141230855886193819231870646619031765335717267735528420507029371753881025064279991852598942752816765278530756485593015469375198540642186735935640796252013159144435726671556867762786118448141819542800058844475657676470805275223210876130937076711621603388815334555907099900749277080522449657647447293299167735864452743062486723899043202975481149688526255530815693291541173946373125044792210818218274971922456732957266689999701700514112728316579750910292054024386449681639908403523846060297088448251094358934090524965062651966798913985381364764384862824498058997947342392021595105265330929741553926731104482099695044837836713826596572513348637631899862407598711389056234111194498836994171142578125e-4952 +9.11299882970618650632101483404854954099762703923390835930245121757092922158349434202390177156456801299311836836800882775491746408155508042493377018897452251370955645294482919642306315951408389939155390641495852682235079948388381817147810199988543202753879634595761513692178855612323826464929567053565655516883088865211017019814938434922056584742975703338666052989323453000054190668073008069358409757711401382448879713824803063830292790871907284615732508878463187540078321144646836641714520837263280926298497175995827146959986580625367150614866594146717614105908677560599298664715089392016783619495691054934073204437823890134211440316961661977129365812730934009878180695353988341524099861100850529263372112005494440901109477171905812258529227323637633070888651063754117762127747538812423705094043768193630399481207316041168207344806208594630537211881115413335113285224633734725269999866521248948235216770556291974523156583071033408384307591427651668177754025424246727136381704023361696393955886321614167616227321765765646890482554798209893671519933100185483167698146646061975813150428625627913004683426389119417464100765417965247075255522252188101059573453030353939631794886820407058177721498614643678758463219398856506200197929995488836037979149750875957205550088916491989692772734422102307762690936220523614080121068179030699537459090415147398802270894221813558133238807437473160137690739859560319624048454845519386476365293136990335117454422791419023565330181431828151870734413285105404921525764882299855357984362391524834349015768804575560961368835419493115509531656725852041771629386346595538752239016488852598228738155981970211789883296133871666620120140851882857096332325130619421054262737816186863658938716553696235385578777759657671097856303109826047646030593555743071151634371263116162163842429774756690129571890249249302694618266745032356856859879258097741197841919555437407743854928359534790669719638999794382112720687011634647044361817576684558724625744225713250341137601306821773485014581447146364342163747989066465762520868021905766505225844729872480243797707355400502595509869443020850165379788743173859145576255477727144173012043383739723542744190771201959350703462306885235518328850278815583719203990521860325564139609728125151807551445503270918528255874403111303698792745962171997087050822360314227188891304020453787801409723278140603832271114233523786546117322725291527658718897541208901735407351872443594948184951168691060870978021172967942306361626571077641327297718119321563981345882136259090137713556729892811590283306476205075479147079271094428064841973711602823705646768958871746411377707470132144695674603139062318630558765273113585596550581780101956885083478653298047293578971034172004858991568415867607860110758034102943901257650359209265993172582604368796832550227991875124190404530653699113234281017599675972717228881762872616434186349441235273719869912359540644153586737163021327006174089564189146448642123329760513470710952045089696777693604518869700296629894354067974095792458927056409146163642160925654650608387234540930183193134586363628266252885168941377664242625103384301342516981220052304340851830918342112001226102103494435426741373561760199946612965455547118392814389204858321021871505919062366967370907845118464121559886753900829580653195913017174949634850101659327920682778835169460415060177607887785092602593896393234825771018460885175530137990762628739986435339792477919143869600819845028005086837073134537699580113198710606881625449213227965777044569159618080059467520715567940849048784878428075784048591505385207632864227646012093136506294441285115051778230787980794100536688217055491722478845399120313290174205565180798564880453263575864305591991982317190768223088819713678569560965777695766765031114759828882044210076232880703287186456087723032648753799500639301083120803887861774378127519055841200300722021908912663658736721808181905976614769167556777158540579802589251818342338664296892261598721223770948525882958989903498643844474443881365494366186879540743752522865890481258185661398661450145400174586954255798594980349336920287623171809337255391051615774034675800312569439495102693161753597894786106093813129941691167614502128824411906036203613374017421281859950157388018923162152170376719761094107244365793793801295386989614878789768675321459623423508501915602525045883285379171046365189543766620390254725283257987760524763324279709362246110807714160684401619696970071324975880463756403103367758616656042889802269384624618776702823507265083567950830141623483756155429929421201110837966736672631316515189583047632951808141375472573438564897736858285096083841743349704224813424575529979035722907751337333843039501444986132294183971798495102322118655423647575774638095594242360591296505782746376955904417512797972253837869914944669033112417910503764885109559325980725764019767086158860069193141356486082481913726565738118888937728005969856159005365510830407857091418962966413725423368585852851555226887522511422397080984203668781525866100305932014546262080118812816720718824780145563272508294470918608085953183530980510731638727137057868321337393052740572472450248506633407330366175138007347879323263799054516416812819059372532301524603584725802735622225698063481166985270568316890882163465835860871623940600102494748996263020577682569269241310711569600642071296841397219163311355761801485869653232991052823372343529891437871696801221125576878093230993279797781403517189023631723195830422007577725139506420863862974621850284828822685869365480256496976333059074849714862234685521871829072182677767188190862348091724309064749272794249063321076671908863590465544851797913038810912654892930058032156032696351232641701257308317843886563328321861571453054990391255663627593467645412053697784792717742627268539680491908356367887628950374547776804069405173086753558728381846453041208618750501774850530747859885695995496231795325167400822547623776548946062132824935065676526699584643380994341310235323423803547168908178861770343063137755745480312781418782959802518533071507405360815531786468005601078564554813901603820054611268663508697528768889628343605688404297049596482791202545704250698543069950757050521641770316863337335336374097309844944123604755575260516996650125261366737501014283681733536922919507996674711342574996766846101827584358457029128707686343622690042918038244648760087851393131630756512803773427475141968392096310643636596252141934565987883169137323589104391449442898909624179787394451054072973031385263786793430936247939167418114755343777822188531343229598604494060773257053675832346507949828487383790335973180102261516252489745244736999415636378666048565524416324310653091992191500157293663971772706090895913460914745069391507821607407119079643228761455973951456502533178244458604653367072208247136844293637699200643287171063323543071264194456731844289514661786350889430308378000623859334853499710695649927546553930859489538568835127452768087260261620951571152218348568929719647604673202322083355880695310174743610457469825948560363963194178330338717661812773680168893080697111977194694723029058532904402104183070246873285332971231965064831098195313946537722964800874303153979101249774266944684978714490326471233669690510878880297645474564156158989457731952855288748034996749984050907787463093200641078724037937331601107193002062607142334582424540462542816352856677028430889581264765717876678209615246507786765087872876579003133134698338624886416752381893452723012001163113113034922197348228234562972085324530558808215284683475788390241823026060297736587629192442326257690596727099898138760798059017319872806116456671050828020313857962939085308641728493147347650389662707609350511398801922499039899386427952050922079528229736915415528950729894659100857580760402504515924176805312456595928815847212576854617355993371686752308486259055225379546441735683459211531704159539586262195682060312819955077548305878239777757471000557642922054213570564468304657936112737638081857238134537386315694972456099757128283052159658267650533880688019165391968118081281418572817220462275354095675911862857058211998333039295198503759091340411472036588937341537552271364297296808196599896469985420092587035276351185574613124473842321798493624035111419325317850897416455727774208238005295335892784239401954079585688942640101642480065408491600871030419967385671210921727088593422109492170881430916530371486986686971893179090200174110704118528398366526522301044888669286343645609490666154720754657171877519877813139000560447086571004937715998070976628393081479513366020160880383038706268705059769497694751767397008507404890547604186839928221021081130399669544722546602362870171695433294206230069208750619380871523396740933288856122974393873962887381758634584423578738264291004803756667693477749360819940001322660377896176798306587817917609943785269138158184041529402848733581418435970591379579640302235388232907281284199927893644729185255896812857249736740795602912638601051604084121854664026333259636443490047737400712524052142271307557177223718644380878139570493348240315980414040990842347102940869097156488101725379568353259267160845887570740559432298975447149848219162771649962305998564786314810119846095164450874514679765632251834857079057499439224964428029230689670767926868233893624811244604947042834617117937781325965227897322350201659300730107372479967565853987915222243858706826074362840581263173370500381210792807269616977634478284528864656653006242682724878778575478820403482309832337875262464806318641026961704528234584790327235788301279412929095117115574048470611073342621092132524224703194743294571228199637561311515852979620659565423507311318322911676832898668803357039688818470609589490061266012753972229635450284942904935805351259449321417370363952663330002226053999399493976847878006553505003002533676884193556909119395229541876962621299266331597772792862940937809403184874617127502263870006274003996395442342544914195287826641488147525494349583796260659420495576612103430544473916322575699055751049631519785776017501968635137055395586847394685476923560018187033465205842282662951905109025241855539482267976015496469063313573187025125372844144112789403485535788540116915885225539663969928808185475616304765301116517349885884405936331731432533799211895827560075034225205924165278014787237312897593027269541326581114529418241899001721402798568503278671018513545279607071002575123250839676257547507012180306883245517988455725639614671335400322017336633978725979742406809739074434849713367788775483348859367482214591151331249276586343256589118221419004652757799426605306095828358930206405554016138060678689066724033378193562867612701651633762322211931899503103752940992724735568995777465669508965004589174674841147523988346199165253245051342943517043177839997415531126829623625481724245532036772982202357745923377157001238230272487833972522323652446141230855886193819231870646619031765335717267735528420507029371753881025064279991852598942752816765278530756485593015469375198540642186735935640796252013159144435726671556867762786118448141819542800058844475657676470805275223210876130937076711621603388815334555907099900749277080522449657647447293299167735864452743062486723899043202975481149688526255530815693291541173946373125044792210818218274971922456732957266689999701700514112728316579750910292054024386449681639908403523846060297088448251094358934090524965062651966798913985381364764384862824498058997947342392021595105265330929741553926731104482099695044837836713826596572513348637631899862407598711389056234111194498836994171142578126e-4952 +-9.11299882970618650632101483404854954099762703923390835930245121757092922158349434202390177156456801299311836836800882775491746408155508042493377018897452251370955645294482919642306315951408389939155390641495852682235079948388381817147810199988543202753879634595761513692178855612323826464929567053565655516883088865211017019814938434922056584742975703338666052989323453000054190668073008069358409757711401382448879713824803063830292790871907284615732508878463187540078321144646836641714520837263280926298497175995827146959986580625367150614866594146717614105908677560599298664715089392016783619495691054934073204437823890134211440316961661977129365812730934009878180695353988341524099861100850529263372112005494440901109477171905812258529227323637633070888651063754117762127747538812423705094043768193630399481207316041168207344806208594630537211881115413335113285224633734725269999866521248948235216770556291974523156583071033408384307591427651668177754025424246727136381704023361696393955886321614167616227321765765646890482554798209893671519933100185483167698146646061975813150428625627913004683426389119417464100765417965247075255522252188101059573453030353939631794886820407058177721498614643678758463219398856506200197929995488836037979149750875957205550088916491989692772734422102307762690936220523614080121068179030699537459090415147398802270894221813558133238807437473160137690739859560319624048454845519386476365293136990335117454422791419023565330181431828151870734413285105404921525764882299855357984362391524834349015768804575560961368835419493115509531656725852041771629386346595538752239016488852598228738155981970211789883296133871666620120140851882857096332325130619421054262737816186863658938716553696235385578777759657671097856303109826047646030593555743071151634371263116162163842429774756690129571890249249302694618266745032356856859879258097741197841919555437407743854928359534790669719638999794382112720687011634647044361817576684558724625744225713250341137601306821773485014581447146364342163747989066465762520868021905766505225844729872480243797707355400502595509869443020850165379788743173859145576255477727144173012043383739723542744190771201959350703462306885235518328850278815583719203990521860325564139609728125151807551445503270918528255874403111303698792745962171997087050822360314227188891304020453787801409723278140603832271114233523786546117322725291527658718897541208901735407351872443594948184951168691060870978021172967942306361626571077641327297718119321563981345882136259090137713556729892811590283306476205075479147079271094428064841973711602823705646768958871746411377707470132144695674603139062318630558765273113585596550581780101956885083478653298047293578971034172004858991568415867607860110758034102943901257650359209265993172582604368796832550227991875124190404530653699113234281017599675972717228881762872616434186349441235273719869912359540644153586737163021327006174089564189146448642123329760513470710952045089696777693604518869700296629894354067974095792458927056409146163642160925654650608387234540930183193134586363628266252885168941377664242625103384301342516981220052304340851830918342112001226102103494435426741373561760199946612965455547118392814389204858321021871505919062366967370907845118464121559886753900829580653195913017174949634850101659327920682778835169460415060177607887785092602593896393234825771018460885175530137990762628739986435339792477919143869600819845028005086837073134537699580113198710606881625449213227965777044569159618080059467520715567940849048784878428075784048591505385207632864227646012093136506294441285115051778230787980794100536688217055491722478845399120313290174205565180798564880453263575864305591991982317190768223088819713678569560965777695766765031114759828882044210076232880703287186456087723032648753799500639301083120803887861774378127519055841200300722021908912663658736721808181905976614769167556777158540579802589251818342338664296892261598721223770948525882958989903498643844474443881365494366186879540743752522865890481258185661398661450145400174586954255798594980349336920287623171809337255391051615774034675800312569439495102693161753597894786106093813129941691167614502128824411906036203613374017421281859950157388018923162152170376719761094107244365793793801295386989614878789768675321459623423508501915602525045883285379171046365189543766620390254725283257987760524763324279709362246110807714160684401619696970071324975880463756403103367758616656042889802269384624618776702823507265083567950830141623483756155429929421201110837966736672631316515189583047632951808141375472573438564897736858285096083841743349704224813424575529979035722907751337333843039501444986132294183971798495102322118655423647575774638095594242360591296505782746376955904417512797972253837869914944669033112417910503764885109559325980725764019767086158860069193141356486082481913726565738118888937728005969856159005365510830407857091418962966413725423368585852851555226887522511422397080984203668781525866100305932014546262080118812816720718824780145563272508294470918608085953183530980510731638727137057868321337393052740572472450248506633407330366175138007347879323263799054516416812819059372532301524603584725802735622225698063481166985270568316890882163465835860871623940600102494748996263020577682569269241310711569600642071296841397219163311355761801485869653232991052823372343529891437871696801221125576878093230993279797781403517189023631723195830422007577725139506420863862974621850284828822685869365480256496976333059074849714862234685521871829072182677767188190862348091724309064749272794249063321076671908863590465544851797913038810912654892930058032156032696351232641701257308317843886563328321861571453054990391255663627593467645412053697784792717742627268539680491908356367887628950374547776804069405173086753558728381846453041208618750501774850530747859885695995496231795325167400822547623776548946062132824935065676526699584643380994341310235323423803547168908178861770343063137755745480312781418782959802518533071507405360815531786468005601078564554813901603820054611268663508697528768889628343605688404297049596482791202545704250698543069950757050521641770316863337335336374097309844944123604755575260516996650125261366737501014283681733536922919507996674711342574996766846101827584358457029128707686343622690042918038244648760087851393131630756512803773427475141968392096310643636596252141934565987883169137323589104391449442898909624179787394451054072973031385263786793430936247939167418114755343777822188531343229598604494060773257053675832346507949828487383790335973180102261516252489745244736999415636378666048565524416324310653091992191500157293663971772706090895913460914745069391507821607407119079643228761455973951456502533178244458604653367072208247136844293637699200643287171063323543071264194456731844289514661786350889430308378000623859334853499710695649927546553930859489538568835127452768087260261620951571152218348568929719647604673202322083355880695310174743610457469825948560363963194178330338717661812773680168893080697111977194694723029058532904402104183070246873285332971231965064831098195313946537722964800874303153979101249774266944684978714490326471233669690510878880297645474564156158989457731952855288748034996749984050907787463093200641078724037937331601107193002062607142334582424540462542816352856677028430889581264765717876678209615246507786765087872876579003133134698338624886416752381893452723012001163113113034922197348228234562972085324530558808215284683475788390241823026060297736587629192442326257690596727099898138760798059017319872806116456671050828020313857962939085308641728493147347650389662707609350511398801922499039899386427952050922079528229736915415528950729894659100857580760402504515924176805312456595928815847212576854617355993371686752308486259055225379546441735683459211531704159539586262195682060312819955077548305878239777757471000557642922054213570564468304657936112737638081857238134537386315694972456099757128283052159658267650533880688019165391968118081281418572817220462275354095675911862857058211998333039295198503759091340411472036588937341537552271364297296808196599896469985420092587035276351185574613124473842321798493624035111419325317850897416455727774208238005295335892784239401954079585688942640101642480065408491600871030419967385671210921727088593422109492170881430916530371486986686971893179090200174110704118528398366526522301044888669286343645609490666154720754657171877519877813139000560447086571004937715998070976628393081479513366020160880383038706268705059769497694751767397008507404890547604186839928221021081130399669544722546602362870171695433294206230069208750619380871523396740933288856122974393873962887381758634584423578738264291004803756667693477749360819940001322660377896176798306587817917609943785269138158184041529402848733581418435970591379579640302235388232907281284199927893644729185255896812857249736740795602912638601051604084121854664026333259636443490047737400712524052142271307557177223718644380878139570493348240315980414040990842347102940869097156488101725379568353259267160845887570740559432298975447149848219162771649962305998564786314810119846095164450874514679765632251834857079057499439224964428029230689670767926868233893624811244604947042834617117937781325965227897322350201659300730107372479967565853987915222243858706826074362840581263173370500381210792807269616977634478284528864656653006242682724878778575478820403482309832337875262464806318641026961704528234584790327235788301279412929095117115574048470611073342621092132524224703194743294571228199637561311515852979620659565423507311318322911676832898668803357039688818470609589490061266012753972229635450284942904935805351259449321417370363952663330002226053999399493976847878006553505003002533676884193556909119395229541876962621299266331597772792862940937809403184874617127502263870006274003996395442342544914195287826641488147525494349583796260659420495576612103430544473916322575699055751049631519785776017501968635137055395586847394685476923560018187033465205842282662951905109025241855539482267976015496469063313573187025125372844144112789403485535788540116915885225539663969928808185475616304765301116517349885884405936331731432533799211895827560075034225205924165278014787237312897593027269541326581114529418241899001721402798568503278671018513545279607071002575123250839676257547507012180306883245517988455725639614671335400322017336633978725979742406809739074434849713367788775483348859367482214591151331249276586343256589118221419004652757799426605306095828358930206405554016138060678689066724033378193562867612701651633762322211931899503103752940992724735568995777465669508965004589174674841147523988346199165253245051342943517043177839997415531126829623625481724245532036772982202357745923377157001238230272487833972522323652446141230855886193819231870646619031765335717267735528420507029371753881025064279991852598942752816765278530756485593015469375198540642186735935640796252013159144435726671556867762786118448141819542800058844475657676470805275223210876130937076711621603388815334555907099900749277080522449657647447293299167735864452743062486723899043202975481149688526255530815693291541173946373125044792210818218274971922456732957266689999701700514112728316579750910292054024386449681639908403523846060297088448251094358934090524965062651966798913985381364764384862824498058997947342392021595105265330929741553926731104482099695044837836713826596572513348637631899862407598711389056234111194498836994171142578124e-4952 +-9.11299882970618650632101483404854954099762703923390835930245121757092922158349434202390177156456801299311836836800882775491746408155508042493377018897452251370955645294482919642306315951408389939155390641495852682235079948388381817147810199988543202753879634595761513692178855612323826464929567053565655516883088865211017019814938434922056584742975703338666052989323453000054190668073008069358409757711401382448879713824803063830292790871907284615732508878463187540078321144646836641714520837263280926298497175995827146959986580625367150614866594146717614105908677560599298664715089392016783619495691054934073204437823890134211440316961661977129365812730934009878180695353988341524099861100850529263372112005494440901109477171905812258529227323637633070888651063754117762127747538812423705094043768193630399481207316041168207344806208594630537211881115413335113285224633734725269999866521248948235216770556291974523156583071033408384307591427651668177754025424246727136381704023361696393955886321614167616227321765765646890482554798209893671519933100185483167698146646061975813150428625627913004683426389119417464100765417965247075255522252188101059573453030353939631794886820407058177721498614643678758463219398856506200197929995488836037979149750875957205550088916491989692772734422102307762690936220523614080121068179030699537459090415147398802270894221813558133238807437473160137690739859560319624048454845519386476365293136990335117454422791419023565330181431828151870734413285105404921525764882299855357984362391524834349015768804575560961368835419493115509531656725852041771629386346595538752239016488852598228738155981970211789883296133871666620120140851882857096332325130619421054262737816186863658938716553696235385578777759657671097856303109826047646030593555743071151634371263116162163842429774756690129571890249249302694618266745032356856859879258097741197841919555437407743854928359534790669719638999794382112720687011634647044361817576684558724625744225713250341137601306821773485014581447146364342163747989066465762520868021905766505225844729872480243797707355400502595509869443020850165379788743173859145576255477727144173012043383739723542744190771201959350703462306885235518328850278815583719203990521860325564139609728125151807551445503270918528255874403111303698792745962171997087050822360314227188891304020453787801409723278140603832271114233523786546117322725291527658718897541208901735407351872443594948184951168691060870978021172967942306361626571077641327297718119321563981345882136259090137713556729892811590283306476205075479147079271094428064841973711602823705646768958871746411377707470132144695674603139062318630558765273113585596550581780101956885083478653298047293578971034172004858991568415867607860110758034102943901257650359209265993172582604368796832550227991875124190404530653699113234281017599675972717228881762872616434186349441235273719869912359540644153586737163021327006174089564189146448642123329760513470710952045089696777693604518869700296629894354067974095792458927056409146163642160925654650608387234540930183193134586363628266252885168941377664242625103384301342516981220052304340851830918342112001226102103494435426741373561760199946612965455547118392814389204858321021871505919062366967370907845118464121559886753900829580653195913017174949634850101659327920682778835169460415060177607887785092602593896393234825771018460885175530137990762628739986435339792477919143869600819845028005086837073134537699580113198710606881625449213227965777044569159618080059467520715567940849048784878428075784048591505385207632864227646012093136506294441285115051778230787980794100536688217055491722478845399120313290174205565180798564880453263575864305591991982317190768223088819713678569560965777695766765031114759828882044210076232880703287186456087723032648753799500639301083120803887861774378127519055841200300722021908912663658736721808181905976614769167556777158540579802589251818342338664296892261598721223770948525882958989903498643844474443881365494366186879540743752522865890481258185661398661450145400174586954255798594980349336920287623171809337255391051615774034675800312569439495102693161753597894786106093813129941691167614502128824411906036203613374017421281859950157388018923162152170376719761094107244365793793801295386989614878789768675321459623423508501915602525045883285379171046365189543766620390254725283257987760524763324279709362246110807714160684401619696970071324975880463756403103367758616656042889802269384624618776702823507265083567950830141623483756155429929421201110837966736672631316515189583047632951808141375472573438564897736858285096083841743349704224813424575529979035722907751337333843039501444986132294183971798495102322118655423647575774638095594242360591296505782746376955904417512797972253837869914944669033112417910503764885109559325980725764019767086158860069193141356486082481913726565738118888937728005969856159005365510830407857091418962966413725423368585852851555226887522511422397080984203668781525866100305932014546262080118812816720718824780145563272508294470918608085953183530980510731638727137057868321337393052740572472450248506633407330366175138007347879323263799054516416812819059372532301524603584725802735622225698063481166985270568316890882163465835860871623940600102494748996263020577682569269241310711569600642071296841397219163311355761801485869653232991052823372343529891437871696801221125576878093230993279797781403517189023631723195830422007577725139506420863862974621850284828822685869365480256496976333059074849714862234685521871829072182677767188190862348091724309064749272794249063321076671908863590465544851797913038810912654892930058032156032696351232641701257308317843886563328321861571453054990391255663627593467645412053697784792717742627268539680491908356367887628950374547776804069405173086753558728381846453041208618750501774850530747859885695995496231795325167400822547623776548946062132824935065676526699584643380994341310235323423803547168908178861770343063137755745480312781418782959802518533071507405360815531786468005601078564554813901603820054611268663508697528768889628343605688404297049596482791202545704250698543069950757050521641770316863337335336374097309844944123604755575260516996650125261366737501014283681733536922919507996674711342574996766846101827584358457029128707686343622690042918038244648760087851393131630756512803773427475141968392096310643636596252141934565987883169137323589104391449442898909624179787394451054072973031385263786793430936247939167418114755343777822188531343229598604494060773257053675832346507949828487383790335973180102261516252489745244736999415636378666048565524416324310653091992191500157293663971772706090895913460914745069391507821607407119079643228761455973951456502533178244458604653367072208247136844293637699200643287171063323543071264194456731844289514661786350889430308378000623859334853499710695649927546553930859489538568835127452768087260261620951571152218348568929719647604673202322083355880695310174743610457469825948560363963194178330338717661812773680168893080697111977194694723029058532904402104183070246873285332971231965064831098195313946537722964800874303153979101249774266944684978714490326471233669690510878880297645474564156158989457731952855288748034996749984050907787463093200641078724037937331601107193002062607142334582424540462542816352856677028430889581264765717876678209615246507786765087872876579003133134698338624886416752381893452723012001163113113034922197348228234562972085324530558808215284683475788390241823026060297736587629192442326257690596727099898138760798059017319872806116456671050828020313857962939085308641728493147347650389662707609350511398801922499039899386427952050922079528229736915415528950729894659100857580760402504515924176805312456595928815847212576854617355993371686752308486259055225379546441735683459211531704159539586262195682060312819955077548305878239777757471000557642922054213570564468304657936112737638081857238134537386315694972456099757128283052159658267650533880688019165391968118081281418572817220462275354095675911862857058211998333039295198503759091340411472036588937341537552271364297296808196599896469985420092587035276351185574613124473842321798493624035111419325317850897416455727774208238005295335892784239401954079585688942640101642480065408491600871030419967385671210921727088593422109492170881430916530371486986686971893179090200174110704118528398366526522301044888669286343645609490666154720754657171877519877813139000560447086571004937715998070976628393081479513366020160880383038706268705059769497694751767397008507404890547604186839928221021081130399669544722546602362870171695433294206230069208750619380871523396740933288856122974393873962887381758634584423578738264291004803756667693477749360819940001322660377896176798306587817917609943785269138158184041529402848733581418435970591379579640302235388232907281284199927893644729185255896812857249736740795602912638601051604084121854664026333259636443490047737400712524052142271307557177223718644380878139570493348240315980414040990842347102940869097156488101725379568353259267160845887570740559432298975447149848219162771649962305998564786314810119846095164450874514679765632251834857079057499439224964428029230689670767926868233893624811244604947042834617117937781325965227897322350201659300730107372479967565853987915222243858706826074362840581263173370500381210792807269616977634478284528864656653006242682724878778575478820403482309832337875262464806318641026961704528234584790327235788301279412929095117115574048470611073342621092132524224703194743294571228199637561311515852979620659565423507311318322911676832898668803357039688818470609589490061266012753972229635450284942904935805351259449321417370363952663330002226053999399493976847878006553505003002533676884193556909119395229541876962621299266331597772792862940937809403184874617127502263870006274003996395442342544914195287826641488147525494349583796260659420495576612103430544473916322575699055751049631519785776017501968635137055395586847394685476923560018187033465205842282662951905109025241855539482267976015496469063313573187025125372844144112789403485535788540116915885225539663969928808185475616304765301116517349885884405936331731432533799211895827560075034225205924165278014787237312897593027269541326581114529418241899001721402798568503278671018513545279607071002575123250839676257547507012180306883245517988455725639614671335400322017336633978725979742406809739074434849713367788775483348859367482214591151331249276586343256589118221419004652757799426605306095828358930206405554016138060678689066724033378193562867612701651633762322211931899503103752940992724735568995777465669508965004589174674841147523988346199165253245051342943517043177839997415531126829623625481724245532036772982202357745923377157001238230272487833972522323652446141230855886193819231870646619031765335717267735528420507029371753881025064279991852598942752816765278530756485593015469375198540642186735935640796252013159144435726671556867762786118448141819542800058844475657676470805275223210876130937076711621603388815334555907099900749277080522449657647447293299167735864452743062486723899043202975481149688526255530815693291541173946373125044792210818218274971922456732957266689999701700514112728316579750910292054024386449681639908403523846060297088448251094358934090524965062651966798913985381364764384862824498058997947342392021595105265330929741553926731104482099695044837836713826596572513348637631899862407598711389056234111194498836994171142578125e-4952 +-9.11299882970618650632101483404854954099762703923390835930245121757092922158349434202390177156456801299311836836800882775491746408155508042493377018897452251370955645294482919642306315951408389939155390641495852682235079948388381817147810199988543202753879634595761513692178855612323826464929567053565655516883088865211017019814938434922056584742975703338666052989323453000054190668073008069358409757711401382448879713824803063830292790871907284615732508878463187540078321144646836641714520837263280926298497175995827146959986580625367150614866594146717614105908677560599298664715089392016783619495691054934073204437823890134211440316961661977129365812730934009878180695353988341524099861100850529263372112005494440901109477171905812258529227323637633070888651063754117762127747538812423705094043768193630399481207316041168207344806208594630537211881115413335113285224633734725269999866521248948235216770556291974523156583071033408384307591427651668177754025424246727136381704023361696393955886321614167616227321765765646890482554798209893671519933100185483167698146646061975813150428625627913004683426389119417464100765417965247075255522252188101059573453030353939631794886820407058177721498614643678758463219398856506200197929995488836037979149750875957205550088916491989692772734422102307762690936220523614080121068179030699537459090415147398802270894221813558133238807437473160137690739859560319624048454845519386476365293136990335117454422791419023565330181431828151870734413285105404921525764882299855357984362391524834349015768804575560961368835419493115509531656725852041771629386346595538752239016488852598228738155981970211789883296133871666620120140851882857096332325130619421054262737816186863658938716553696235385578777759657671097856303109826047646030593555743071151634371263116162163842429774756690129571890249249302694618266745032356856859879258097741197841919555437407743854928359534790669719638999794382112720687011634647044361817576684558724625744225713250341137601306821773485014581447146364342163747989066465762520868021905766505225844729872480243797707355400502595509869443020850165379788743173859145576255477727144173012043383739723542744190771201959350703462306885235518328850278815583719203990521860325564139609728125151807551445503270918528255874403111303698792745962171997087050822360314227188891304020453787801409723278140603832271114233523786546117322725291527658718897541208901735407351872443594948184951168691060870978021172967942306361626571077641327297718119321563981345882136259090137713556729892811590283306476205075479147079271094428064841973711602823705646768958871746411377707470132144695674603139062318630558765273113585596550581780101956885083478653298047293578971034172004858991568415867607860110758034102943901257650359209265993172582604368796832550227991875124190404530653699113234281017599675972717228881762872616434186349441235273719869912359540644153586737163021327006174089564189146448642123329760513470710952045089696777693604518869700296629894354067974095792458927056409146163642160925654650608387234540930183193134586363628266252885168941377664242625103384301342516981220052304340851830918342112001226102103494435426741373561760199946612965455547118392814389204858321021871505919062366967370907845118464121559886753900829580653195913017174949634850101659327920682778835169460415060177607887785092602593896393234825771018460885175530137990762628739986435339792477919143869600819845028005086837073134537699580113198710606881625449213227965777044569159618080059467520715567940849048784878428075784048591505385207632864227646012093136506294441285115051778230787980794100536688217055491722478845399120313290174205565180798564880453263575864305591991982317190768223088819713678569560965777695766765031114759828882044210076232880703287186456087723032648753799500639301083120803887861774378127519055841200300722021908912663658736721808181905976614769167556777158540579802589251818342338664296892261598721223770948525882958989903498643844474443881365494366186879540743752522865890481258185661398661450145400174586954255798594980349336920287623171809337255391051615774034675800312569439495102693161753597894786106093813129941691167614502128824411906036203613374017421281859950157388018923162152170376719761094107244365793793801295386989614878789768675321459623423508501915602525045883285379171046365189543766620390254725283257987760524763324279709362246110807714160684401619696970071324975880463756403103367758616656042889802269384624618776702823507265083567950830141623483756155429929421201110837966736672631316515189583047632951808141375472573438564897736858285096083841743349704224813424575529979035722907751337333843039501444986132294183971798495102322118655423647575774638095594242360591296505782746376955904417512797972253837869914944669033112417910503764885109559325980725764019767086158860069193141356486082481913726565738118888937728005969856159005365510830407857091418962966413725423368585852851555226887522511422397080984203668781525866100305932014546262080118812816720718824780145563272508294470918608085953183530980510731638727137057868321337393052740572472450248506633407330366175138007347879323263799054516416812819059372532301524603584725802735622225698063481166985270568316890882163465835860871623940600102494748996263020577682569269241310711569600642071296841397219163311355761801485869653232991052823372343529891437871696801221125576878093230993279797781403517189023631723195830422007577725139506420863862974621850284828822685869365480256496976333059074849714862234685521871829072182677767188190862348091724309064749272794249063321076671908863590465544851797913038810912654892930058032156032696351232641701257308317843886563328321861571453054990391255663627593467645412053697784792717742627268539680491908356367887628950374547776804069405173086753558728381846453041208618750501774850530747859885695995496231795325167400822547623776548946062132824935065676526699584643380994341310235323423803547168908178861770343063137755745480312781418782959802518533071507405360815531786468005601078564554813901603820054611268663508697528768889628343605688404297049596482791202545704250698543069950757050521641770316863337335336374097309844944123604755575260516996650125261366737501014283681733536922919507996674711342574996766846101827584358457029128707686343622690042918038244648760087851393131630756512803773427475141968392096310643636596252141934565987883169137323589104391449442898909624179787394451054072973031385263786793430936247939167418114755343777822188531343229598604494060773257053675832346507949828487383790335973180102261516252489745244736999415636378666048565524416324310653091992191500157293663971772706090895913460914745069391507821607407119079643228761455973951456502533178244458604653367072208247136844293637699200643287171063323543071264194456731844289514661786350889430308378000623859334853499710695649927546553930859489538568835127452768087260261620951571152218348568929719647604673202322083355880695310174743610457469825948560363963194178330338717661812773680168893080697111977194694723029058532904402104183070246873285332971231965064831098195313946537722964800874303153979101249774266944684978714490326471233669690510878880297645474564156158989457731952855288748034996749984050907787463093200641078724037937331601107193002062607142334582424540462542816352856677028430889581264765717876678209615246507786765087872876579003133134698338624886416752381893452723012001163113113034922197348228234562972085324530558808215284683475788390241823026060297736587629192442326257690596727099898138760798059017319872806116456671050828020313857962939085308641728493147347650389662707609350511398801922499039899386427952050922079528229736915415528950729894659100857580760402504515924176805312456595928815847212576854617355993371686752308486259055225379546441735683459211531704159539586262195682060312819955077548305878239777757471000557642922054213570564468304657936112737638081857238134537386315694972456099757128283052159658267650533880688019165391968118081281418572817220462275354095675911862857058211998333039295198503759091340411472036588937341537552271364297296808196599896469985420092587035276351185574613124473842321798493624035111419325317850897416455727774208238005295335892784239401954079585688942640101642480065408491600871030419967385671210921727088593422109492170881430916530371486986686971893179090200174110704118528398366526522301044888669286343645609490666154720754657171877519877813139000560447086571004937715998070976628393081479513366020160880383038706268705059769497694751767397008507404890547604186839928221021081130399669544722546602362870171695433294206230069208750619380871523396740933288856122974393873962887381758634584423578738264291004803756667693477749360819940001322660377896176798306587817917609943785269138158184041529402848733581418435970591379579640302235388232907281284199927893644729185255896812857249736740795602912638601051604084121854664026333259636443490047737400712524052142271307557177223718644380878139570493348240315980414040990842347102940869097156488101725379568353259267160845887570740559432298975447149848219162771649962305998564786314810119846095164450874514679765632251834857079057499439224964428029230689670767926868233893624811244604947042834617117937781325965227897322350201659300730107372479967565853987915222243858706826074362840581263173370500381210792807269616977634478284528864656653006242682724878778575478820403482309832337875262464806318641026961704528234584790327235788301279412929095117115574048470611073342621092132524224703194743294571228199637561311515852979620659565423507311318322911676832898668803357039688818470609589490061266012753972229635450284942904935805351259449321417370363952663330002226053999399493976847878006553505003002533676884193556909119395229541876962621299266331597772792862940937809403184874617127502263870006274003996395442342544914195287826641488147525494349583796260659420495576612103430544473916322575699055751049631519785776017501968635137055395586847394685476923560018187033465205842282662951905109025241855539482267976015496469063313573187025125372844144112789403485535788540116915885225539663969928808185475616304765301116517349885884405936331731432533799211895827560075034225205924165278014787237312897593027269541326581114529418241899001721402798568503278671018513545279607071002575123250839676257547507012180306883245517988455725639614671335400322017336633978725979742406809739074434849713367788775483348859367482214591151331249276586343256589118221419004652757799426605306095828358930206405554016138060678689066724033378193562867612701651633762322211931899503103752940992724735568995777465669508965004589174674841147523988346199165253245051342943517043177839997415531126829623625481724245532036772982202357745923377157001238230272487833972522323652446141230855886193819231870646619031765335717267735528420507029371753881025064279991852598942752816765278530756485593015469375198540642186735935640796252013159144435726671556867762786118448141819542800058844475657676470805275223210876130937076711621603388815334555907099900749277080522449657647447293299167735864452743062486723899043202975481149688526255530815693291541173946373125044792210818218274971922456732957266689999701700514112728316579750910292054024386449681639908403523846060297088448251094358934090524965062651966798913985381364764384862824498058997947342392021595105265330929741553926731104482099695044837836713826596572513348637631899862407598711389056234111194498836994171142578126e-4952 +3.237587559719012555462219479113823276249784669017340504844942194598519770062059685508835745638324970127939070738424059838293609943191271023342555035986308991521396355375667467208367312819235870119724263252776995195727778126085574034035411017344128491238136414394551514178668780674015531193282296319913113495953953933831631032855605791532328598034154166422617226534880263244723830482289656875701701315902175019974435037627824356684033058939701577883356651733717468531204705842607568803666569711421917525834491783583598401321476176752039857173551930268891446850107760584333855521475305010940756813993214730850216669600967698749412592167692757446422169965426483919224341062751152057061076522973232731542382055087239368522167656194830741819605276971705738272393130698937532095725613383807312946395184980707534803490003540251394324459987958400939111001126190861523615485938285497714410609640798273816511769391568591823198476415765275534341709798367687043373145262933998108452661682659942586304978413812755518166239176614473815940025342279575304159493260770068030636885746695206392378276051948759263882079389379666940357441139816661913198656187703463519723262653223919257185751827493927586153153792077729913353547954808876263400200663495414360816863385220457719546338953323399286762099558324132103460225580066817535680886906060858264089074120360391613368274811868067637495154569071591624185979937989402513750464346904036668477876379544221432800037599944499161940321774835027752710681217554286366043661491013593886229615614494736186475932160549630939390542165126494166960681499481651861215529870984381726203476917507560266886692644952355421814201350137351435237036912624414444992497142303802423605897110605364956579914507108584002230524766331348271456591814078599780820974961968314684496428310691542272663818486132771177670874927831510002443658417608078383611526899905533629456904234997116303929427262032216072887961072267850618234492852606488522739744757845004694461812790342894353802938671928834585447328398711684245164703625580196678024410303542544534512706792134908369873605619756775207191558754413381571756431003248529020572648048946458999967788526617126349345966896362376841092268841417781414969315002419192181972121568811432459128737128140063645558482525300089060238860392371092102688097987915838860882370022268312322882235690785726190915062699382576041643741555139697348927957856990969985342299599797431503615312038393069808777315725367497595040966093808407117316369389112216628231869173217637452855462790553030636920487796465880633399632793882734473382168542596184679158149228725004404714293460752371865436947855237307240001863573081174929166645758276081272685156100195420794154740486637315823136798695124738873328565945598241199335059398955049459449844741098478330319112865980346771381982151154499846478545530650091824164892591396650703633600023191521502618379988693800703884555191647864959327260468892793195316578510173816406054364319294906641284764788384683586662382042642852654156477478700779123584369965723284711409361741235548687181052639639279285373139084165798451899763979500837428077782309910703522399860010310321116623028924118238023770381424894162717815296210097245221769714495449744327945091943394325259297771090128969600269822520904193880119094781214175887316220311309028456568749910010962366586834018403242866721783519806933018588077977626913774236680220258524711348037750591646286531625306510583751929280541119187219596706615736304036444366663256426643903386694536649648686380122198677895751002327229059364018755164517060321515091173358005987498359799467138817648881479418623694683454881683746841149715181334498096967702613110590140231345676956141227850879905018558219984441819798054463206764413100251255775535830770535620946159535406497134759043192647996190512978586496199656070707105117773853504277795024754647024165589129442822627147868917463795166386552921913398878270019905147510849518894114102536073369047160130990411626048426437835295683097278297774735181045158616674564080237813146623269215019613231938626758927531490945029356207933289363847181438902539297057969524961348607844569521442237914899100699610921669921572167164875488132527187949318543809703388178931170799769792886086681284964861608656928109305369539955846964197786677053847603962194721523867993048528558551380823699291873352033111096244814245789620930756114228971363838828108534030152031715929722499546436547773404017947035596936338462103946797525667033935433489292620531649199724400832489751788129365426568881328357966337292439204382537174357675404105580244018783685041224798457022189315692175787257287203633134300759209060570319508886475377719911176071302732819878165468592717406388218727585026352127436844762994722826390779737322113768842482160812973100323673863050234437722898796145596181862320550301285861980052194863780743808106946940079349630782676930197134206259739125377941060751175427888774493677478593805682322173891730311959284895178856039354015035864931073602059531001572891528828982167810245343327388887928886208615327002834690068636094325052251429781641267821367266715283643659749152264457938319185148303604827363623405060374573505789923003843438436174489383805098509083722050766328250349793203837202162624690093533478114438810603140565070517669964629947543608404988178019652088162307525611931821066493746994641048066011859814337589829896549720562117090677291541318153057715167624128318297771376531788973088699647168159229805877415594828532539839967464064556647594705830374653113373530876658380240145380423210673778776803592627231257495817394581607796277282644312510714532297108722017217547317744900647318022108570947064304280100418971450552007356891519523293614416944016354756866350050833501416942505071203810116719053430543531027953437436446745566839242129860410443198862219469972163224971258348314341755015213118628882713134766297624091644805801186976152536913514712919240503721680740586016832099946807466311777189050656676962849581383790904722087478646766320517056183581970236248227413322748304134245717987665377396011236706627320817654565682680006957454759981618023476448544673508068369492066566895437050571584345511070959483898938738225050292533674383091612495407126805381796487365892131916426837522671623266627483065655765705534239355214893395905702329340402794052884259146049064629582075576563307670749189662176976725361937046200576007893814439695301892528761187544161389682003509216791271836545495416676148151145195082668323677621182991451835324281863619641773620601014510950996746726615703771971266687151564427772359427340566909351858654807999781808513034680104078196607462166928018863385629928965649243954503391493597963417955268639606791452833692467872935741940362479842688642227725662504694679557678170929873774151037857807219938356152056997839625453727441947651198316190826615266016347740875615970031428012228328190610356706715662722241878767131224669837573607121539572299329404101274463156060298348931678277361174057097484704587036227686110677413094941011961262438027467952964727129462752693949019764164538344775554466171428121848999818969114034332797672927989107710137279281184295118233855942385256333164153378143279674287318136458207166174996112638689535976047617221520910027427485161965702038805161865494457444594178063766957037428053543239915792369877811053417485684498667123216132006378630814477106813088898563644909178779463295955587688067277368683836470612208483299572260344016516194247232298740800342116589984844356688576984553507410293250093945014209879983314562948451929862241009275783684229669718641013736581856815277185073259140534024850924787544871716174654424640728091372513505922826813145390369149590652886241000625495880523771672395227312971578042522330551788256261683080675549820375567692574152956993944504349004617185470945673049153218968830613586193253490318451871770642617802890083608004460414305421033261048294750210470303202846332054952531617433058538758154347087854561609738141615145103748777579733574989673510104836750248325511777237502526995647687215364262385606217553691332159421351598905950537513518351520709657614578131639854432532002236696200855408766520105076378983345708235918180749273124590433024519869147132931932462703067876214268579940066030521414045386366551780718510535469417760242493782392451178913322503092692423649855756521279456558275339921490892868856862895022564047205838132429286600764536839036698193759634186899291274131934296059833048690594627623595320676097721540716472990950611858372856271872423573251506230042608074167903809812264198034505185435990821356377966484742250577592243727298923187891299404854048446822719928239317254073429532989089675503790372464487057264894107613242300912487070053676379388189496900004239731820229886894053019610823763957809819187948639826973433528683168917360632750040517847686479093538683816924213175672979768822065627696943474914020483056384006872835738311110986586149510661361915342172527409078742250880056867149831149121019729847242037335904440063130981999650700416787683293610119590221942974317455716336227454789239793488032299063316588917505912406020220045264868457718282165158892171630470709599503997282778168097827497383884195820921583645621293941200045604062174334998171535030513366277293714389988219756129580868518167923841173364269774889246694435264051484911461988227011238661037602452710188911900438270362280391121270021679247152879324195035694278071477495720447513017171148877312193736366348711630105507365864598069586257026976295714123943691621672377694552248018987680338612382795605985191106112971398796002636340393693119651973344711646854574482999700397952536878348512983782198330513744803168936076427075943787200489575435147989033386529956551570669047103070223076797892329848058499725632813524581372640746415923016932853954152472487866287318545051065376430120748079948860283261855738836955246188128622509828635867225708782966017423170535046509131388753895013061151387840089512861842615441729962315731301087767989000918136617870582141517330935619268642915983553727587587676791953536960714236687847602589538927962585440961131240218794236944630211930970546118745080346860636620310193382167597465544174488399379683716417891139157575146359165023126594124268610800205258776019000550873739401445303129974560221438061891795442780328126230093178952504570380957199592993338719686487798275474853570100033092481743129836527369756194343789131822069107283156271772679863538216891518713732520976834628418347371261368933454629405371869789752684339805368137450825001203521193642598238954329102258317328098581116978343883611320940814793654745807336162557057195523274610323601685712314930799144191673243832283659669368716126815118360353441303009936083544193524336572930768154506567477565558211143508568396203781879592033787429012753106951129653074630840496376302289668286168325299592504054003803917262600195834001336180158836765599057537979745423711070158871650976475924365707758401328959478791343481250979029363644046972556422294698558561670817595994409985323205913035009923360820734795546082012200697671744573982535291905800552837118327702125018691644774560916230166739307705017656065679867259837178918123254219579594535869171376148397610005870749992910355727569593729567789260479930835305112462727870603529547312621720559953074675620549217314861961905983960910846471569192459257648138212674016814845327496495507412976753381357634960529826817906824433858135485518651632270319927880227571858035210375443324098235463619647723862420557582355632137583370066602155641218235815280874570372436217877316899649287051943247206509113311767578124e-4966 +3.237587559719012555462219479113823276249784669017340504844942194598519770062059685508835745638324970127939070738424059838293609943191271023342555035986308991521396355375667467208367312819235870119724263252776995195727778126085574034035411017344128491238136414394551514178668780674015531193282296319913113495953953933831631032855605791532328598034154166422617226534880263244723830482289656875701701315902175019974435037627824356684033058939701577883356651733717468531204705842607568803666569711421917525834491783583598401321476176752039857173551930268891446850107760584333855521475305010940756813993214730850216669600967698749412592167692757446422169965426483919224341062751152057061076522973232731542382055087239368522167656194830741819605276971705738272393130698937532095725613383807312946395184980707534803490003540251394324459987958400939111001126190861523615485938285497714410609640798273816511769391568591823198476415765275534341709798367687043373145262933998108452661682659942586304978413812755518166239176614473815940025342279575304159493260770068030636885746695206392378276051948759263882079389379666940357441139816661913198656187703463519723262653223919257185751827493927586153153792077729913353547954808876263400200663495414360816863385220457719546338953323399286762099558324132103460225580066817535680886906060858264089074120360391613368274811868067637495154569071591624185979937989402513750464346904036668477876379544221432800037599944499161940321774835027752710681217554286366043661491013593886229615614494736186475932160549630939390542165126494166960681499481651861215529870984381726203476917507560266886692644952355421814201350137351435237036912624414444992497142303802423605897110605364956579914507108584002230524766331348271456591814078599780820974961968314684496428310691542272663818486132771177670874927831510002443658417608078383611526899905533629456904234997116303929427262032216072887961072267850618234492852606488522739744757845004694461812790342894353802938671928834585447328398711684245164703625580196678024410303542544534512706792134908369873605619756775207191558754413381571756431003248529020572648048946458999967788526617126349345966896362376841092268841417781414969315002419192181972121568811432459128737128140063645558482525300089060238860392371092102688097987915838860882370022268312322882235690785726190915062699382576041643741555139697348927957856990969985342299599797431503615312038393069808777315725367497595040966093808407117316369389112216628231869173217637452855462790553030636920487796465880633399632793882734473382168542596184679158149228725004404714293460752371865436947855237307240001863573081174929166645758276081272685156100195420794154740486637315823136798695124738873328565945598241199335059398955049459449844741098478330319112865980346771381982151154499846478545530650091824164892591396650703633600023191521502618379988693800703884555191647864959327260468892793195316578510173816406054364319294906641284764788384683586662382042642852654156477478700779123584369965723284711409361741235548687181052639639279285373139084165798451899763979500837428077782309910703522399860010310321116623028924118238023770381424894162717815296210097245221769714495449744327945091943394325259297771090128969600269822520904193880119094781214175887316220311309028456568749910010962366586834018403242866721783519806933018588077977626913774236680220258524711348037750591646286531625306510583751929280541119187219596706615736304036444366663256426643903386694536649648686380122198677895751002327229059364018755164517060321515091173358005987498359799467138817648881479418623694683454881683746841149715181334498096967702613110590140231345676956141227850879905018558219984441819798054463206764413100251255775535830770535620946159535406497134759043192647996190512978586496199656070707105117773853504277795024754647024165589129442822627147868917463795166386552921913398878270019905147510849518894114102536073369047160130990411626048426437835295683097278297774735181045158616674564080237813146623269215019613231938626758927531490945029356207933289363847181438902539297057969524961348607844569521442237914899100699610921669921572167164875488132527187949318543809703388178931170799769792886086681284964861608656928109305369539955846964197786677053847603962194721523867993048528558551380823699291873352033111096244814245789620930756114228971363838828108534030152031715929722499546436547773404017947035596936338462103946797525667033935433489292620531649199724400832489751788129365426568881328357966337292439204382537174357675404105580244018783685041224798457022189315692175787257287203633134300759209060570319508886475377719911176071302732819878165468592717406388218727585026352127436844762994722826390779737322113768842482160812973100323673863050234437722898796145596181862320550301285861980052194863780743808106946940079349630782676930197134206259739125377941060751175427888774493677478593805682322173891730311959284895178856039354015035864931073602059531001572891528828982167810245343327388887928886208615327002834690068636094325052251429781641267821367266715283643659749152264457938319185148303604827363623405060374573505789923003843438436174489383805098509083722050766328250349793203837202162624690093533478114438810603140565070517669964629947543608404988178019652088162307525611931821066493746994641048066011859814337589829896549720562117090677291541318153057715167624128318297771376531788973088699647168159229805877415594828532539839967464064556647594705830374653113373530876658380240145380423210673778776803592627231257495817394581607796277282644312510714532297108722017217547317744900647318022108570947064304280100418971450552007356891519523293614416944016354756866350050833501416942505071203810116719053430543531027953437436446745566839242129860410443198862219469972163224971258348314341755015213118628882713134766297624091644805801186976152536913514712919240503721680740586016832099946807466311777189050656676962849581383790904722087478646766320517056183581970236248227413322748304134245717987665377396011236706627320817654565682680006957454759981618023476448544673508068369492066566895437050571584345511070959483898938738225050292533674383091612495407126805381796487365892131916426837522671623266627483065655765705534239355214893395905702329340402794052884259146049064629582075576563307670749189662176976725361937046200576007893814439695301892528761187544161389682003509216791271836545495416676148151145195082668323677621182991451835324281863619641773620601014510950996746726615703771971266687151564427772359427340566909351858654807999781808513034680104078196607462166928018863385629928965649243954503391493597963417955268639606791452833692467872935741940362479842688642227725662504694679557678170929873774151037857807219938356152056997839625453727441947651198316190826615266016347740875615970031428012228328190610356706715662722241878767131224669837573607121539572299329404101274463156060298348931678277361174057097484704587036227686110677413094941011961262438027467952964727129462752693949019764164538344775554466171428121848999818969114034332797672927989107710137279281184295118233855942385256333164153378143279674287318136458207166174996112638689535976047617221520910027427485161965702038805161865494457444594178063766957037428053543239915792369877811053417485684498667123216132006378630814477106813088898563644909178779463295955587688067277368683836470612208483299572260344016516194247232298740800342116589984844356688576984553507410293250093945014209879983314562948451929862241009275783684229669718641013736581856815277185073259140534024850924787544871716174654424640728091372513505922826813145390369149590652886241000625495880523771672395227312971578042522330551788256261683080675549820375567692574152956993944504349004617185470945673049153218968830613586193253490318451871770642617802890083608004460414305421033261048294750210470303202846332054952531617433058538758154347087854561609738141615145103748777579733574989673510104836750248325511777237502526995647687215364262385606217553691332159421351598905950537513518351520709657614578131639854432532002236696200855408766520105076378983345708235918180749273124590433024519869147132931932462703067876214268579940066030521414045386366551780718510535469417760242493782392451178913322503092692423649855756521279456558275339921490892868856862895022564047205838132429286600764536839036698193759634186899291274131934296059833048690594627623595320676097721540716472990950611858372856271872423573251506230042608074167903809812264198034505185435990821356377966484742250577592243727298923187891299404854048446822719928239317254073429532989089675503790372464487057264894107613242300912487070053676379388189496900004239731820229886894053019610823763957809819187948639826973433528683168917360632750040517847686479093538683816924213175672979768822065627696943474914020483056384006872835738311110986586149510661361915342172527409078742250880056867149831149121019729847242037335904440063130981999650700416787683293610119590221942974317455716336227454789239793488032299063316588917505912406020220045264868457718282165158892171630470709599503997282778168097827497383884195820921583645621293941200045604062174334998171535030513366277293714389988219756129580868518167923841173364269774889246694435264051484911461988227011238661037602452710188911900438270362280391121270021679247152879324195035694278071477495720447513017171148877312193736366348711630105507365864598069586257026976295714123943691621672377694552248018987680338612382795605985191106112971398796002636340393693119651973344711646854574482999700397952536878348512983782198330513744803168936076427075943787200489575435147989033386529956551570669047103070223076797892329848058499725632813524581372640746415923016932853954152472487866287318545051065376430120748079948860283261855738836955246188128622509828635867225708782966017423170535046509131388753895013061151387840089512861842615441729962315731301087767989000918136617870582141517330935619268642915983553727587587676791953536960714236687847602589538927962585440961131240218794236944630211930970546118745080346860636620310193382167597465544174488399379683716417891139157575146359165023126594124268610800205258776019000550873739401445303129974560221438061891795442780328126230093178952504570380957199592993338719686487798275474853570100033092481743129836527369756194343789131822069107283156271772679863538216891518713732520976834628418347371261368933454629405371869789752684339805368137450825001203521193642598238954329102258317328098581116978343883611320940814793654745807336162557057195523274610323601685712314930799144191673243832283659669368716126815118360353441303009936083544193524336572930768154506567477565558211143508568396203781879592033787429012753106951129653074630840496376302289668286168325299592504054003803917262600195834001336180158836765599057537979745423711070158871650976475924365707758401328959478791343481250979029363644046972556422294698558561670817595994409985323205913035009923360820734795546082012200697671744573982535291905800552837118327702125018691644774560916230166739307705017656065679867259837178918123254219579594535869171376148397610005870749992910355727569593729567789260479930835305112462727870603529547312621720559953074675620549217314861961905983960910846471569192459257648138212674016814845327496495507412976753381357634960529826817906824433858135485518651632270319927880227571858035210375443324098235463619647723862420557582355632137583370066602155641218235815280874570372436217877316899649287051943247206509113311767578125e-4966 +3.237587559719012555462219479113823276249784669017340504844942194598519770062059685508835745638324970127939070738424059838293609943191271023342555035986308991521396355375667467208367312819235870119724263252776995195727778126085574034035411017344128491238136414394551514178668780674015531193282296319913113495953953933831631032855605791532328598034154166422617226534880263244723830482289656875701701315902175019974435037627824356684033058939701577883356651733717468531204705842607568803666569711421917525834491783583598401321476176752039857173551930268891446850107760584333855521475305010940756813993214730850216669600967698749412592167692757446422169965426483919224341062751152057061076522973232731542382055087239368522167656194830741819605276971705738272393130698937532095725613383807312946395184980707534803490003540251394324459987958400939111001126190861523615485938285497714410609640798273816511769391568591823198476415765275534341709798367687043373145262933998108452661682659942586304978413812755518166239176614473815940025342279575304159493260770068030636885746695206392378276051948759263882079389379666940357441139816661913198656187703463519723262653223919257185751827493927586153153792077729913353547954808876263400200663495414360816863385220457719546338953323399286762099558324132103460225580066817535680886906060858264089074120360391613368274811868067637495154569071591624185979937989402513750464346904036668477876379544221432800037599944499161940321774835027752710681217554286366043661491013593886229615614494736186475932160549630939390542165126494166960681499481651861215529870984381726203476917507560266886692644952355421814201350137351435237036912624414444992497142303802423605897110605364956579914507108584002230524766331348271456591814078599780820974961968314684496428310691542272663818486132771177670874927831510002443658417608078383611526899905533629456904234997116303929427262032216072887961072267850618234492852606488522739744757845004694461812790342894353802938671928834585447328398711684245164703625580196678024410303542544534512706792134908369873605619756775207191558754413381571756431003248529020572648048946458999967788526617126349345966896362376841092268841417781414969315002419192181972121568811432459128737128140063645558482525300089060238860392371092102688097987915838860882370022268312322882235690785726190915062699382576041643741555139697348927957856990969985342299599797431503615312038393069808777315725367497595040966093808407117316369389112216628231869173217637452855462790553030636920487796465880633399632793882734473382168542596184679158149228725004404714293460752371865436947855237307240001863573081174929166645758276081272685156100195420794154740486637315823136798695124738873328565945598241199335059398955049459449844741098478330319112865980346771381982151154499846478545530650091824164892591396650703633600023191521502618379988693800703884555191647864959327260468892793195316578510173816406054364319294906641284764788384683586662382042642852654156477478700779123584369965723284711409361741235548687181052639639279285373139084165798451899763979500837428077782309910703522399860010310321116623028924118238023770381424894162717815296210097245221769714495449744327945091943394325259297771090128969600269822520904193880119094781214175887316220311309028456568749910010962366586834018403242866721783519806933018588077977626913774236680220258524711348037750591646286531625306510583751929280541119187219596706615736304036444366663256426643903386694536649648686380122198677895751002327229059364018755164517060321515091173358005987498359799467138817648881479418623694683454881683746841149715181334498096967702613110590140231345676956141227850879905018558219984441819798054463206764413100251255775535830770535620946159535406497134759043192647996190512978586496199656070707105117773853504277795024754647024165589129442822627147868917463795166386552921913398878270019905147510849518894114102536073369047160130990411626048426437835295683097278297774735181045158616674564080237813146623269215019613231938626758927531490945029356207933289363847181438902539297057969524961348607844569521442237914899100699610921669921572167164875488132527187949318543809703388178931170799769792886086681284964861608656928109305369539955846964197786677053847603962194721523867993048528558551380823699291873352033111096244814245789620930756114228971363838828108534030152031715929722499546436547773404017947035596936338462103946797525667033935433489292620531649199724400832489751788129365426568881328357966337292439204382537174357675404105580244018783685041224798457022189315692175787257287203633134300759209060570319508886475377719911176071302732819878165468592717406388218727585026352127436844762994722826390779737322113768842482160812973100323673863050234437722898796145596181862320550301285861980052194863780743808106946940079349630782676930197134206259739125377941060751175427888774493677478593805682322173891730311959284895178856039354015035864931073602059531001572891528828982167810245343327388887928886208615327002834690068636094325052251429781641267821367266715283643659749152264457938319185148303604827363623405060374573505789923003843438436174489383805098509083722050766328250349793203837202162624690093533478114438810603140565070517669964629947543608404988178019652088162307525611931821066493746994641048066011859814337589829896549720562117090677291541318153057715167624128318297771376531788973088699647168159229805877415594828532539839967464064556647594705830374653113373530876658380240145380423210673778776803592627231257495817394581607796277282644312510714532297108722017217547317744900647318022108570947064304280100418971450552007356891519523293614416944016354756866350050833501416942505071203810116719053430543531027953437436446745566839242129860410443198862219469972163224971258348314341755015213118628882713134766297624091644805801186976152536913514712919240503721680740586016832099946807466311777189050656676962849581383790904722087478646766320517056183581970236248227413322748304134245717987665377396011236706627320817654565682680006957454759981618023476448544673508068369492066566895437050571584345511070959483898938738225050292533674383091612495407126805381796487365892131916426837522671623266627483065655765705534239355214893395905702329340402794052884259146049064629582075576563307670749189662176976725361937046200576007893814439695301892528761187544161389682003509216791271836545495416676148151145195082668323677621182991451835324281863619641773620601014510950996746726615703771971266687151564427772359427340566909351858654807999781808513034680104078196607462166928018863385629928965649243954503391493597963417955268639606791452833692467872935741940362479842688642227725662504694679557678170929873774151037857807219938356152056997839625453727441947651198316190826615266016347740875615970031428012228328190610356706715662722241878767131224669837573607121539572299329404101274463156060298348931678277361174057097484704587036227686110677413094941011961262438027467952964727129462752693949019764164538344775554466171428121848999818969114034332797672927989107710137279281184295118233855942385256333164153378143279674287318136458207166174996112638689535976047617221520910027427485161965702038805161865494457444594178063766957037428053543239915792369877811053417485684498667123216132006378630814477106813088898563644909178779463295955587688067277368683836470612208483299572260344016516194247232298740800342116589984844356688576984553507410293250093945014209879983314562948451929862241009275783684229669718641013736581856815277185073259140534024850924787544871716174654424640728091372513505922826813145390369149590652886241000625495880523771672395227312971578042522330551788256261683080675549820375567692574152956993944504349004617185470945673049153218968830613586193253490318451871770642617802890083608004460414305421033261048294750210470303202846332054952531617433058538758154347087854561609738141615145103748777579733574989673510104836750248325511777237502526995647687215364262385606217553691332159421351598905950537513518351520709657614578131639854432532002236696200855408766520105076378983345708235918180749273124590433024519869147132931932462703067876214268579940066030521414045386366551780718510535469417760242493782392451178913322503092692423649855756521279456558275339921490892868856862895022564047205838132429286600764536839036698193759634186899291274131934296059833048690594627623595320676097721540716472990950611858372856271872423573251506230042608074167903809812264198034505185435990821356377966484742250577592243727298923187891299404854048446822719928239317254073429532989089675503790372464487057264894107613242300912487070053676379388189496900004239731820229886894053019610823763957809819187948639826973433528683168917360632750040517847686479093538683816924213175672979768822065627696943474914020483056384006872835738311110986586149510661361915342172527409078742250880056867149831149121019729847242037335904440063130981999650700416787683293610119590221942974317455716336227454789239793488032299063316588917505912406020220045264868457718282165158892171630470709599503997282778168097827497383884195820921583645621293941200045604062174334998171535030513366277293714389988219756129580868518167923841173364269774889246694435264051484911461988227011238661037602452710188911900438270362280391121270021679247152879324195035694278071477495720447513017171148877312193736366348711630105507365864598069586257026976295714123943691621672377694552248018987680338612382795605985191106112971398796002636340393693119651973344711646854574482999700397952536878348512983782198330513744803168936076427075943787200489575435147989033386529956551570669047103070223076797892329848058499725632813524581372640746415923016932853954152472487866287318545051065376430120748079948860283261855738836955246188128622509828635867225708782966017423170535046509131388753895013061151387840089512861842615441729962315731301087767989000918136617870582141517330935619268642915983553727587587676791953536960714236687847602589538927962585440961131240218794236944630211930970546118745080346860636620310193382167597465544174488399379683716417891139157575146359165023126594124268610800205258776019000550873739401445303129974560221438061891795442780328126230093178952504570380957199592993338719686487798275474853570100033092481743129836527369756194343789131822069107283156271772679863538216891518713732520976834628418347371261368933454629405371869789752684339805368137450825001203521193642598238954329102258317328098581116978343883611320940814793654745807336162557057195523274610323601685712314930799144191673243832283659669368716126815118360353441303009936083544193524336572930768154506567477565558211143508568396203781879592033787429012753106951129653074630840496376302289668286168325299592504054003803917262600195834001336180158836765599057537979745423711070158871650976475924365707758401328959478791343481250979029363644046972556422294698558561670817595994409985323205913035009923360820734795546082012200697671744573982535291905800552837118327702125018691644774560916230166739307705017656065679867259837178918123254219579594535869171376148397610005870749992910355727569593729567789260479930835305112462727870603529547312621720559953074675620549217314861961905983960910846471569192459257648138212674016814845327496495507412976753381357634960529826817906824433858135485518651632270319927880227571858035210375443324098235463619647723862420557582355632137583370066602155641218235815280874570372436217877316899649287051943247206509113311767578126e-4966 +-3.237587559719012555462219479113823276249784669017340504844942194598519770062059685508835745638324970127939070738424059838293609943191271023342555035986308991521396355375667467208367312819235870119724263252776995195727778126085574034035411017344128491238136414394551514178668780674015531193282296319913113495953953933831631032855605791532328598034154166422617226534880263244723830482289656875701701315902175019974435037627824356684033058939701577883356651733717468531204705842607568803666569711421917525834491783583598401321476176752039857173551930268891446850107760584333855521475305010940756813993214730850216669600967698749412592167692757446422169965426483919224341062751152057061076522973232731542382055087239368522167656194830741819605276971705738272393130698937532095725613383807312946395184980707534803490003540251394324459987958400939111001126190861523615485938285497714410609640798273816511769391568591823198476415765275534341709798367687043373145262933998108452661682659942586304978413812755518166239176614473815940025342279575304159493260770068030636885746695206392378276051948759263882079389379666940357441139816661913198656187703463519723262653223919257185751827493927586153153792077729913353547954808876263400200663495414360816863385220457719546338953323399286762099558324132103460225580066817535680886906060858264089074120360391613368274811868067637495154569071591624185979937989402513750464346904036668477876379544221432800037599944499161940321774835027752710681217554286366043661491013593886229615614494736186475932160549630939390542165126494166960681499481651861215529870984381726203476917507560266886692644952355421814201350137351435237036912624414444992497142303802423605897110605364956579914507108584002230524766331348271456591814078599780820974961968314684496428310691542272663818486132771177670874927831510002443658417608078383611526899905533629456904234997116303929427262032216072887961072267850618234492852606488522739744757845004694461812790342894353802938671928834585447328398711684245164703625580196678024410303542544534512706792134908369873605619756775207191558754413381571756431003248529020572648048946458999967788526617126349345966896362376841092268841417781414969315002419192181972121568811432459128737128140063645558482525300089060238860392371092102688097987915838860882370022268312322882235690785726190915062699382576041643741555139697348927957856990969985342299599797431503615312038393069808777315725367497595040966093808407117316369389112216628231869173217637452855462790553030636920487796465880633399632793882734473382168542596184679158149228725004404714293460752371865436947855237307240001863573081174929166645758276081272685156100195420794154740486637315823136798695124738873328565945598241199335059398955049459449844741098478330319112865980346771381982151154499846478545530650091824164892591396650703633600023191521502618379988693800703884555191647864959327260468892793195316578510173816406054364319294906641284764788384683586662382042642852654156477478700779123584369965723284711409361741235548687181052639639279285373139084165798451899763979500837428077782309910703522399860010310321116623028924118238023770381424894162717815296210097245221769714495449744327945091943394325259297771090128969600269822520904193880119094781214175887316220311309028456568749910010962366586834018403242866721783519806933018588077977626913774236680220258524711348037750591646286531625306510583751929280541119187219596706615736304036444366663256426643903386694536649648686380122198677895751002327229059364018755164517060321515091173358005987498359799467138817648881479418623694683454881683746841149715181334498096967702613110590140231345676956141227850879905018558219984441819798054463206764413100251255775535830770535620946159535406497134759043192647996190512978586496199656070707105117773853504277795024754647024165589129442822627147868917463795166386552921913398878270019905147510849518894114102536073369047160130990411626048426437835295683097278297774735181045158616674564080237813146623269215019613231938626758927531490945029356207933289363847181438902539297057969524961348607844569521442237914899100699610921669921572167164875488132527187949318543809703388178931170799769792886086681284964861608656928109305369539955846964197786677053847603962194721523867993048528558551380823699291873352033111096244814245789620930756114228971363838828108534030152031715929722499546436547773404017947035596936338462103946797525667033935433489292620531649199724400832489751788129365426568881328357966337292439204382537174357675404105580244018783685041224798457022189315692175787257287203633134300759209060570319508886475377719911176071302732819878165468592717406388218727585026352127436844762994722826390779737322113768842482160812973100323673863050234437722898796145596181862320550301285861980052194863780743808106946940079349630782676930197134206259739125377941060751175427888774493677478593805682322173891730311959284895178856039354015035864931073602059531001572891528828982167810245343327388887928886208615327002834690068636094325052251429781641267821367266715283643659749152264457938319185148303604827363623405060374573505789923003843438436174489383805098509083722050766328250349793203837202162624690093533478114438810603140565070517669964629947543608404988178019652088162307525611931821066493746994641048066011859814337589829896549720562117090677291541318153057715167624128318297771376531788973088699647168159229805877415594828532539839967464064556647594705830374653113373530876658380240145380423210673778776803592627231257495817394581607796277282644312510714532297108722017217547317744900647318022108570947064304280100418971450552007356891519523293614416944016354756866350050833501416942505071203810116719053430543531027953437436446745566839242129860410443198862219469972163224971258348314341755015213118628882713134766297624091644805801186976152536913514712919240503721680740586016832099946807466311777189050656676962849581383790904722087478646766320517056183581970236248227413322748304134245717987665377396011236706627320817654565682680006957454759981618023476448544673508068369492066566895437050571584345511070959483898938738225050292533674383091612495407126805381796487365892131916426837522671623266627483065655765705534239355214893395905702329340402794052884259146049064629582075576563307670749189662176976725361937046200576007893814439695301892528761187544161389682003509216791271836545495416676148151145195082668323677621182991451835324281863619641773620601014510950996746726615703771971266687151564427772359427340566909351858654807999781808513034680104078196607462166928018863385629928965649243954503391493597963417955268639606791452833692467872935741940362479842688642227725662504694679557678170929873774151037857807219938356152056997839625453727441947651198316190826615266016347740875615970031428012228328190610356706715662722241878767131224669837573607121539572299329404101274463156060298348931678277361174057097484704587036227686110677413094941011961262438027467952964727129462752693949019764164538344775554466171428121848999818969114034332797672927989107710137279281184295118233855942385256333164153378143279674287318136458207166174996112638689535976047617221520910027427485161965702038805161865494457444594178063766957037428053543239915792369877811053417485684498667123216132006378630814477106813088898563644909178779463295955587688067277368683836470612208483299572260344016516194247232298740800342116589984844356688576984553507410293250093945014209879983314562948451929862241009275783684229669718641013736581856815277185073259140534024850924787544871716174654424640728091372513505922826813145390369149590652886241000625495880523771672395227312971578042522330551788256261683080675549820375567692574152956993944504349004617185470945673049153218968830613586193253490318451871770642617802890083608004460414305421033261048294750210470303202846332054952531617433058538758154347087854561609738141615145103748777579733574989673510104836750248325511777237502526995647687215364262385606217553691332159421351598905950537513518351520709657614578131639854432532002236696200855408766520105076378983345708235918180749273124590433024519869147132931932462703067876214268579940066030521414045386366551780718510535469417760242493782392451178913322503092692423649855756521279456558275339921490892868856862895022564047205838132429286600764536839036698193759634186899291274131934296059833048690594627623595320676097721540716472990950611858372856271872423573251506230042608074167903809812264198034505185435990821356377966484742250577592243727298923187891299404854048446822719928239317254073429532989089675503790372464487057264894107613242300912487070053676379388189496900004239731820229886894053019610823763957809819187948639826973433528683168917360632750040517847686479093538683816924213175672979768822065627696943474914020483056384006872835738311110986586149510661361915342172527409078742250880056867149831149121019729847242037335904440063130981999650700416787683293610119590221942974317455716336227454789239793488032299063316588917505912406020220045264868457718282165158892171630470709599503997282778168097827497383884195820921583645621293941200045604062174334998171535030513366277293714389988219756129580868518167923841173364269774889246694435264051484911461988227011238661037602452710188911900438270362280391121270021679247152879324195035694278071477495720447513017171148877312193736366348711630105507365864598069586257026976295714123943691621672377694552248018987680338612382795605985191106112971398796002636340393693119651973344711646854574482999700397952536878348512983782198330513744803168936076427075943787200489575435147989033386529956551570669047103070223076797892329848058499725632813524581372640746415923016932853954152472487866287318545051065376430120748079948860283261855738836955246188128622509828635867225708782966017423170535046509131388753895013061151387840089512861842615441729962315731301087767989000918136617870582141517330935619268642915983553727587587676791953536960714236687847602589538927962585440961131240218794236944630211930970546118745080346860636620310193382167597465544174488399379683716417891139157575146359165023126594124268610800205258776019000550873739401445303129974560221438061891795442780328126230093178952504570380957199592993338719686487798275474853570100033092481743129836527369756194343789131822069107283156271772679863538216891518713732520976834628418347371261368933454629405371869789752684339805368137450825001203521193642598238954329102258317328098581116978343883611320940814793654745807336162557057195523274610323601685712314930799144191673243832283659669368716126815118360353441303009936083544193524336572930768154506567477565558211143508568396203781879592033787429012753106951129653074630840496376302289668286168325299592504054003803917262600195834001336180158836765599057537979745423711070158871650976475924365707758401328959478791343481250979029363644046972556422294698558561670817595994409985323205913035009923360820734795546082012200697671744573982535291905800552837118327702125018691644774560916230166739307705017656065679867259837178918123254219579594535869171376148397610005870749992910355727569593729567789260479930835305112462727870603529547312621720559953074675620549217314861961905983960910846471569192459257648138212674016814845327496495507412976753381357634960529826817906824433858135485518651632270319927880227571858035210375443324098235463619647723862420557582355632137583370066602155641218235815280874570372436217877316899649287051943247206509113311767578124e-4966 +-3.237587559719012555462219479113823276249784669017340504844942194598519770062059685508835745638324970127939070738424059838293609943191271023342555035986308991521396355375667467208367312819235870119724263252776995195727778126085574034035411017344128491238136414394551514178668780674015531193282296319913113495953953933831631032855605791532328598034154166422617226534880263244723830482289656875701701315902175019974435037627824356684033058939701577883356651733717468531204705842607568803666569711421917525834491783583598401321476176752039857173551930268891446850107760584333855521475305010940756813993214730850216669600967698749412592167692757446422169965426483919224341062751152057061076522973232731542382055087239368522167656194830741819605276971705738272393130698937532095725613383807312946395184980707534803490003540251394324459987958400939111001126190861523615485938285497714410609640798273816511769391568591823198476415765275534341709798367687043373145262933998108452661682659942586304978413812755518166239176614473815940025342279575304159493260770068030636885746695206392378276051948759263882079389379666940357441139816661913198656187703463519723262653223919257185751827493927586153153792077729913353547954808876263400200663495414360816863385220457719546338953323399286762099558324132103460225580066817535680886906060858264089074120360391613368274811868067637495154569071591624185979937989402513750464346904036668477876379544221432800037599944499161940321774835027752710681217554286366043661491013593886229615614494736186475932160549630939390542165126494166960681499481651861215529870984381726203476917507560266886692644952355421814201350137351435237036912624414444992497142303802423605897110605364956579914507108584002230524766331348271456591814078599780820974961968314684496428310691542272663818486132771177670874927831510002443658417608078383611526899905533629456904234997116303929427262032216072887961072267850618234492852606488522739744757845004694461812790342894353802938671928834585447328398711684245164703625580196678024410303542544534512706792134908369873605619756775207191558754413381571756431003248529020572648048946458999967788526617126349345966896362376841092268841417781414969315002419192181972121568811432459128737128140063645558482525300089060238860392371092102688097987915838860882370022268312322882235690785726190915062699382576041643741555139697348927957856990969985342299599797431503615312038393069808777315725367497595040966093808407117316369389112216628231869173217637452855462790553030636920487796465880633399632793882734473382168542596184679158149228725004404714293460752371865436947855237307240001863573081174929166645758276081272685156100195420794154740486637315823136798695124738873328565945598241199335059398955049459449844741098478330319112865980346771381982151154499846478545530650091824164892591396650703633600023191521502618379988693800703884555191647864959327260468892793195316578510173816406054364319294906641284764788384683586662382042642852654156477478700779123584369965723284711409361741235548687181052639639279285373139084165798451899763979500837428077782309910703522399860010310321116623028924118238023770381424894162717815296210097245221769714495449744327945091943394325259297771090128969600269822520904193880119094781214175887316220311309028456568749910010962366586834018403242866721783519806933018588077977626913774236680220258524711348037750591646286531625306510583751929280541119187219596706615736304036444366663256426643903386694536649648686380122198677895751002327229059364018755164517060321515091173358005987498359799467138817648881479418623694683454881683746841149715181334498096967702613110590140231345676956141227850879905018558219984441819798054463206764413100251255775535830770535620946159535406497134759043192647996190512978586496199656070707105117773853504277795024754647024165589129442822627147868917463795166386552921913398878270019905147510849518894114102536073369047160130990411626048426437835295683097278297774735181045158616674564080237813146623269215019613231938626758927531490945029356207933289363847181438902539297057969524961348607844569521442237914899100699610921669921572167164875488132527187949318543809703388178931170799769792886086681284964861608656928109305369539955846964197786677053847603962194721523867993048528558551380823699291873352033111096244814245789620930756114228971363838828108534030152031715929722499546436547773404017947035596936338462103946797525667033935433489292620531649199724400832489751788129365426568881328357966337292439204382537174357675404105580244018783685041224798457022189315692175787257287203633134300759209060570319508886475377719911176071302732819878165468592717406388218727585026352127436844762994722826390779737322113768842482160812973100323673863050234437722898796145596181862320550301285861980052194863780743808106946940079349630782676930197134206259739125377941060751175427888774493677478593805682322173891730311959284895178856039354015035864931073602059531001572891528828982167810245343327388887928886208615327002834690068636094325052251429781641267821367266715283643659749152264457938319185148303604827363623405060374573505789923003843438436174489383805098509083722050766328250349793203837202162624690093533478114438810603140565070517669964629947543608404988178019652088162307525611931821066493746994641048066011859814337589829896549720562117090677291541318153057715167624128318297771376531788973088699647168159229805877415594828532539839967464064556647594705830374653113373530876658380240145380423210673778776803592627231257495817394581607796277282644312510714532297108722017217547317744900647318022108570947064304280100418971450552007356891519523293614416944016354756866350050833501416942505071203810116719053430543531027953437436446745566839242129860410443198862219469972163224971258348314341755015213118628882713134766297624091644805801186976152536913514712919240503721680740586016832099946807466311777189050656676962849581383790904722087478646766320517056183581970236248227413322748304134245717987665377396011236706627320817654565682680006957454759981618023476448544673508068369492066566895437050571584345511070959483898938738225050292533674383091612495407126805381796487365892131916426837522671623266627483065655765705534239355214893395905702329340402794052884259146049064629582075576563307670749189662176976725361937046200576007893814439695301892528761187544161389682003509216791271836545495416676148151145195082668323677621182991451835324281863619641773620601014510950996746726615703771971266687151564427772359427340566909351858654807999781808513034680104078196607462166928018863385629928965649243954503391493597963417955268639606791452833692467872935741940362479842688642227725662504694679557678170929873774151037857807219938356152056997839625453727441947651198316190826615266016347740875615970031428012228328190610356706715662722241878767131224669837573607121539572299329404101274463156060298348931678277361174057097484704587036227686110677413094941011961262438027467952964727129462752693949019764164538344775554466171428121848999818969114034332797672927989107710137279281184295118233855942385256333164153378143279674287318136458207166174996112638689535976047617221520910027427485161965702038805161865494457444594178063766957037428053543239915792369877811053417485684498667123216132006378630814477106813088898563644909178779463295955587688067277368683836470612208483299572260344016516194247232298740800342116589984844356688576984553507410293250093945014209879983314562948451929862241009275783684229669718641013736581856815277185073259140534024850924787544871716174654424640728091372513505922826813145390369149590652886241000625495880523771672395227312971578042522330551788256261683080675549820375567692574152956993944504349004617185470945673049153218968830613586193253490318451871770642617802890083608004460414305421033261048294750210470303202846332054952531617433058538758154347087854561609738141615145103748777579733574989673510104836750248325511777237502526995647687215364262385606217553691332159421351598905950537513518351520709657614578131639854432532002236696200855408766520105076378983345708235918180749273124590433024519869147132931932462703067876214268579940066030521414045386366551780718510535469417760242493782392451178913322503092692423649855756521279456558275339921490892868856862895022564047205838132429286600764536839036698193759634186899291274131934296059833048690594627623595320676097721540716472990950611858372856271872423573251506230042608074167903809812264198034505185435990821356377966484742250577592243727298923187891299404854048446822719928239317254073429532989089675503790372464487057264894107613242300912487070053676379388189496900004239731820229886894053019610823763957809819187948639826973433528683168917360632750040517847686479093538683816924213175672979768822065627696943474914020483056384006872835738311110986586149510661361915342172527409078742250880056867149831149121019729847242037335904440063130981999650700416787683293610119590221942974317455716336227454789239793488032299063316588917505912406020220045264868457718282165158892171630470709599503997282778168097827497383884195820921583645621293941200045604062174334998171535030513366277293714389988219756129580868518167923841173364269774889246694435264051484911461988227011238661037602452710188911900438270362280391121270021679247152879324195035694278071477495720447513017171148877312193736366348711630105507365864598069586257026976295714123943691621672377694552248018987680338612382795605985191106112971398796002636340393693119651973344711646854574482999700397952536878348512983782198330513744803168936076427075943787200489575435147989033386529956551570669047103070223076797892329848058499725632813524581372640746415923016932853954152472487866287318545051065376430120748079948860283261855738836955246188128622509828635867225708782966017423170535046509131388753895013061151387840089512861842615441729962315731301087767989000918136617870582141517330935619268642915983553727587587676791953536960714236687847602589538927962585440961131240218794236944630211930970546118745080346860636620310193382167597465544174488399379683716417891139157575146359165023126594124268610800205258776019000550873739401445303129974560221438061891795442780328126230093178952504570380957199592993338719686487798275474853570100033092481743129836527369756194343789131822069107283156271772679863538216891518713732520976834628418347371261368933454629405371869789752684339805368137450825001203521193642598238954329102258317328098581116978343883611320940814793654745807336162557057195523274610323601685712314930799144191673243832283659669368716126815118360353441303009936083544193524336572930768154506567477565558211143508568396203781879592033787429012753106951129653074630840496376302289668286168325299592504054003803917262600195834001336180158836765599057537979745423711070158871650976475924365707758401328959478791343481250979029363644046972556422294698558561670817595994409985323205913035009923360820734795546082012200697671744573982535291905800552837118327702125018691644774560916230166739307705017656065679867259837178918123254219579594535869171376148397610005870749992910355727569593729567789260479930835305112462727870603529547312621720559953074675620549217314861961905983960910846471569192459257648138212674016814845327496495507412976753381357634960529826817906824433858135485518651632270319927880227571858035210375443324098235463619647723862420557582355632137583370066602155641218235815280874570372436217877316899649287051943247206509113311767578125e-4966 +-3.237587559719012555462219479113823276249784669017340504844942194598519770062059685508835745638324970127939070738424059838293609943191271023342555035986308991521396355375667467208367312819235870119724263252776995195727778126085574034035411017344128491238136414394551514178668780674015531193282296319913113495953953933831631032855605791532328598034154166422617226534880263244723830482289656875701701315902175019974435037627824356684033058939701577883356651733717468531204705842607568803666569711421917525834491783583598401321476176752039857173551930268891446850107760584333855521475305010940756813993214730850216669600967698749412592167692757446422169965426483919224341062751152057061076522973232731542382055087239368522167656194830741819605276971705738272393130698937532095725613383807312946395184980707534803490003540251394324459987958400939111001126190861523615485938285497714410609640798273816511769391568591823198476415765275534341709798367687043373145262933998108452661682659942586304978413812755518166239176614473815940025342279575304159493260770068030636885746695206392378276051948759263882079389379666940357441139816661913198656187703463519723262653223919257185751827493927586153153792077729913353547954808876263400200663495414360816863385220457719546338953323399286762099558324132103460225580066817535680886906060858264089074120360391613368274811868067637495154569071591624185979937989402513750464346904036668477876379544221432800037599944499161940321774835027752710681217554286366043661491013593886229615614494736186475932160549630939390542165126494166960681499481651861215529870984381726203476917507560266886692644952355421814201350137351435237036912624414444992497142303802423605897110605364956579914507108584002230524766331348271456591814078599780820974961968314684496428310691542272663818486132771177670874927831510002443658417608078383611526899905533629456904234997116303929427262032216072887961072267850618234492852606488522739744757845004694461812790342894353802938671928834585447328398711684245164703625580196678024410303542544534512706792134908369873605619756775207191558754413381571756431003248529020572648048946458999967788526617126349345966896362376841092268841417781414969315002419192181972121568811432459128737128140063645558482525300089060238860392371092102688097987915838860882370022268312322882235690785726190915062699382576041643741555139697348927957856990969985342299599797431503615312038393069808777315725367497595040966093808407117316369389112216628231869173217637452855462790553030636920487796465880633399632793882734473382168542596184679158149228725004404714293460752371865436947855237307240001863573081174929166645758276081272685156100195420794154740486637315823136798695124738873328565945598241199335059398955049459449844741098478330319112865980346771381982151154499846478545530650091824164892591396650703633600023191521502618379988693800703884555191647864959327260468892793195316578510173816406054364319294906641284764788384683586662382042642852654156477478700779123584369965723284711409361741235548687181052639639279285373139084165798451899763979500837428077782309910703522399860010310321116623028924118238023770381424894162717815296210097245221769714495449744327945091943394325259297771090128969600269822520904193880119094781214175887316220311309028456568749910010962366586834018403242866721783519806933018588077977626913774236680220258524711348037750591646286531625306510583751929280541119187219596706615736304036444366663256426643903386694536649648686380122198677895751002327229059364018755164517060321515091173358005987498359799467138817648881479418623694683454881683746841149715181334498096967702613110590140231345676956141227850879905018558219984441819798054463206764413100251255775535830770535620946159535406497134759043192647996190512978586496199656070707105117773853504277795024754647024165589129442822627147868917463795166386552921913398878270019905147510849518894114102536073369047160130990411626048426437835295683097278297774735181045158616674564080237813146623269215019613231938626758927531490945029356207933289363847181438902539297057969524961348607844569521442237914899100699610921669921572167164875488132527187949318543809703388178931170799769792886086681284964861608656928109305369539955846964197786677053847603962194721523867993048528558551380823699291873352033111096244814245789620930756114228971363838828108534030152031715929722499546436547773404017947035596936338462103946797525667033935433489292620531649199724400832489751788129365426568881328357966337292439204382537174357675404105580244018783685041224798457022189315692175787257287203633134300759209060570319508886475377719911176071302732819878165468592717406388218727585026352127436844762994722826390779737322113768842482160812973100323673863050234437722898796145596181862320550301285861980052194863780743808106946940079349630782676930197134206259739125377941060751175427888774493677478593805682322173891730311959284895178856039354015035864931073602059531001572891528828982167810245343327388887928886208615327002834690068636094325052251429781641267821367266715283643659749152264457938319185148303604827363623405060374573505789923003843438436174489383805098509083722050766328250349793203837202162624690093533478114438810603140565070517669964629947543608404988178019652088162307525611931821066493746994641048066011859814337589829896549720562117090677291541318153057715167624128318297771376531788973088699647168159229805877415594828532539839967464064556647594705830374653113373530876658380240145380423210673778776803592627231257495817394581607796277282644312510714532297108722017217547317744900647318022108570947064304280100418971450552007356891519523293614416944016354756866350050833501416942505071203810116719053430543531027953437436446745566839242129860410443198862219469972163224971258348314341755015213118628882713134766297624091644805801186976152536913514712919240503721680740586016832099946807466311777189050656676962849581383790904722087478646766320517056183581970236248227413322748304134245717987665377396011236706627320817654565682680006957454759981618023476448544673508068369492066566895437050571584345511070959483898938738225050292533674383091612495407126805381796487365892131916426837522671623266627483065655765705534239355214893395905702329340402794052884259146049064629582075576563307670749189662176976725361937046200576007893814439695301892528761187544161389682003509216791271836545495416676148151145195082668323677621182991451835324281863619641773620601014510950996746726615703771971266687151564427772359427340566909351858654807999781808513034680104078196607462166928018863385629928965649243954503391493597963417955268639606791452833692467872935741940362479842688642227725662504694679557678170929873774151037857807219938356152056997839625453727441947651198316190826615266016347740875615970031428012228328190610356706715662722241878767131224669837573607121539572299329404101274463156060298348931678277361174057097484704587036227686110677413094941011961262438027467952964727129462752693949019764164538344775554466171428121848999818969114034332797672927989107710137279281184295118233855942385256333164153378143279674287318136458207166174996112638689535976047617221520910027427485161965702038805161865494457444594178063766957037428053543239915792369877811053417485684498667123216132006378630814477106813088898563644909178779463295955587688067277368683836470612208483299572260344016516194247232298740800342116589984844356688576984553507410293250093945014209879983314562948451929862241009275783684229669718641013736581856815277185073259140534024850924787544871716174654424640728091372513505922826813145390369149590652886241000625495880523771672395227312971578042522330551788256261683080675549820375567692574152956993944504349004617185470945673049153218968830613586193253490318451871770642617802890083608004460414305421033261048294750210470303202846332054952531617433058538758154347087854561609738141615145103748777579733574989673510104836750248325511777237502526995647687215364262385606217553691332159421351598905950537513518351520709657614578131639854432532002236696200855408766520105076378983345708235918180749273124590433024519869147132931932462703067876214268579940066030521414045386366551780718510535469417760242493782392451178913322503092692423649855756521279456558275339921490892868856862895022564047205838132429286600764536839036698193759634186899291274131934296059833048690594627623595320676097721540716472990950611858372856271872423573251506230042608074167903809812264198034505185435990821356377966484742250577592243727298923187891299404854048446822719928239317254073429532989089675503790372464487057264894107613242300912487070053676379388189496900004239731820229886894053019610823763957809819187948639826973433528683168917360632750040517847686479093538683816924213175672979768822065627696943474914020483056384006872835738311110986586149510661361915342172527409078742250880056867149831149121019729847242037335904440063130981999650700416787683293610119590221942974317455716336227454789239793488032299063316588917505912406020220045264868457718282165158892171630470709599503997282778168097827497383884195820921583645621293941200045604062174334998171535030513366277293714389988219756129580868518167923841173364269774889246694435264051484911461988227011238661037602452710188911900438270362280391121270021679247152879324195035694278071477495720447513017171148877312193736366348711630105507365864598069586257026976295714123943691621672377694552248018987680338612382795605985191106112971398796002636340393693119651973344711646854574482999700397952536878348512983782198330513744803168936076427075943787200489575435147989033386529956551570669047103070223076797892329848058499725632813524581372640746415923016932853954152472487866287318545051065376430120748079948860283261855738836955246188128622509828635867225708782966017423170535046509131388753895013061151387840089512861842615441729962315731301087767989000918136617870582141517330935619268642915983553727587587676791953536960714236687847602589538927962585440961131240218794236944630211930970546118745080346860636620310193382167597465544174488399379683716417891139157575146359165023126594124268610800205258776019000550873739401445303129974560221438061891795442780328126230093178952504570380957199592993338719686487798275474853570100033092481743129836527369756194343789131822069107283156271772679863538216891518713732520976834628418347371261368933454629405371869789752684339805368137450825001203521193642598238954329102258317328098581116978343883611320940814793654745807336162557057195523274610323601685712314930799144191673243832283659669368716126815118360353441303009936083544193524336572930768154506567477565558211143508568396203781879592033787429012753106951129653074630840496376302289668286168325299592504054003803917262600195834001336180158836765599057537979745423711070158871650976475924365707758401328959478791343481250979029363644046972556422294698558561670817595994409985323205913035009923360820734795546082012200697671744573982535291905800552837118327702125018691644774560916230166739307705017656065679867259837178918123254219579594535869171376148397610005870749992910355727569593729567789260479930835305112462727870603529547312621720559953074675620549217314861961905983960910846471569192459257648138212674016814845327496495507412976753381357634960529826817906824433858135485518651632270319927880227571858035210375443324098235463619647723862420557582355632137583370066602155641218235815280874570372436217877316899649287051943247206509113311767578126e-4966 diff --git a/REORG.TODO/stdlib/tst-strtod-round-data.h b/REORG.TODO/stdlib/tst-strtod-round-data.h new file mode 100644 index 0000000000..fc09bc9117 --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod-round-data.h @@ -0,0 +1,11584 @@ +/* This file was generated by gen-tst-strtod-round.c from tst-strtod-round-data. */ +static const struct test tests[] = { + TEST ("3.518437208883201171875E+013", + false, + 0x2p+44, + 0x2p+44, + 0x2p+44, + 0x2.000004p+44, + false, + 0x2.0000000000002p+44, + 0x2.0000000000004p+44, + 0x2.0000000000002p+44, + 0x2.0000000000004p+44, + true, + 0x2.0000000000003p+44, + 0x2.0000000000003p+44, + 0x2.0000000000003p+44, + 0x2.0000000000003p+44, + true, + 0x2.0000000000003p+44, + 0x2.0000000000003p+44, + 0x2.0000000000003p+44, + 0x2.0000000000003p+44, + true, + 0x2.0000000000003p+44, + 0x2.0000000000003p+44, + 0x2.0000000000003p+44, + 0x2.0000000000003p+44, + true, + 0x2.0000000000003p+44, + 0x2.0000000000003p+44, + 0x2.0000000000003p+44, + 0x2.0000000000003p+44), + TEST ("1.00000005960464477550", + false, + 0x1p+0, + 0x1.000002p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.0000010000001p+0, + false, + 0x1.0000010000000002p+0, + 0x1.0000010000000002p+0, + 0x1.0000010000000002p+0, + 0x1.0000010000000004p+0, + false, + 0x1.0000010000000002p+0, + 0x1.0000010000000002p+0, + 0x1.0000010000000002p+0, + 0x1.0000010000000004p+0, + false, + 0x1.0000010000000002048242f2ffp+0, + 0x1.0000010000000002048242f2ff8p+0, + 0x1.0000010000000002048242f2ffp+0, + 0x1.0000010000000002048242f2ff8p+0, + false, + 0x1.0000010000000002048242f2ff66p+0, + 0x1.0000010000000002048242f2ff67p+0, + 0x1.0000010000000002048242f2ff66p+0, + 0x1.0000010000000002048242f2ff67p+0), + TEST ("1.0000000596046447755", + false, + 0x1p+0, + 0x1.000002p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.0000010000001p+0, + false, + 0x1.0000010000000002p+0, + 0x1.0000010000000002p+0, + 0x1.0000010000000002p+0, + 0x1.0000010000000004p+0, + false, + 0x1.0000010000000002p+0, + 0x1.0000010000000002p+0, + 0x1.0000010000000002p+0, + 0x1.0000010000000004p+0, + false, + 0x1.0000010000000002048242f2ffp+0, + 0x1.0000010000000002048242f2ff8p+0, + 0x1.0000010000000002048242f2ffp+0, + 0x1.0000010000000002048242f2ff8p+0, + false, + 0x1.0000010000000002048242f2ff66p+0, + 0x1.0000010000000002048242f2ff67p+0, + 0x1.0000010000000002048242f2ff66p+0, + 0x1.0000010000000002048242f2ff67p+0), + TEST ("1.000000059604644776", + false, + 0x1p+0, + 0x1.000002p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.0000010000001p+0, + false, + 0x1.000001000000000ap+0, + 0x1.000001000000000cp+0, + 0x1.000001000000000ap+0, + 0x1.000001000000000cp+0, + false, + 0x1.000001000000000ap+0, + 0x1.000001000000000cp+0, + 0x1.000001000000000ap+0, + 0x1.000001000000000cp+0, + false, + 0x1.000001000000000b3db12bdc21p+0, + 0x1.000001000000000b3db12bdc21p+0, + 0x1.000001000000000b3db12bdc21p+0, + 0x1.000001000000000b3db12bdc218p+0, + false, + 0x1.000001000000000b3db12bdc213cp+0, + 0x1.000001000000000b3db12bdc213dp+0, + 0x1.000001000000000b3db12bdc213cp+0, + 0x1.000001000000000b3db12bdc213dp+0), + TEST ("1.000000059604644775", + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.000000fffffffp+0, + 0x1.000001p+0, + 0x1.000000fffffffp+0, + 0x1.000001p+0, + false, + 0x1.000000fffffffff8p+0, + 0x1.000000fffffffff8p+0, + 0x1.000000fffffffff8p+0, + 0x1.000000fffffffffap+0, + false, + 0x1.000000fffffffff8p+0, + 0x1.000000fffffffff8p+0, + 0x1.000000fffffffff8p+0, + 0x1.000000fffffffffap+0, + false, + 0x1.000000fffffffff8cb535a09dd8p+0, + 0x1.000000fffffffff8cb535a09dd8p+0, + 0x1.000000fffffffff8cb535a09dd8p+0, + 0x1.000000fffffffff8cb535a09dep+0, + false, + 0x1.000000fffffffff8cb535a09dd9p+0, + 0x1.000000fffffffff8cb535a09dd91p+0, + 0x1.000000fffffffff8cb535a09dd9p+0, + 0x1.000000fffffffff8cb535a09dd91p+0), + TEST ("1.00000005960464478", + false, + 0x1p+0, + 0x1.000002p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.0000010000001p+0, + false, + 0x1.0000010000000054p+0, + 0x1.0000010000000056p+0, + 0x1.0000010000000054p+0, + 0x1.0000010000000056p+0, + false, + 0x1.0000010000000054p+0, + 0x1.0000010000000056p+0, + 0x1.0000010000000054p+0, + 0x1.0000010000000056p+0, + false, + 0x1.0000010000000055072873252f8p+0, + 0x1.0000010000000055072873253p+0, + 0x1.0000010000000055072873252f8p+0, + 0x1.0000010000000055072873253p+0, + false, + 0x1.0000010000000055072873252febp+0, + 0x1.0000010000000055072873252febp+0, + 0x1.0000010000000055072873252febp+0, + 0x1.0000010000000055072873252fecp+0), + TEST ("1.0000000596046448", + false, + 0x1p+0, + 0x1.000002p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.0000010000001p+0, + false, + 0x1.00000100000001c4p+0, + 0x1.00000100000001c6p+0, + 0x1.00000100000001c4p+0, + 0x1.00000100000001c6p+0, + false, + 0x1.00000100000001c4p+0, + 0x1.00000100000001c6p+0, + 0x1.00000100000001c4p+0, + 0x1.00000100000001c6p+0, + false, + 0x1.00000100000001c5f67cd79279p+0, + 0x1.00000100000001c5f67cd792798p+0, + 0x1.00000100000001c5f67cd79279p+0, + 0x1.00000100000001c5f67cd792798p+0, + false, + 0x1.00000100000001c5f67cd7927953p+0, + 0x1.00000100000001c5f67cd7927954p+0, + 0x1.00000100000001c5f67cd7927953p+0, + 0x1.00000100000001c5f67cd7927954p+0), + TEST ("1.000000059604645", + false, + 0x1p+0, + 0x1.000002p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.0000010000001p+0, + 0x1.0000010000001p+0, + 0x1.0000010000001p+0, + 0x1.0000010000002p+0, + false, + 0x1.000001000000102ep+0, + 0x1.000001000000103p+0, + 0x1.000001000000102ep+0, + 0x1.000001000000103p+0, + false, + 0x1.000001000000102ep+0, + 0x1.000001000000103p+0, + 0x1.000001000000102ep+0, + 0x1.000001000000103p+0, + false, + 0x1.000001000000102f4fc8c3d757p+0, + 0x1.000001000000102f4fc8c3d7578p+0, + 0x1.000001000000102f4fc8c3d757p+0, + 0x1.000001000000102f4fc8c3d7578p+0, + false, + 0x1.000001000000102f4fc8c3d75769p+0, + 0x1.000001000000102f4fc8c3d75769p+0, + 0x1.000001000000102f4fc8c3d75769p+0, + 0x1.000001000000102f4fc8c3d7576ap+0), + TEST ("1.00000005960464", + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.000000fffffeap+0, + 0x1.000000fffffeap+0, + 0x1.000000fffffeap+0, + 0x1.000000fffffebp+0, + false, + 0x1.000000fffffea7e4p+0, + 0x1.000000fffffea7e6p+0, + 0x1.000000fffffea7e4p+0, + 0x1.000000fffffea7e6p+0, + false, + 0x1.000000fffffea7e4p+0, + 0x1.000000fffffea7e6p+0, + 0x1.000000fffffea7e4p+0, + 0x1.000000fffffea7e6p+0, + false, + 0x1.000000fffffea7e5975eb11da7p+0, + 0x1.000000fffffea7e5975eb11da78p+0, + 0x1.000000fffffea7e5975eb11da7p+0, + 0x1.000000fffffea7e5975eb11da78p+0, + false, + 0x1.000000fffffea7e5975eb11da74ap+0, + 0x1.000000fffffea7e5975eb11da74bp+0, + 0x1.000000fffffea7e5975eb11da74ap+0, + 0x1.000000fffffea7e5975eb11da74bp+0), + TEST ("1.0000000596046", + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.000000fffff36p+0, + 0x1.000000fffff36p+0, + 0x1.000000fffff36p+0, + 0x1.000000fffff37p+0, + false, + 0x1.000000fffff36596p+0, + 0x1.000000fffff36598p+0, + 0x1.000000fffff36596p+0, + 0x1.000000fffff36598p+0, + false, + 0x1.000000fffff36596p+0, + 0x1.000000fffff36598p+0, + 0x1.000000fffff36596p+0, + 0x1.000000fffff36598p+0, + false, + 0x1.000000fffff36597d40e1b5026p+0, + 0x1.000000fffff36597d40e1b50268p+0, + 0x1.000000fffff36597d40e1b5026p+0, + 0x1.000000fffff36597d40e1b50268p+0, + false, + 0x1.000000fffff36597d40e1b502655p+0, + 0x1.000000fffff36597d40e1b502656p+0, + 0x1.000000fffff36597d40e1b502655p+0, + 0x1.000000fffff36597d40e1b502656p+0), + TEST ("1.000000059605", + false, + 0x1p+0, + 0x1.000002p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.000001000063fp+0, + 0x1.000001000064p+0, + 0x1.000001000063fp+0, + 0x1.000001000064p+0, + false, + 0x1.000001000063fcap+0, + 0x1.000001000063fca2p+0, + 0x1.000001000063fcap+0, + 0x1.000001000063fca2p+0, + false, + 0x1.000001000063fcap+0, + 0x1.000001000063fca2p+0, + 0x1.000001000063fcap+0, + 0x1.000001000063fca2p+0, + false, + 0x1.000001000063fca17533f5572f8p+0, + 0x1.000001000063fca17533f5573p+0, + 0x1.000001000063fca17533f5572f8p+0, + 0x1.000001000063fca17533f5573p+0, + false, + 0x1.000001000063fca17533f5572fe9p+0, + 0x1.000001000063fca17533f5572feap+0, + 0x1.000001000063fca17533f5572fe9p+0, + 0x1.000001000063fca17533f5572feap+0), + TEST ("1.00000005960", + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.000000fffae49p+0, + 0x1.000000fffae4ap+0, + 0x1.000000fffae49p+0, + 0x1.000000fffae4ap+0, + false, + 0x1.000000fffae49ca8p+0, + 0x1.000000fffae49caap+0, + 0x1.000000fffae49ca8p+0, + 0x1.000000fffae49caap+0, + false, + 0x1.000000fffae49ca8p+0, + 0x1.000000fffae49caap+0, + 0x1.000000fffae49ca8p+0, + 0x1.000000fffae49caap+0, + false, + 0x1.000000fffae49ca916dacfff38p+0, + 0x1.000000fffae49ca916dacfff38p+0, + 0x1.000000fffae49ca916dacfff38p+0, + 0x1.000000fffae49ca916dacfff388p+0, + false, + 0x1.000000fffae49ca916dacfff382dp+0, + 0x1.000000fffae49ca916dacfff382dp+0, + 0x1.000000fffae49ca916dacfff382dp+0, + 0x1.000000fffae49ca916dacfff382ep+0), + TEST ("1.0000000596", + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.000000fffae49p+0, + 0x1.000000fffae4ap+0, + 0x1.000000fffae49p+0, + 0x1.000000fffae4ap+0, + false, + 0x1.000000fffae49ca8p+0, + 0x1.000000fffae49caap+0, + 0x1.000000fffae49ca8p+0, + 0x1.000000fffae49caap+0, + false, + 0x1.000000fffae49ca8p+0, + 0x1.000000fffae49caap+0, + 0x1.000000fffae49ca8p+0, + 0x1.000000fffae49caap+0, + false, + 0x1.000000fffae49ca916dacfff38p+0, + 0x1.000000fffae49ca916dacfff38p+0, + 0x1.000000fffae49ca916dacfff38p+0, + 0x1.000000fffae49ca916dacfff388p+0, + false, + 0x1.000000fffae49ca916dacfff382dp+0, + 0x1.000000fffae49ca916dacfff382dp+0, + 0x1.000000fffae49ca916dacfff382dp+0, + 0x1.000000fffae49ca916dacfff382ep+0), + TEST ("1.000000060", + false, + 0x1p+0, + 0x1.000002p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.00000101b2b29p+0, + 0x1.00000101b2b2ap+0, + 0x1.00000101b2b29p+0, + 0x1.00000101b2b2ap+0, + false, + 0x1.00000101b2b29a46p+0, + 0x1.00000101b2b29a46p+0, + 0x1.00000101b2b29a46p+0, + 0x1.00000101b2b29a48p+0, + false, + 0x1.00000101b2b29a46p+0, + 0x1.00000101b2b29a46p+0, + 0x1.00000101b2b29a46p+0, + 0x1.00000101b2b29a48p+0, + false, + 0x1.00000101b2b29a4692b67b7ca3p+0, + 0x1.00000101b2b29a4692b67b7ca3p+0, + 0x1.00000101b2b29a4692b67b7ca3p+0, + 0x1.00000101b2b29a4692b67b7ca38p+0, + false, + 0x1.00000101b2b29a4692b67b7ca313p+0, + 0x1.00000101b2b29a4692b67b7ca314p+0, + 0x1.00000101b2b29a4692b67b7ca313p+0, + 0x1.00000101b2b29a4692b67b7ca314p+0), + TEST ("1.00000006", + false, + 0x1p+0, + 0x1.000002p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.00000101b2b29p+0, + 0x1.00000101b2b2ap+0, + 0x1.00000101b2b29p+0, + 0x1.00000101b2b2ap+0, + false, + 0x1.00000101b2b29a46p+0, + 0x1.00000101b2b29a46p+0, + 0x1.00000101b2b29a46p+0, + 0x1.00000101b2b29a48p+0, + false, + 0x1.00000101b2b29a46p+0, + 0x1.00000101b2b29a46p+0, + 0x1.00000101b2b29a46p+0, + 0x1.00000101b2b29a48p+0, + false, + 0x1.00000101b2b29a4692b67b7ca3p+0, + 0x1.00000101b2b29a4692b67b7ca3p+0, + 0x1.00000101b2b29a4692b67b7ca3p+0, + 0x1.00000101b2b29a4692b67b7ca38p+0, + false, + 0x1.00000101b2b29a4692b67b7ca313p+0, + 0x1.00000101b2b29a4692b67b7ca314p+0, + 0x1.00000101b2b29a4692b67b7ca313p+0, + 0x1.00000101b2b29a4692b67b7ca314p+0), + TEST ("1.0000001", + false, + 0x1p+0, + 0x1.000002p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.000001ad7f29ap+0, + 0x1.000001ad7f29bp+0, + 0x1.000001ad7f29ap+0, + 0x1.000001ad7f29bp+0, + false, + 0x1.000001ad7f29abcap+0, + 0x1.000001ad7f29abcap+0, + 0x1.000001ad7f29abcap+0, + 0x1.000001ad7f29abccp+0, + false, + 0x1.000001ad7f29abcap+0, + 0x1.000001ad7f29abcap+0, + 0x1.000001ad7f29abcap+0, + 0x1.000001ad7f29abccp+0, + false, + 0x1.000001ad7f29abcaf485787a65p+0, + 0x1.000001ad7f29abcaf485787a65p+0, + 0x1.000001ad7f29abcaf485787a65p+0, + 0x1.000001ad7f29abcaf485787a658p+0, + false, + 0x1.000001ad7f29abcaf485787a652p+0, + 0x1.000001ad7f29abcaf485787a6521p+0, + 0x1.000001ad7f29abcaf485787a652p+0, + 0x1.000001ad7f29abcaf485787a6521p+0), + TEST ("1.000000", + true, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1p+0, + true, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1p+0, + true, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1p+0, + true, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1p+0, + true, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1p+0, + true, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1p+0), + TEST ("1.00000000000000011113", + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1p+0, + 0x1.0000000000001p+0, + 0x1p+0, + 0x1.0000000000001p+0, + false, + 0x1.00000000000008p+0, + 0x1.0000000000000802p+0, + 0x1.00000000000008p+0, + 0x1.0000000000000802p+0, + false, + 0x1.00000000000008p+0, + 0x1.0000000000000802p+0, + 0x1.00000000000008p+0, + 0x1.0000000000000802p+0, + false, + 0x1.0000000000000801fc96557232p+0, + 0x1.0000000000000801fc96557232p+0, + 0x1.0000000000000801fc96557232p+0, + 0x1.0000000000000801fc965572328p+0, + false, + 0x1.0000000000000801fc9655723222p+0, + 0x1.0000000000000801fc9655723222p+0, + 0x1.0000000000000801fc9655723222p+0, + 0x1.0000000000000801fc9655723223p+0), + TEST ("1.00000000000000011103", + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1p+0, + 0x1.0000000000001p+0, + 0x1p+0, + 0x1.0000000000001p+0, + false, + 0x1.00000000000008p+0, + 0x1.00000000000008p+0, + 0x1.00000000000008p+0, + 0x1.0000000000000802p+0, + false, + 0x1.00000000000008p+0, + 0x1.00000000000008p+0, + 0x1.00000000000008p+0, + 0x1.0000000000000802p+0, + false, + 0x1.00000000000008002459c076c48p+0, + 0x1.00000000000008002459c076c5p+0, + 0x1.00000000000008002459c076c48p+0, + 0x1.00000000000008002459c076c5p+0, + false, + 0x1.00000000000008002459c076c4f7p+0, + 0x1.00000000000008002459c076c4f8p+0, + 0x1.00000000000008002459c076c4f7p+0, + 0x1.00000000000008002459c076c4f8p+0), + TEST ("1.00000000000000011102", + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.0000000000001p+0, + false, + 0x1.00000000000007fep+0, + 0x1.00000000000008p+0, + 0x1.00000000000007fep+0, + 0x1.00000000000008p+0, + false, + 0x1.00000000000007fep+0, + 0x1.00000000000008p+0, + 0x1.00000000000007fep+0, + 0x1.00000000000008p+0, + false, + 0x1.00000000000007fff5207e5dap+0, + 0x1.00000000000007fff5207e5da08p+0, + 0x1.00000000000007fff5207e5dap+0, + 0x1.00000000000007fff5207e5da08p+0, + false, + 0x1.00000000000007fff5207e5da073p+0, + 0x1.00000000000007fff5207e5da073p+0, + 0x1.00000000000007fff5207e5da073p+0, + 0x1.00000000000007fff5207e5da074p+0), + TEST ("1.00000000000000011101", + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.0000000000001p+0, + false, + 0x1.00000000000007fep+0, + 0x1.00000000000008p+0, + 0x1.00000000000007fep+0, + 0x1.00000000000008p+0, + false, + 0x1.00000000000007fep+0, + 0x1.00000000000008p+0, + 0x1.00000000000007fep+0, + 0x1.00000000000008p+0, + false, + 0x1.00000000000007ffc5e73c447b8p+0, + 0x1.00000000000007ffc5e73c447cp+0, + 0x1.00000000000007ffc5e73c447b8p+0, + 0x1.00000000000007ffc5e73c447cp+0, + false, + 0x1.00000000000007ffc5e73c447befp+0, + 0x1.00000000000007ffc5e73c447befp+0, + 0x1.00000000000007ffc5e73c447befp+0, + 0x1.00000000000007ffc5e73c447bfp+0), + TEST ("1.0000000000000001111", + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1p+0, + 0x1.0000000000001p+0, + 0x1p+0, + 0x1.0000000000001p+0, + false, + 0x1.00000000000008p+0, + 0x1.0000000000000802p+0, + 0x1.00000000000008p+0, + 0x1.0000000000000802p+0, + false, + 0x1.00000000000008p+0, + 0x1.0000000000000802p+0, + 0x1.00000000000008p+0, + 0x1.0000000000000802p+0, + false, + 0x1.00000000000008016eea8f26c48p+0, + 0x1.00000000000008016eea8f26c48p+0, + 0x1.00000000000008016eea8f26c48p+0, + 0x1.00000000000008016eea8f26c5p+0, + false, + 0x1.00000000000008016eea8f26c495p+0, + 0x1.00000000000008016eea8f26c496p+0, + 0x1.00000000000008016eea8f26c495p+0, + 0x1.00000000000008016eea8f26c496p+0), + TEST ("1.000000000000000111", + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.0000000000001p+0, + false, + 0x1.00000000000007fep+0, + 0x1.00000000000008p+0, + 0x1.00000000000007fep+0, + 0x1.00000000000008p+0, + false, + 0x1.00000000000007fep+0, + 0x1.00000000000008p+0, + 0x1.00000000000007fep+0, + 0x1.00000000000008p+0, + false, + 0x1.00000000000007ff96adfa2b57p+0, + 0x1.00000000000007ff96adfa2b578p+0, + 0x1.00000000000007ff96adfa2b57p+0, + 0x1.00000000000007ff96adfa2b578p+0, + false, + 0x1.00000000000007ff96adfa2b576ap+0, + 0x1.00000000000007ff96adfa2b576bp+0, + 0x1.00000000000007ff96adfa2b576ap+0, + 0x1.00000000000007ff96adfa2b576bp+0), + TEST ("1.00000000000000011", + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.0000000000001p+0, + false, + 0x1.00000000000007ecp+0, + 0x1.00000000000007eep+0, + 0x1.00000000000007ecp+0, + 0x1.00000000000007eep+0, + false, + 0x1.00000000000007ecp+0, + 0x1.00000000000007eep+0, + 0x1.00000000000007ecp+0, + 0x1.00000000000007eep+0, + false, + 0x1.00000000000007ed24502859138p+0, + 0x1.00000000000007ed24502859138p+0, + 0x1.00000000000007ed24502859138p+0, + 0x1.00000000000007ed2450285914p+0, + false, + 0x1.00000000000007ed2450285913bfp+0, + 0x1.00000000000007ed2450285913bfp+0, + 0x1.00000000000007ed2450285913bfp+0, + 0x1.00000000000007ed2450285913cp+0), + TEST ("1.0000000000000001", + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.0000000000001p+0, + false, + 0x1.0000000000000734p+0, + 0x1.0000000000000734p+0, + 0x1.0000000000000734p+0, + 0x1.0000000000000736p+0, + false, + 0x1.0000000000000734p+0, + 0x1.0000000000000734p+0, + 0x1.0000000000000734p+0, + 0x1.0000000000000736p+0, + false, + 0x1.0000000000000734aca5f6226fp+0, + 0x1.0000000000000734aca5f6226fp+0, + 0x1.0000000000000734aca5f6226fp+0, + 0x1.0000000000000734aca5f6226f8p+0, + false, + 0x1.0000000000000734aca5f6226f0ap+0, + 0x1.0000000000000734aca5f6226f0bp+0, + 0x1.0000000000000734aca5f6226f0ap+0, + 0x1.0000000000000734aca5f6226f0bp+0), + TEST ("3929201589819414e-25", + false, + 0x1.b0053p-32, + 0x1.b00532p-32, + 0x1.b0053p-32, + 0x1.b00532p-32, + false, + 0x1.b005314e2421ep-32, + 0x1.b005314e2421ep-32, + 0x1.b005314e2421ep-32, + 0x1.b005314e2421fp-32, + false, + 0x1.b005314e2421e7fep-32, + 0x1.b005314e2421e8p-32, + 0x1.b005314e2421e7fep-32, + 0x1.b005314e2421e8p-32, + false, + 0x1.b005314e2421e7fep-32, + 0x1.b005314e2421e8p-32, + 0x1.b005314e2421e7fep-32, + 0x1.b005314e2421e8p-32, + false, + 0x1.b005314e2421e7ffb472840c5ap-32, + 0x1.b005314e2421e7ffb472840c5a8p-32, + 0x1.b005314e2421e7ffb472840c5ap-32, + 0x1.b005314e2421e7ffb472840c5a8p-32, + false, + 0x1.b005314e2421e7ffb472840c5a6ep-32, + 0x1.b005314e2421e7ffb472840c5a6fp-32, + 0x1.b005314e2421e7ffb472840c5a6ep-32, + 0x1.b005314e2421e7ffb472840c5a6fp-32), + TEST ("0.0000000000000000000000000000000000000000000021019476964872" + "256063855943749348741969203929128147736576356024258346866240" + "28790902229957282543182373046875", + false, + 0x8p-152, + 0x1p-148, + 0x8p-152, + 0x1p-148, + true, + 0xcp-152, + 0xcp-152, + 0xcp-152, + 0xcp-152, + true, + 0xcp-152, + 0xcp-152, + 0xcp-152, + 0xcp-152, + true, + 0xcp-152, + 0xcp-152, + 0xcp-152, + 0xcp-152, + true, + 0xcp-152, + 0xcp-152, + 0xcp-152, + 0xcp-152, + true, + 0xcp-152, + 0xcp-152, + 0xcp-152, + 0xcp-152), + TEST ("1.00000005960464477539062499", + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.000000fffffffp+0, + 0x1.000001p+0, + 0x1.000000fffffffp+0, + 0x1.000001p+0, + false, + 0x1.000000fffffffffep+0, + 0x1.000001p+0, + 0x1.000000fffffffffep+0, + 0x1.000001p+0, + false, + 0x1.000000fffffffffep+0, + 0x1.000001p+0, + 0x1.000000fffffffffep+0, + 0x1.000001p+0, + false, + 0x1.000000fffffffffffffffce7b78p+0, + 0x1.000000fffffffffffffffce7b8p+0, + 0x1.000000fffffffffffffffce7b78p+0, + 0x1.000000fffffffffffffffce7b8p+0, + false, + 0x1.000000fffffffffffffffce7b7e7p+0, + 0x1.000000fffffffffffffffce7b7e7p+0, + 0x1.000000fffffffffffffffce7b7e7p+0, + 0x1.000000fffffffffffffffce7b7e8p+0), + TEST ("1.000000059604644775390625", + false, + 0x1p+0, + 0x1p+0, + 0x1p+0, + 0x1.000002p+0, + true, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + true, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + true, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + true, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + true, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0), + TEST ("1.00000005960464477539062501", + false, + 0x1p+0, + 0x1.000002p+0, + 0x1p+0, + 0x1.000002p+0, + false, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.0000010000001p+0, + false, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.0000010000000002p+0, + false, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.000001p+0, + 0x1.0000010000000002p+0, + false, + 0x1.00000100000000000000031848p+0, + 0x1.00000100000000000000031848p+0, + 0x1.00000100000000000000031848p+0, + 0x1.000001000000000000000318488p+0, + false, + 0x1.0000010000000000000003184818p+0, + 0x1.0000010000000000000003184819p+0, + 0x1.0000010000000000000003184818p+0, + 0x1.0000010000000000000003184819p+0), + TEST ("1.00000011920928955078125", + true, + 0x1.000002p+0, + 0x1.000002p+0, + 0x1.000002p+0, + 0x1.000002p+0, + true, + 0x1.000002p+0, + 0x1.000002p+0, + 0x1.000002p+0, + 0x1.000002p+0, + true, + 0x1.000002p+0, + 0x1.000002p+0, + 0x1.000002p+0, + 0x1.000002p+0, + true, + 0x1.000002p+0, + 0x1.000002p+0, + 0x1.000002p+0, + 0x1.000002p+0, + true, + 0x1.000002p+0, + 0x1.000002p+0, + 0x1.000002p+0, + 0x1.000002p+0, + true, + 0x1.000002p+0, + 0x1.000002p+0, + 0x1.000002p+0, + 0x1.000002p+0), + TEST ("1.00000017881393432617187499", + false, + 0x1.000002p+0, + 0x1.000002p+0, + 0x1.000002p+0, + 0x1.000004p+0, + false, + 0x1.000002fffffffp+0, + 0x1.000003p+0, + 0x1.000002fffffffp+0, + 0x1.000003p+0, + false, + 0x1.000002fffffffffep+0, + 0x1.000003p+0, + 0x1.000002fffffffffep+0, + 0x1.000003p+0, + false, + 0x1.000002fffffffffep+0, + 0x1.000003p+0, + 0x1.000002fffffffffep+0, + 0x1.000003p+0, + false, + 0x1.000002fffffffffffffffce7b78p+0, + 0x1.000002fffffffffffffffce7b8p+0, + 0x1.000002fffffffffffffffce7b78p+0, + 0x1.000002fffffffffffffffce7b8p+0, + false, + 0x1.000002fffffffffffffffce7b7e7p+0, + 0x1.000002fffffffffffffffce7b7e7p+0, + 0x1.000002fffffffffffffffce7b7e7p+0, + 0x1.000002fffffffffffffffce7b7e8p+0), + TEST ("1.000000178813934326171875", + false, + 0x1.000002p+0, + 0x1.000004p+0, + 0x1.000002p+0, + 0x1.000004p+0, + true, + 0x1.000003p+0, + 0x1.000003p+0, + 0x1.000003p+0, + 0x1.000003p+0, + true, + 0x1.000003p+0, + 0x1.000003p+0, + 0x1.000003p+0, + 0x1.000003p+0, + true, + 0x1.000003p+0, + 0x1.000003p+0, + 0x1.000003p+0, + 0x1.000003p+0, + true, + 0x1.000003p+0, + 0x1.000003p+0, + 0x1.000003p+0, + 0x1.000003p+0, + true, + 0x1.000003p+0, + 0x1.000003p+0, + 0x1.000003p+0, + 0x1.000003p+0), + TEST ("1.00000017881393432617187501", + false, + 0x1.000002p+0, + 0x1.000004p+0, + 0x1.000002p+0, + 0x1.000004p+0, + false, + 0x1.000003p+0, + 0x1.000003p+0, + 0x1.000003p+0, + 0x1.0000030000001p+0, + false, + 0x1.000003p+0, + 0x1.000003p+0, + 0x1.000003p+0, + 0x1.0000030000000002p+0, + false, + 0x1.000003p+0, + 0x1.000003p+0, + 0x1.000003p+0, + 0x1.0000030000000002p+0, + false, + 0x1.00000300000000000000031848p+0, + 0x1.00000300000000000000031848p+0, + 0x1.00000300000000000000031848p+0, + 0x1.000003000000000000000318488p+0, + false, + 0x1.0000030000000000000003184818p+0, + 0x1.0000030000000000000003184819p+0, + 0x1.0000030000000000000003184818p+0, + 0x1.0000030000000000000003184819p+0), + TEST ("1.0000002384185791015625", + true, + 0x1.000004p+0, + 0x1.000004p+0, + 0x1.000004p+0, + 0x1.000004p+0, + true, + 0x1.000004p+0, + 0x1.000004p+0, + 0x1.000004p+0, + 0x1.000004p+0, + true, + 0x1.000004p+0, + 0x1.000004p+0, + 0x1.000004p+0, + 0x1.000004p+0, + true, + 0x1.000004p+0, + 0x1.000004p+0, + 0x1.000004p+0, + 0x1.000004p+0, + true, + 0x1.000004p+0, + 0x1.000004p+0, + 0x1.000004p+0, + 0x1.000004p+0, + true, + 0x1.000004p+0, + 0x1.000004p+0, + 0x1.000004p+0, + 0x1.000004p+0), + TEST ("1.08420217248550443400745280086994171142578125e-19", + true, + 0x2p-64, + 0x2p-64, + 0x2p-64, + 0x2p-64, + true, + 0x2p-64, + 0x2p-64, + 0x2p-64, + 0x2p-64, + true, + 0x2p-64, + 0x2p-64, + 0x2p-64, + 0x2p-64, + true, + 0x2p-64, + 0x2p-64, + 0x2p-64, + 0x2p-64, + true, + 0x2p-64, + 0x2p-64, + 0x2p-64, + 0x2p-64, + true, + 0x2p-64, + 0x2p-64, + 0x2p-64, + 0x2p-64), + TEST ("1.0842022371089897897127399001987457793916291848290711641311" + "645507812499e-19", + false, + 0x2p-64, + 0x2p-64, + 0x2p-64, + 0x2.000004p-64, + false, + 0x2.000001ffffffep-64, + 0x2.000002p-64, + 0x2.000001ffffffep-64, + 0x2.000002p-64, + false, + 0x2.000001fffffffffcp-64, + 0x2.000002p-64, + 0x2.000001fffffffffcp-64, + 0x2.000002p-64, + false, + 0x2.000001fffffffffcp-64, + 0x2.000002p-64, + 0x2.000001fffffffffcp-64, + 0x2.000002p-64, + false, + 0x2.000001ffffffffffffffffffffp-64, + 0x2.000002p-64, + 0x2.000001ffffffffffffffffffffp-64, + 0x2.000002p-64, + false, + 0x2.000001fffffffffffffffffffffep-64, + 0x2.000002p-64, + 0x2.000001fffffffffffffffffffffep-64, + 0x2.000002p-64), + TEST ("1.0842022371089897897127399001987457793916291848290711641311" + "6455078125e-19", + false, + 0x2p-64, + 0x2p-64, + 0x2p-64, + 0x2.000004p-64, + true, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.000002p-64, + true, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.000002p-64, + true, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.000002p-64, + true, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.000002p-64, + true, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.000002p-64), + TEST ("1.0842022371089897897127399001987457793916291848290711641311" + "645507812501e-19", + false, + 0x2p-64, + 0x2.000004p-64, + 0x2p-64, + 0x2.000004p-64, + false, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.0000020000002p-64, + false, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.0000020000000004p-64, + false, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.0000020000000004p-64, + false, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.00000200000000000000000001p-64, + false, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.000002p-64, + 0x2.0000020000000000000000000002p-64), + TEST ("1.0842023017324751454180269995275498473574771196581423282623" + "291015625e-19", + true, + 0x2.000004p-64, + 0x2.000004p-64, + 0x2.000004p-64, + 0x2.000004p-64, + true, + 0x2.000004p-64, + 0x2.000004p-64, + 0x2.000004p-64, + 0x2.000004p-64, + true, + 0x2.000004p-64, + 0x2.000004p-64, + 0x2.000004p-64, + 0x2.000004p-64, + true, + 0x2.000004p-64, + 0x2.000004p-64, + 0x2.000004p-64, + 0x2.000004p-64, + true, + 0x2.000004p-64, + 0x2.000004p-64, + 0x2.000004p-64, + 0x2.000004p-64, + true, + 0x2.000004p-64, + 0x2.000004p-64, + 0x2.000004p-64, + 0x2.000004p-64), + TEST ("1.0842023663559605011233140988563539153233250544872134923934" + "936523437499e-19", + false, + 0x2.000004p-64, + 0x2.000004p-64, + 0x2.000004p-64, + 0x2.000008p-64, + false, + 0x2.000005ffffffep-64, + 0x2.000006p-64, + 0x2.000005ffffffep-64, + 0x2.000006p-64, + false, + 0x2.000005fffffffffcp-64, + 0x2.000006p-64, + 0x2.000005fffffffffcp-64, + 0x2.000006p-64, + false, + 0x2.000005fffffffffcp-64, + 0x2.000006p-64, + 0x2.000005fffffffffcp-64, + 0x2.000006p-64, + false, + 0x2.000005ffffffffffffffffffffp-64, + 0x2.000006p-64, + 0x2.000005ffffffffffffffffffffp-64, + 0x2.000006p-64, + false, + 0x2.000005fffffffffffffffffffffep-64, + 0x2.000006p-64, + 0x2.000005fffffffffffffffffffffep-64, + 0x2.000006p-64), + TEST ("1.0842023663559605011233140988563539153233250544872134923934" + "9365234375e-19", + false, + 0x2.000004p-64, + 0x2.000008p-64, + 0x2.000004p-64, + 0x2.000008p-64, + true, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.000006p-64, + true, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.000006p-64, + true, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.000006p-64, + true, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.000006p-64, + true, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.000006p-64), + TEST ("1.0842023663559605011233140988563539153233250544872134923934" + "936523437501e-19", + false, + 0x2.000004p-64, + 0x2.000008p-64, + 0x2.000004p-64, + 0x2.000008p-64, + false, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.0000060000002p-64, + false, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.0000060000000004p-64, + false, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.0000060000000004p-64, + false, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.00000600000000000000000001p-64, + false, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.000006p-64, + 0x2.0000060000000000000000000002p-64), + TEST ("1.0842024309794458568286011981851579832891729893162846565246" + "58203125e-19", + true, + 0x2.000008p-64, + 0x2.000008p-64, + 0x2.000008p-64, + 0x2.000008p-64, + true, + 0x2.000008p-64, + 0x2.000008p-64, + 0x2.000008p-64, + 0x2.000008p-64, + true, + 0x2.000008p-64, + 0x2.000008p-64, + 0x2.000008p-64, + 0x2.000008p-64, + true, + 0x2.000008p-64, + 0x2.000008p-64, + 0x2.000008p-64, + 0x2.000008p-64, + true, + 0x2.000008p-64, + 0x2.000008p-64, + 0x2.000008p-64, + 0x2.000008p-64, + true, + 0x2.000008p-64, + 0x2.000008p-64, + 0x2.000008p-64, + 0x2.000008p-64), + TEST ("7.5231638452626400509999138382223723380394595633413601376560" + "1092018187046051025390625e-37", + true, + 0x1p-120, + 0x1p-120, + 0x1p-120, + 0x1p-120, + true, + 0x1p-120, + 0x1p-120, + 0x1p-120, + 0x1p-120, + true, + 0x1p-120, + 0x1p-120, + 0x1p-120, + 0x1p-120, + true, + 0x1p-120, + 0x1p-120, + 0x1p-120, + 0x1p-120, + true, + 0x1p-120, + 0x1p-120, + 0x1p-120, + 0x1p-120, + true, + 0x1p-120, + 0x1p-120, + 0x1p-120, + 0x1p-120), + TEST ("7.5231642936781486349413765338158389908126215730251815381410" + "578824437213052434003657253924757242202758789062499e-37", + false, + 0x1p-120, + 0x1p-120, + 0x1p-120, + 0x1.000002p-120, + false, + 0x1.000000fffffffp-120, + 0x1.000001p-120, + 0x1.000000fffffffp-120, + 0x1.000001p-120, + false, + 0x1.000000fffffffffep-120, + 0x1.000001p-120, + 0x1.000000fffffffffep-120, + 0x1.000001p-120, + false, + 0x1.000000fffffffffep-120, + 0x1.000001p-120, + 0x1.000000fffffffffep-120, + 0x1.000001p-120, + false, + 0x1.000000ffffffffffffffffffff8p-120, + 0x1.000001p-120, + 0x1.000000ffffffffffffffffffff8p-120, + 0x1.000001p-120, + false, + 0x1.000000ffffffffffffffffffffffp-120, + 0x1.000001p-120, + 0x1.000000ffffffffffffffffffffffp-120, + 0x1.000001p-120), + TEST ("7.5231642936781486349413765338158389908126215730251815381410" + "5788244372130524340036572539247572422027587890625e-37", + false, + 0x1p-120, + 0x1p-120, + 0x1p-120, + 0x1.000002p-120, + true, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.000001p-120, + true, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.000001p-120, + true, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.000001p-120, + true, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.000001p-120, + true, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.000001p-120), + TEST ("7.5231642936781486349413765338158389908126215730251815381410" + "578824437213052434003657253924757242202758789062501e-37", + false, + 0x1p-120, + 0x1.000002p-120, + 0x1p-120, + 0x1.000002p-120, + false, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.0000010000001p-120, + false, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.0000010000000002p-120, + false, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.0000010000000002p-120, + false, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.000001000000000000000000008p-120, + false, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.000001p-120, + 0x1.0000010000000000000000000001p-120), + TEST ("7.5231647420936572188828392294093056435857835827090029386261" + "048447055721499765468252007849514484405517578125e-37", + true, + 0x1.000002p-120, + 0x1.000002p-120, + 0x1.000002p-120, + 0x1.000002p-120, + true, + 0x1.000002p-120, + 0x1.000002p-120, + 0x1.000002p-120, + 0x1.000002p-120, + true, + 0x1.000002p-120, + 0x1.000002p-120, + 0x1.000002p-120, + 0x1.000002p-120, + true, + 0x1.000002p-120, + 0x1.000002p-120, + 0x1.000002p-120, + 0x1.000002p-120, + true, + 0x1.000002p-120, + 0x1.000002p-120, + 0x1.000002p-120, + 0x1.000002p-120, + true, + 0x1.000002p-120, + 0x1.000002p-120, + 0x1.000002p-120, + 0x1.000002p-120), + TEST ("7.5231651905091658028243019250027722963589455923928243391111" + "518069674229947096932846761774271726608276367187499e-37", + false, + 0x1.000002p-120, + 0x1.000002p-120, + 0x1.000002p-120, + 0x1.000004p-120, + false, + 0x1.000002fffffffp-120, + 0x1.000003p-120, + 0x1.000002fffffffp-120, + 0x1.000003p-120, + false, + 0x1.000002fffffffffep-120, + 0x1.000003p-120, + 0x1.000002fffffffffep-120, + 0x1.000003p-120, + false, + 0x1.000002fffffffffep-120, + 0x1.000003p-120, + 0x1.000002fffffffffep-120, + 0x1.000003p-120, + false, + 0x1.000002ffffffffffffffffffff8p-120, + 0x1.000003p-120, + 0x1.000002ffffffffffffffffffff8p-120, + 0x1.000003p-120, + false, + 0x1.000002ffffffffffffffffffffffp-120, + 0x1.000003p-120, + 0x1.000002ffffffffffffffffffffffp-120, + 0x1.000003p-120), + TEST ("7.5231651905091658028243019250027722963589455923928243391111" + "5180696742299470969328467617742717266082763671875e-37", + false, + 0x1.000002p-120, + 0x1.000004p-120, + 0x1.000002p-120, + 0x1.000004p-120, + true, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.000003p-120, + true, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.000003p-120, + true, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.000003p-120, + true, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.000003p-120, + true, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.000003p-120), + TEST ("7.5231651905091658028243019250027722963589455923928243391111" + "518069674229947096932846761774271726608276367187501e-37", + false, + 0x1.000002p-120, + 0x1.000004p-120, + 0x1.000002p-120, + 0x1.000004p-120, + false, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.0000030000001p-120, + false, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.0000030000000002p-120, + false, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.0000030000000002p-120, + false, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.000003000000000000000000008p-120, + false, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.000003p-120, + 0x1.0000030000000000000000000001p-120), + TEST ("7.5231656389246743867657646205962389491321076020766457395961" + "98769229273839442839744151569902896881103515625e-37", + true, + 0x1.000004p-120, + 0x1.000004p-120, + 0x1.000004p-120, + 0x1.000004p-120, + true, + 0x1.000004p-120, + 0x1.000004p-120, + 0x1.000004p-120, + 0x1.000004p-120, + true, + 0x1.000004p-120, + 0x1.000004p-120, + 0x1.000004p-120, + 0x1.000004p-120, + true, + 0x1.000004p-120, + 0x1.000004p-120, + 0x1.000004p-120, + 0x1.000004p-120, + true, + 0x1.000004p-120, + 0x1.000004p-120, + 0x1.000004p-120, + 0x1.000004p-120, + true, + 0x1.000004p-120, + 0x1.000004p-120, + 0x1.000004p-120, + 0x1.000004p-120), + TEST ("340282356779733661637539395458142568447.999", + false, + 0xf.fffffp+124, + 0xf.fffffp+124, + 0xf.fffffp+124, + INF, + false, + 0xf.fffff7ffffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff7ffffff8p+124, + 0xf.fffff8p+124, + false, + 0xf.fffff7fffffffffp+124, + 0xf.fffff8p+124, + 0xf.fffff7fffffffffp+124, + 0xf.fffff8p+124, + false, + 0xf.fffff7fffffffffp+124, + 0xf.fffff8p+124, + 0xf.fffff7fffffffffp+124, + 0xf.fffff8p+124, + false, + 0xf.fffff7fffffffffffffffffffcp+124, + 0xf.fffff8p+124, + 0xf.fffff7fffffffffffffffffffcp+124, + 0xf.fffff8p+124, + false, + 0xf.fffff7fffffffffffffffffffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff7fffffffffffffffffffff8p+124, + 0xf.fffff8p+124), + TEST ("340282356779733661637539395458142568448", + false, + 0xf.fffffp+124, + INF, + 0xf.fffffp+124, + INF, + true, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + true, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + true, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + true, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + true, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8p+124), + TEST ("340282356779733661637539395458142568448.001", + false, + 0xf.fffffp+124, + INF, + 0xf.fffffp+124, + INF, + false, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff80000008p+124, + false, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8000000001p+124, + false, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8000000001p+124, + false, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff800000000000000000004p+124, + false, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff8p+124, + 0xf.fffff80000000000000000000008p+124), + TEST ("-340282356779733661637539395458142568447.999", + false, + -INF, + -0xf.fffffp+124, + -0xf.fffffp+124, + -0xf.fffffp+124, + false, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff7ffffff8p+124, + -0xf.fffff7ffffff8p+124, + false, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff7fffffffffp+124, + -0xf.fffff7fffffffffp+124, + false, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff7fffffffffp+124, + -0xf.fffff7fffffffffp+124, + false, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff7fffffffffffffffffffcp+124, + -0xf.fffff7fffffffffffffffffffcp+124, + false, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff7fffffffffffffffffffff8p+124, + -0xf.fffff7fffffffffffffffffffff8p+124), + TEST ("-340282356779733661637539395458142568448", + false, + -INF, + -INF, + -0xf.fffffp+124, + -0xf.fffffp+124, + true, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + true, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + true, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + true, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + true, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124), + TEST ("-340282356779733661637539395458142568448.001", + false, + -INF, + -INF, + -0xf.fffffp+124, + -0xf.fffffp+124, + false, + -0xf.fffff80000008p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + false, + -0xf.fffff8000000001p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + false, + -0xf.fffff8000000001p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + false, + -0xf.fffff800000000000000000004p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + false, + -0xf.fffff80000000000000000000008p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124, + -0xf.fffff8p+124), + TEST ("179769313486231580793728971405303415079934132710037826936173" + "778980444968292764750946649017977587207096330286416692887910" + "946555547851940402630657488671505820681908902000708383676273" + "854845817711531764475730270069855571366959622842914819860834" + "936475292719074168444365510704342711559699508093042880177904" + "174497791.999", + false, + 0xf.fffffp+124, + INF, + 0xf.fffffp+124, + INF, + false, + 0xf.ffffffffffff8p+1020, + 0xf.ffffffffffff8p+1020, + 0xf.ffffffffffff8p+1020, + INF, + false, + 0xf.ffffffffffffbffp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffbffp+1020, + 0xf.ffffffffffffcp+1020, + false, + 0xf.ffffffffffffbffp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffbffp+1020, + 0xf.ffffffffffffcp+1020, + false, + 0xf.ffffffffffffbffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffbffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + false, + 0xf.ffffffffffffbffffffffffffff8p+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffbffffffffffffff8p+1020, + 0xf.ffffffffffffcp+1020), + TEST ("179769313486231580793728971405303415079934132710037826936173" + "778980444968292764750946649017977587207096330286416692887910" + "946555547851940402630657488671505820681908902000708383676273" + "854845817711531764475730270069855571366959622842914819860834" + "936475292719074168444365510704342711559699508093042880177904" + "174497792", + false, + 0xf.fffffp+124, + INF, + 0xf.fffffp+124, + INF, + false, + 0xf.ffffffffffff8p+1020, + INF, + 0xf.ffffffffffff8p+1020, + INF, + true, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + true, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + false, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + true, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020), + TEST ("179769313486231580793728971405303415079934132710037826936173" + "778980444968292764750946649017977587207096330286416692887910" + "946555547851940402630657488671505820681908902000708383676273" + "854845817711531764475730270069855571366959622842914819860834" + "936475292719074168444365510704342711559699508093042880177904" + "174497792.001", + false, + 0xf.fffffp+124, + INF, + 0xf.fffffp+124, + INF, + false, + 0xf.ffffffffffff8p+1020, + INF, + 0xf.ffffffffffff8p+1020, + INF, + false, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffc01p+1020, + false, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffc01p+1020, + false, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffc0000000000004p+1020, + false, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffcp+1020, + 0xf.ffffffffffffc000000000000008p+1020), + TEST ("-17976931348623158079372897140530341507993413271003782693617" + "377898044496829276475094664901797758720709633028641669288791" + "094655554785194040263065748867150582068190890200070838367627" + "385484581771153176447573027006985557136695962284291481986083" + "493647529271907416844436551070434271155969950809304288017790" + "4174497791.999", + false, + -INF, + -INF, + -0xf.fffffp+124, + -0xf.fffffp+124, + false, + -INF, + -0xf.ffffffffffff8p+1020, + -0xf.ffffffffffff8p+1020, + -0xf.ffffffffffff8p+1020, + false, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffbffp+1020, + -0xf.ffffffffffffbffp+1020, + false, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffbffp+1020, + -0xf.ffffffffffffbffp+1020, + false, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffbffffffffffffcp+1020, + -0xf.ffffffffffffbffffffffffffcp+1020, + false, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffbffffffffffffff8p+1020, + -0xf.ffffffffffffbffffffffffffff8p+1020), + TEST ("-17976931348623158079372897140530341507993413271003782693617" + "377898044496829276475094664901797758720709633028641669288791" + "094655554785194040263065748867150582068190890200070838367627" + "385484581771153176447573027006985557136695962284291481986083" + "493647529271907416844436551070434271155969950809304288017790" + "4174497792", + false, + -INF, + -INF, + -0xf.fffffp+124, + -0xf.fffffp+124, + false, + -INF, + -INF, + -0xf.ffffffffffff8p+1020, + -0xf.ffffffffffff8p+1020, + true, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + true, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + false, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + true, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020), + TEST ("-17976931348623158079372897140530341507993413271003782693617" + "377898044496829276475094664901797758720709633028641669288791" + "094655554785194040263065748867150582068190890200070838367627" + "385484581771153176447573027006985557136695962284291481986083" + "493647529271907416844436551070434271155969950809304288017790" + "4174497792.001", + false, + -INF, + -INF, + -0xf.fffffp+124, + -0xf.fffffp+124, + false, + -INF, + -INF, + -0xf.ffffffffffff8p+1020, + -0xf.ffffffffffff8p+1020, + false, + -0xf.ffffffffffffc01p+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + false, + -0xf.ffffffffffffc01p+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + false, + -0xf.ffffffffffffc0000000000004p+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + false, + -0xf.ffffffffffffc000000000000008p+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020, + -0xf.ffffffffffffcp+1020), + TEST ("118973149535723176505351158982948866796625400469556721895649" + "927756249918185172720476044944290457046138433056764616744328" + "666255526748948793023632513609765434237723241753648908036202" + "958495124648560574092817813661123067421904850038181180520787" + "720310726881239888580817051703268776757919551260442611296993" + "969730906497042135737359373754818979106457807539652027804156" + "491987771033211787185996492320631117543475322122625353433719" + "930462950413766867781210335973022293561007134342532563356262" + "609267460063335819387905541393759243547993474715549691352074" + "891450084783459970660481689991674771307443551458551137274603" + "094678907537177579699931235422786658780337099286207273033150" + "295133847635735008945346069635452157254692607776538304457707" + "598289220004738023060594798392660507455937428888763514661408" + "758068906506527143720723156203739676372818578090840614216621" + "704787774611256823213431325634056809505691175988424606654072" + "823115950827627377808673574181547198668714142143234447550206" + "269197545774263993130119778810659043621312707109068433886162" + "877222844491518930341896313561238988520360803607534987178305" + "043520937299838173444083502027340452162582038296009574808809" + "658742434897860755961343752419543802653239216337103370292742" + "935497502474626454559729017094560234867236701379230234809843" + "263739640909561388493227725171983531003154799850580375254640" + "686684370650275318316632539920970969803838872914424760535111" + "444864748847573042963569291679400178896696862026500700279826" + "635302471702206627303799047632971460017199544567373231610376" + "256879987134317934150014443436145710546137924490489525241523" + "018271239906743645663976778059895127442517397682525944430951" + "907648109952479454685655581652571021331761401038962049122047" + "111009185757383743827811254014770944602713378187451095200132" + "611700632386420792585207954137064426995712656449343534120120" + "770857498813673742586478583964512406030930704197486727636333" + "837001863610516286928300891774383071105022919314408502968809" + "463848377324668014115592383521324785361676372582468085716775" + "183709078048790084022838728361454734650904480489014369184979" + "256497738392744524915616501449487520501300124861778269881261" + "335544037735715125808986359728419859776521586683035924100574" + "850554368935873803132428446524362913648833348768663733118103" + "918959060412499201797234385239260504905744357611987327994540" + "083286019952793692265006211633524675976369938866409689573287" + "599490442761701229217689614343727392339547174221615984024864" + "635625680108391566720681134647098412863051374760613506003971" + "759070209697293081442875903240426975910170967179075646317814" + "394978762382183679266247724762405284284971833355044962214065" + "895558105408175131247181971272672247996246595857705695208092" + "816044125822560989770526261449460733912621692806952140652061" + "911968824328747339453822511902787546522099225623311147726504" + "972617425102845212076162056723650625826928778132002074035405" + "250631109426611640681070927283430486232053929420514345435713" + "131387967949326001734866894273047449417824913738789829732833" + "683358900903818016968127085077418070951770702999663693968324" + "004781728763310108379440442854174041581191669623267749855519" + "774427387794278666183504498843857475877442235608736818515722" + "862733587905866015455830953591207040129558473662150426884726" + "759522376583586317425575669726781893104752341432891868770513" + "406836036136374264038296610854599454591170582569741798904328" + "676755131072831974295435585611673171096113833795735888591844" + "569864166955969416680807491722688418115891753669917660968752" + "228842669182040018336152355940915579955628386232949747891257" + "526145783057949776122896048841308261113063674538553146663451" + "574384023903569848640351704415703922683108552880537081027404" + "397775617608412295293311763789489900990611859125572525530349" + "278319943261304784125553748811339225969956465404836696490782" + "500903694674135036899321686023782466034636817818347651623601" + "663129318574761269352028560641266614840108083315301260274558" + "575087296910384815285134460531715154639604115052348665171547" + "251609075784863196403541944155425166776423403472211742139313" + "210299896884252707306862499895115691675551238140467142819537" + "867343414276518703858928008759955391140729958278175965217739" + "826511218924463113077693598006228365514899236789515147503266" + "616268809617626228164916917150602464494142485507467876173251" + "398398846807079309227567538802476335624194115637802439400050" + "221934368975949846684026462252790745597563393487879954351820" + "652138303761879543933808642920064500206512003954563931569820" + "114768348051593629274325149906343853129692245386396887281599" + "735312588117968646270517005121997466606469447530616465384255" + "826304380842850779833108567141643769616400809617173972138187" + "711971431230616321035038259922624655396612597024040812967444" + "207673594478417900666764580589685104809363813759667069693701" + "069921295791929938093722225050956280798177934138468414654728" + "631498256418191041953123619406060363406390776140155709737059" + "125898120366007955506160309553860446596202876233728025871625" + "578031503869424406179027994752890226443351619365453243328968" + "8740976918527.999", + false, + 0xf.fffffp+124, + INF, + 0xf.fffffp+124, + INF, + false, + 0xf.ffffffffffff8p+1020, + INF, + 0xf.ffffffffffff8p+1020, + INF, + false, + 0xf.fffffffffffffffp+16380, + 0xf.fffffffffffffffp+16380, + 0xf.fffffffffffffffp+16380, + INF, + false, + 0xf.fffffffffffffffp+16380, + 0xf.fffffffffffffffp+16380, + 0xf.fffffffffffffffp+16380, + INF, + false, + 0xf.fffffffffffffffffffffffffcp+1020, + INF, + 0xf.fffffffffffffffffffffffffcp+1020, + INF, + false, + 0xf.fffffffffffffff7fffffffffff8p+16380, + 0xf.fffffffffffffff8p+16380, + 0xf.fffffffffffffff7fffffffffff8p+16380, + 0xf.fffffffffffffff8p+16380), + TEST ("118973149535723176505351158982948866796625400469556721895649" + "927756249918185172720476044944290457046138433056764616744328" + "666255526748948793023632513609765434237723241753648908036202" + "958495124648560574092817813661123067421904850038181180520787" + "720310726881239888580817051703268776757919551260442611296993" + "969730906497042135737359373754818979106457807539652027804156" + "491987771033211787185996492320631117543475322122625353433719" + "930462950413766867781210335973022293561007134342532563356262" + "609267460063335819387905541393759243547993474715549691352074" + "891450084783459970660481689991674771307443551458551137274603" + "094678907537177579699931235422786658780337099286207273033150" + "295133847635735008945346069635452157254692607776538304457707" + "598289220004738023060594798392660507455937428888763514661408" + "758068906506527143720723156203739676372818578090840614216621" + "704787774611256823213431325634056809505691175988424606654072" + "823115950827627377808673574181547198668714142143234447550206" + "269197545774263993130119778810659043621312707109068433886162" + "877222844491518930341896313561238988520360803607534987178305" + "043520937299838173444083502027340452162582038296009574808809" + "658742434897860755961343752419543802653239216337103370292742" + "935497502474626454559729017094560234867236701379230234809843" + "263739640909561388493227725171983531003154799850580375254640" + "686684370650275318316632539920970969803838872914424760535111" + "444864748847573042963569291679400178896696862026500700279826" + "635302471702206627303799047632971460017199544567373231610376" + "256879987134317934150014443436145710546137924490489525241523" + "018271239906743645663976778059895127442517397682525944430951" + "907648109952479454685655581652571021331761401038962049122047" + "111009185757383743827811254014770944602713378187451095200132" + "611700632386420792585207954137064426995712656449343534120120" + "770857498813673742586478583964512406030930704197486727636333" + "837001863610516286928300891774383071105022919314408502968809" + "463848377324668014115592383521324785361676372582468085716775" + "183709078048790084022838728361454734650904480489014369184979" + "256497738392744524915616501449487520501300124861778269881261" + "335544037735715125808986359728419859776521586683035924100574" + "850554368935873803132428446524362913648833348768663733118103" + "918959060412499201797234385239260504905744357611987327994540" + "083286019952793692265006211633524675976369938866409689573287" + "599490442761701229217689614343727392339547174221615984024864" + "635625680108391566720681134647098412863051374760613506003971" + "759070209697293081442875903240426975910170967179075646317814" + "394978762382183679266247724762405284284971833355044962214065" + "895558105408175131247181971272672247996246595857705695208092" + "816044125822560989770526261449460733912621692806952140652061" + "911968824328747339453822511902787546522099225623311147726504" + "972617425102845212076162056723650625826928778132002074035405" + "250631109426611640681070927283430486232053929420514345435713" + "131387967949326001734866894273047449417824913738789829732833" + "683358900903818016968127085077418070951770702999663693968324" + "004781728763310108379440442854174041581191669623267749855519" + "774427387794278666183504498843857475877442235608736818515722" + "862733587905866015455830953591207040129558473662150426884726" + "759522376583586317425575669726781893104752341432891868770513" + "406836036136374264038296610854599454591170582569741798904328" + "676755131072831974295435585611673171096113833795735888591844" + "569864166955969416680807491722688418115891753669917660968752" + "228842669182040018336152355940915579955628386232949747891257" + "526145783057949776122896048841308261113063674538553146663451" + "574384023903569848640351704415703922683108552880537081027404" + "397775617608412295293311763789489900990611859125572525530349" + "278319943261304784125553748811339225969956465404836696490782" + "500903694674135036899321686023782466034636817818347651623601" + "663129318574761269352028560641266614840108083315301260274558" + "575087296910384815285134460531715154639604115052348665171547" + "251609075784863196403541944155425166776423403472211742139313" + "210299896884252707306862499895115691675551238140467142819537" + "867343414276518703858928008759955391140729958278175965217739" + "826511218924463113077693598006228365514899236789515147503266" + "616268809617626228164916917150602464494142485507467876173251" + "398398846807079309227567538802476335624194115637802439400050" + "221934368975949846684026462252790745597563393487879954351820" + "652138303761879543933808642920064500206512003954563931569820" + "114768348051593629274325149906343853129692245386396887281599" + "735312588117968646270517005121997466606469447530616465384255" + "826304380842850779833108567141643769616400809617173972138187" + "711971431230616321035038259922624655396612597024040812967444" + "207673594478417900666764580589685104809363813759667069693701" + "069921295791929938093722225050956280798177934138468414654728" + "631498256418191041953123619406060363406390776140155709737059" + "125898120366007955506160309553860446596202876233728025871625" + "578031503869424406179027994752890226443351619365453243328968" + "8740976918528", + false, + 0xf.fffffp+124, + INF, + 0xf.fffffp+124, + INF, + false, + 0xf.ffffffffffff8p+1020, + INF, + 0xf.ffffffffffff8p+1020, + INF, + false, + 0xf.fffffffffffffffp+16380, + INF, + 0xf.fffffffffffffffp+16380, + INF, + false, + 0xf.fffffffffffffffp+16380, + INF, + 0xf.fffffffffffffffp+16380, + INF, + false, + 0xf.fffffffffffffffffffffffffcp+1020, + INF, + 0xf.fffffffffffffffffffffffffcp+1020, + INF, + true, + 0xf.fffffffffffffff8p+16380, + 0xf.fffffffffffffff8p+16380, + 0xf.fffffffffffffff8p+16380, + 0xf.fffffffffffffff8p+16380), + TEST ("118973149535723176505351158982948866796625400469556721895649" + "927756249918185172720476044944290457046138433056764616744328" + "666255526748948793023632513609765434237723241753648908036202" + "958495124648560574092817813661123067421904850038181180520787" + "720310726881239888580817051703268776757919551260442611296993" + "969730906497042135737359373754818979106457807539652027804156" + "491987771033211787185996492320631117543475322122625353433719" + "930462950413766867781210335973022293561007134342532563356262" + "609267460063335819387905541393759243547993474715549691352074" + "891450084783459970660481689991674771307443551458551137274603" + "094678907537177579699931235422786658780337099286207273033150" + "295133847635735008945346069635452157254692607776538304457707" + "598289220004738023060594798392660507455937428888763514661408" + "758068906506527143720723156203739676372818578090840614216621" + "704787774611256823213431325634056809505691175988424606654072" + "823115950827627377808673574181547198668714142143234447550206" + "269197545774263993130119778810659043621312707109068433886162" + "877222844491518930341896313561238988520360803607534987178305" + "043520937299838173444083502027340452162582038296009574808809" + "658742434897860755961343752419543802653239216337103370292742" + "935497502474626454559729017094560234867236701379230234809843" + "263739640909561388493227725171983531003154799850580375254640" + "686684370650275318316632539920970969803838872914424760535111" + "444864748847573042963569291679400178896696862026500700279826" + "635302471702206627303799047632971460017199544567373231610376" + "256879987134317934150014443436145710546137924490489525241523" + "018271239906743645663976778059895127442517397682525944430951" + "907648109952479454685655581652571021331761401038962049122047" + "111009185757383743827811254014770944602713378187451095200132" + "611700632386420792585207954137064426995712656449343534120120" + "770857498813673742586478583964512406030930704197486727636333" + "837001863610516286928300891774383071105022919314408502968809" + "463848377324668014115592383521324785361676372582468085716775" + "183709078048790084022838728361454734650904480489014369184979" + "256497738392744524915616501449487520501300124861778269881261" + "335544037735715125808986359728419859776521586683035924100574" + "850554368935873803132428446524362913648833348768663733118103" + "918959060412499201797234385239260504905744357611987327994540" + "083286019952793692265006211633524675976369938866409689573287" + "599490442761701229217689614343727392339547174221615984024864" + "635625680108391566720681134647098412863051374760613506003971" + "759070209697293081442875903240426975910170967179075646317814" + "394978762382183679266247724762405284284971833355044962214065" + "895558105408175131247181971272672247996246595857705695208092" + "816044125822560989770526261449460733912621692806952140652061" + "911968824328747339453822511902787546522099225623311147726504" + "972617425102845212076162056723650625826928778132002074035405" + "250631109426611640681070927283430486232053929420514345435713" + "131387967949326001734866894273047449417824913738789829732833" + "683358900903818016968127085077418070951770702999663693968324" + "004781728763310108379440442854174041581191669623267749855519" + "774427387794278666183504498843857475877442235608736818515722" + "862733587905866015455830953591207040129558473662150426884726" + "759522376583586317425575669726781893104752341432891868770513" + "406836036136374264038296610854599454591170582569741798904328" + "676755131072831974295435585611673171096113833795735888591844" + "569864166955969416680807491722688418115891753669917660968752" + "228842669182040018336152355940915579955628386232949747891257" + "526145783057949776122896048841308261113063674538553146663451" + "574384023903569848640351704415703922683108552880537081027404" + "397775617608412295293311763789489900990611859125572525530349" + "278319943261304784125553748811339225969956465404836696490782" + "500903694674135036899321686023782466034636817818347651623601" + "663129318574761269352028560641266614840108083315301260274558" + "575087296910384815285134460531715154639604115052348665171547" + "251609075784863196403541944155425166776423403472211742139313" + "210299896884252707306862499895115691675551238140467142819537" + "867343414276518703858928008759955391140729958278175965217739" + "826511218924463113077693598006228365514899236789515147503266" + "616268809617626228164916917150602464494142485507467876173251" + "398398846807079309227567538802476335624194115637802439400050" + "221934368975949846684026462252790745597563393487879954351820" + "652138303761879543933808642920064500206512003954563931569820" + "114768348051593629274325149906343853129692245386396887281599" + "735312588117968646270517005121997466606469447530616465384255" + "826304380842850779833108567141643769616400809617173972138187" + "711971431230616321035038259922624655396612597024040812967444" + "207673594478417900666764580589685104809363813759667069693701" + "069921295791929938093722225050956280798177934138468414654728" + "631498256418191041953123619406060363406390776140155709737059" + "125898120366007955506160309553860446596202876233728025871625" + "578031503869424406179027994752890226443351619365453243328968" + "8740976918528.001", + false, + 0xf.fffffp+124, + INF, + 0xf.fffffp+124, + INF, + false, + 0xf.ffffffffffff8p+1020, + INF, + 0xf.ffffffffffff8p+1020, + INF, + false, + 0xf.fffffffffffffffp+16380, + INF, + 0xf.fffffffffffffffp+16380, + INF, + false, + 0xf.fffffffffffffffp+16380, + INF, + 0xf.fffffffffffffffp+16380, + INF, + false, + 0xf.fffffffffffffffffffffffffcp+1020, + INF, + 0xf.fffffffffffffffffffffffffcp+1020, + INF, + false, + 0xf.fffffffffffffff8p+16380, + 0xf.fffffffffffffff8p+16380, + 0xf.fffffffffffffff8p+16380, + 0xf.fffffffffffffff8000000000008p+16380), + TEST ("-11897314953572317650535115898294886679662540046955672189564" + "992775624991818517272047604494429045704613843305676461674432" + "866625552674894879302363251360976543423772324175364890803620" + "295849512464856057409281781366112306742190485003818118052078" + "772031072688123988858081705170326877675791955126044261129699" + "396973090649704213573735937375481897910645780753965202780415" + "649198777103321178718599649232063111754347532212262535343371" + "993046295041376686778121033597302229356100713434253256335626" + "260926746006333581938790554139375924354799347471554969135207" + "489145008478345997066048168999167477130744355145855113727460" + "309467890753717757969993123542278665878033709928620727303315" + "029513384763573500894534606963545215725469260777653830445770" + "759828922000473802306059479839266050745593742888876351466140" + "875806890650652714372072315620373967637281857809084061421662" + "170478777461125682321343132563405680950569117598842460665407" + "282311595082762737780867357418154719866871414214323444755020" + "626919754577426399313011977881065904362131270710906843388616" + "287722284449151893034189631356123898852036080360753498717830" + "504352093729983817344408350202734045216258203829600957480880" + "965874243489786075596134375241954380265323921633710337029274" + "293549750247462645455972901709456023486723670137923023480984" + "326373964090956138849322772517198353100315479985058037525464" + "068668437065027531831663253992097096980383887291442476053511" + "144486474884757304296356929167940017889669686202650070027982" + "663530247170220662730379904763297146001719954456737323161037" + "625687998713431793415001444343614571054613792449048952524152" + "301827123990674364566397677805989512744251739768252594443095" + "190764810995247945468565558165257102133176140103896204912204" + "711100918575738374382781125401477094460271337818745109520013" + "261170063238642079258520795413706442699571265644934353412012" + "077085749881367374258647858396451240603093070419748672763633" + "383700186361051628692830089177438307110502291931440850296880" + "946384837732466801411559238352132478536167637258246808571677" + "518370907804879008402283872836145473465090448048901436918497" + "925649773839274452491561650144948752050130012486177826988126" + "133554403773571512580898635972841985977652158668303592410057" + "485055436893587380313242844652436291364883334876866373311810" + "391895906041249920179723438523926050490574435761198732799454" + "008328601995279369226500621163352467597636993886640968957328" + "759949044276170122921768961434372739233954717422161598402486" + "463562568010839156672068113464709841286305137476061350600397" + "175907020969729308144287590324042697591017096717907564631781" + "439497876238218367926624772476240528428497183335504496221406" + "589555810540817513124718197127267224799624659585770569520809" + "281604412582256098977052626144946073391262169280695214065206" + "191196882432874733945382251190278754652209922562331114772650" + "497261742510284521207616205672365062582692877813200207403540" + "525063110942661164068107092728343048623205392942051434543571" + "313138796794932600173486689427304744941782491373878982973283" + "368335890090381801696812708507741807095177070299966369396832" + "400478172876331010837944044285417404158119166962326774985551" + "977442738779427866618350449884385747587744223560873681851572" + "286273358790586601545583095359120704012955847366215042688472" + "675952237658358631742557566972678189310475234143289186877051" + "340683603613637426403829661085459945459117058256974179890432" + "867675513107283197429543558561167317109611383379573588859184" + "456986416695596941668080749172268841811589175366991766096875" + "222884266918204001833615235594091557995562838623294974789125" + "752614578305794977612289604884130826111306367453855314666345" + "157438402390356984864035170441570392268310855288053708102740" + "439777561760841229529331176378948990099061185912557252553034" + "927831994326130478412555374881133922596995646540483669649078" + "250090369467413503689932168602378246603463681781834765162360" + "166312931857476126935202856064126661484010808331530126027455" + "857508729691038481528513446053171515463960411505234866517154" + "725160907578486319640354194415542516677642340347221174213931" + "321029989688425270730686249989511569167555123814046714281953" + "786734341427651870385892800875995539114072995827817596521773" + "982651121892446311307769359800622836551489923678951514750326" + "661626880961762622816491691715060246449414248550746787617325" + "139839884680707930922756753880247633562419411563780243940005" + "022193436897594984668402646225279074559756339348787995435182" + "065213830376187954393380864292006450020651200395456393156982" + "011476834805159362927432514990634385312969224538639688728159" + "973531258811796864627051700512199746660646944753061646538425" + "582630438084285077983310856714164376961640080961717397213818" + "771197143123061632103503825992262465539661259702404081296744" + "420767359447841790066676458058968510480936381375966706969370" + "106992129579192993809372222505095628079817793413846841465472" + "863149825641819104195312361940606036340639077614015570973705" + "912589812036600795550616030955386044659620287623372802587162" + "557803150386942440617902799475289022644335161936545324332896" + "88740976918527.999", + false, + -INF, + -INF, + -0xf.fffffp+124, + -0xf.fffffp+124, + false, + -INF, + -INF, + -0xf.ffffffffffff8p+1020, + -0xf.ffffffffffff8p+1020, + false, + -INF, + -0xf.fffffffffffffffp+16380, + -0xf.fffffffffffffffp+16380, + -0xf.fffffffffffffffp+16380, + false, + -INF, + -0xf.fffffffffffffffp+16380, + -0xf.fffffffffffffffp+16380, + -0xf.fffffffffffffffp+16380, + false, + -INF, + -INF, + -0xf.fffffffffffffffffffffffffcp+1020, + -0xf.fffffffffffffffffffffffffcp+1020, + false, + -0xf.fffffffffffffff8p+16380, + -0xf.fffffffffffffff8p+16380, + -0xf.fffffffffffffff7fffffffffff8p+16380, + -0xf.fffffffffffffff7fffffffffff8p+16380), + TEST ("-11897314953572317650535115898294886679662540046955672189564" + "992775624991818517272047604494429045704613843305676461674432" + "866625552674894879302363251360976543423772324175364890803620" + "295849512464856057409281781366112306742190485003818118052078" + "772031072688123988858081705170326877675791955126044261129699" + "396973090649704213573735937375481897910645780753965202780415" + "649198777103321178718599649232063111754347532212262535343371" + "993046295041376686778121033597302229356100713434253256335626" + "260926746006333581938790554139375924354799347471554969135207" + "489145008478345997066048168999167477130744355145855113727460" + "309467890753717757969993123542278665878033709928620727303315" + "029513384763573500894534606963545215725469260777653830445770" + "759828922000473802306059479839266050745593742888876351466140" + "875806890650652714372072315620373967637281857809084061421662" + "170478777461125682321343132563405680950569117598842460665407" + "282311595082762737780867357418154719866871414214323444755020" + "626919754577426399313011977881065904362131270710906843388616" + "287722284449151893034189631356123898852036080360753498717830" + "504352093729983817344408350202734045216258203829600957480880" + "965874243489786075596134375241954380265323921633710337029274" + "293549750247462645455972901709456023486723670137923023480984" + "326373964090956138849322772517198353100315479985058037525464" + "068668437065027531831663253992097096980383887291442476053511" + "144486474884757304296356929167940017889669686202650070027982" + "663530247170220662730379904763297146001719954456737323161037" + "625687998713431793415001444343614571054613792449048952524152" + "301827123990674364566397677805989512744251739768252594443095" + "190764810995247945468565558165257102133176140103896204912204" + "711100918575738374382781125401477094460271337818745109520013" + "261170063238642079258520795413706442699571265644934353412012" + "077085749881367374258647858396451240603093070419748672763633" + "383700186361051628692830089177438307110502291931440850296880" + "946384837732466801411559238352132478536167637258246808571677" + "518370907804879008402283872836145473465090448048901436918497" + "925649773839274452491561650144948752050130012486177826988126" + "133554403773571512580898635972841985977652158668303592410057" + "485055436893587380313242844652436291364883334876866373311810" + "391895906041249920179723438523926050490574435761198732799454" + "008328601995279369226500621163352467597636993886640968957328" + "759949044276170122921768961434372739233954717422161598402486" + "463562568010839156672068113464709841286305137476061350600397" + "175907020969729308144287590324042697591017096717907564631781" + "439497876238218367926624772476240528428497183335504496221406" + "589555810540817513124718197127267224799624659585770569520809" + "281604412582256098977052626144946073391262169280695214065206" + "191196882432874733945382251190278754652209922562331114772650" + "497261742510284521207616205672365062582692877813200207403540" + "525063110942661164068107092728343048623205392942051434543571" + "313138796794932600173486689427304744941782491373878982973283" + "368335890090381801696812708507741807095177070299966369396832" + "400478172876331010837944044285417404158119166962326774985551" + "977442738779427866618350449884385747587744223560873681851572" + "286273358790586601545583095359120704012955847366215042688472" + "675952237658358631742557566972678189310475234143289186877051" + "340683603613637426403829661085459945459117058256974179890432" + "867675513107283197429543558561167317109611383379573588859184" + "456986416695596941668080749172268841811589175366991766096875" + "222884266918204001833615235594091557995562838623294974789125" + "752614578305794977612289604884130826111306367453855314666345" + "157438402390356984864035170441570392268310855288053708102740" + "439777561760841229529331176378948990099061185912557252553034" + "927831994326130478412555374881133922596995646540483669649078" + "250090369467413503689932168602378246603463681781834765162360" + "166312931857476126935202856064126661484010808331530126027455" + "857508729691038481528513446053171515463960411505234866517154" + "725160907578486319640354194415542516677642340347221174213931" + "321029989688425270730686249989511569167555123814046714281953" + "786734341427651870385892800875995539114072995827817596521773" + "982651121892446311307769359800622836551489923678951514750326" + "661626880961762622816491691715060246449414248550746787617325" + "139839884680707930922756753880247633562419411563780243940005" + "022193436897594984668402646225279074559756339348787995435182" + "065213830376187954393380864292006450020651200395456393156982" + "011476834805159362927432514990634385312969224538639688728159" + "973531258811796864627051700512199746660646944753061646538425" + "582630438084285077983310856714164376961640080961717397213818" + "771197143123061632103503825992262465539661259702404081296744" + "420767359447841790066676458058968510480936381375966706969370" + "106992129579192993809372222505095628079817793413846841465472" + "863149825641819104195312361940606036340639077614015570973705" + "912589812036600795550616030955386044659620287623372802587162" + "557803150386942440617902799475289022644335161936545324332896" + "88740976918528", + false, + -INF, + -INF, + -0xf.fffffp+124, + -0xf.fffffp+124, + false, + -INF, + -INF, + -0xf.ffffffffffff8p+1020, + -0xf.ffffffffffff8p+1020, + false, + -INF, + -INF, + -0xf.fffffffffffffffp+16380, + -0xf.fffffffffffffffp+16380, + false, + -INF, + -INF, + -0xf.fffffffffffffffp+16380, + -0xf.fffffffffffffffp+16380, + false, + -INF, + -INF, + -0xf.fffffffffffffffffffffffffcp+1020, + -0xf.fffffffffffffffffffffffffcp+1020, + true, + -0xf.fffffffffffffff8p+16380, + -0xf.fffffffffffffff8p+16380, + -0xf.fffffffffffffff8p+16380, + -0xf.fffffffffffffff8p+16380), + TEST ("-11897314953572317650535115898294886679662540046955672189564" + "992775624991818517272047604494429045704613843305676461674432" + "866625552674894879302363251360976543423772324175364890803620" + "295849512464856057409281781366112306742190485003818118052078" + "772031072688123988858081705170326877675791955126044261129699" + "396973090649704213573735937375481897910645780753965202780415" + "649198777103321178718599649232063111754347532212262535343371" + "993046295041376686778121033597302229356100713434253256335626" + "260926746006333581938790554139375924354799347471554969135207" + "489145008478345997066048168999167477130744355145855113727460" + "309467890753717757969993123542278665878033709928620727303315" + "029513384763573500894534606963545215725469260777653830445770" + "759828922000473802306059479839266050745593742888876351466140" + "875806890650652714372072315620373967637281857809084061421662" + "170478777461125682321343132563405680950569117598842460665407" + "282311595082762737780867357418154719866871414214323444755020" + "626919754577426399313011977881065904362131270710906843388616" + "287722284449151893034189631356123898852036080360753498717830" + "504352093729983817344408350202734045216258203829600957480880" + "965874243489786075596134375241954380265323921633710337029274" + "293549750247462645455972901709456023486723670137923023480984" + "326373964090956138849322772517198353100315479985058037525464" + "068668437065027531831663253992097096980383887291442476053511" + "144486474884757304296356929167940017889669686202650070027982" + "663530247170220662730379904763297146001719954456737323161037" + "625687998713431793415001444343614571054613792449048952524152" + "301827123990674364566397677805989512744251739768252594443095" + "190764810995247945468565558165257102133176140103896204912204" + "711100918575738374382781125401477094460271337818745109520013" + "261170063238642079258520795413706442699571265644934353412012" + "077085749881367374258647858396451240603093070419748672763633" + "383700186361051628692830089177438307110502291931440850296880" + "946384837732466801411559238352132478536167637258246808571677" + "518370907804879008402283872836145473465090448048901436918497" + "925649773839274452491561650144948752050130012486177826988126" + "133554403773571512580898635972841985977652158668303592410057" + "485055436893587380313242844652436291364883334876866373311810" + "391895906041249920179723438523926050490574435761198732799454" + "008328601995279369226500621163352467597636993886640968957328" + "759949044276170122921768961434372739233954717422161598402486" + "463562568010839156672068113464709841286305137476061350600397" + "175907020969729308144287590324042697591017096717907564631781" + "439497876238218367926624772476240528428497183335504496221406" + "589555810540817513124718197127267224799624659585770569520809" + "281604412582256098977052626144946073391262169280695214065206" + "191196882432874733945382251190278754652209922562331114772650" + "497261742510284521207616205672365062582692877813200207403540" + "525063110942661164068107092728343048623205392942051434543571" + "313138796794932600173486689427304744941782491373878982973283" + "368335890090381801696812708507741807095177070299966369396832" + "400478172876331010837944044285417404158119166962326774985551" + "977442738779427866618350449884385747587744223560873681851572" + "286273358790586601545583095359120704012955847366215042688472" + "675952237658358631742557566972678189310475234143289186877051" + "340683603613637426403829661085459945459117058256974179890432" + "867675513107283197429543558561167317109611383379573588859184" + "456986416695596941668080749172268841811589175366991766096875" + "222884266918204001833615235594091557995562838623294974789125" + "752614578305794977612289604884130826111306367453855314666345" + "157438402390356984864035170441570392268310855288053708102740" + "439777561760841229529331176378948990099061185912557252553034" + "927831994326130478412555374881133922596995646540483669649078" + "250090369467413503689932168602378246603463681781834765162360" + "166312931857476126935202856064126661484010808331530126027455" + "857508729691038481528513446053171515463960411505234866517154" + "725160907578486319640354194415542516677642340347221174213931" + "321029989688425270730686249989511569167555123814046714281953" + "786734341427651870385892800875995539114072995827817596521773" + "982651121892446311307769359800622836551489923678951514750326" + "661626880961762622816491691715060246449414248550746787617325" + "139839884680707930922756753880247633562419411563780243940005" + "022193436897594984668402646225279074559756339348787995435182" + "065213830376187954393380864292006450020651200395456393156982" + "011476834805159362927432514990634385312969224538639688728159" + "973531258811796864627051700512199746660646944753061646538425" + "582630438084285077983310856714164376961640080961717397213818" + "771197143123061632103503825992262465539661259702404081296744" + "420767359447841790066676458058968510480936381375966706969370" + "106992129579192993809372222505095628079817793413846841465472" + "863149825641819104195312361940606036340639077614015570973705" + "912589812036600795550616030955386044659620287623372802587162" + "557803150386942440617902799475289022644335161936545324332896" + "88740976918528.001", + false, + -INF, + -INF, + -0xf.fffffp+124, + -0xf.fffffp+124, + false, + -INF, + -INF, + -0xf.ffffffffffff8p+1020, + -0xf.ffffffffffff8p+1020, + false, + -INF, + -INF, + -0xf.fffffffffffffffp+16380, + -0xf.fffffffffffffffp+16380, + false, + -INF, + -INF, + -0xf.fffffffffffffffp+16380, + -0xf.fffffffffffffffp+16380, + false, + -INF, + -INF, + -0xf.fffffffffffffffffffffffffcp+1020, + -0xf.fffffffffffffffffffffffffcp+1020, + false, + -0xf.fffffffffffffff8000000000008p+16380, + -0xf.fffffffffffffff8p+16380, + -0xf.fffffffffffffff8p+16380, + -0xf.fffffffffffffff8p+16380), + TEST ("118973149535723176508575932662800707347995686986910214150118" + "685272271246896789803961473130416053705672050873552479421805" + "932646640744124594447361172514341324846716679654551308018400" + "452551246797021031695590308415421099521962856162050274568841" + "297915828747574343774874752902176710049525787625138678906010" + "048638212027057374683542842282633896097240913572043788690878" + "561421008447838407815393303366617352859876685151925036335142" + "606462825839541908847139311166770091872983498508632067665424" + "131663456011801988221011933744533095583591952713287509471572" + "005635584655570174753698625195967118200265238753375268656404" + "300638718932246773699829720984119713851462400809295266529707" + "450603039675996477317034685632764277790214944500590950459817" + "905458649624723235138950801408157339866516893477731877579183" + "713595679581558427625325833939652897845282019149923069371763" + "621014587926698827182969408373803807712292191282429102445352" + "493434039402290243933941906906661090602900960765874258303002" + "994639315656152078708796474719793763077934223746582725715380" + "546621026022818892467551940977566283266498758568504813830755" + "715585325649227824857891916443381390920079346240984072859876" + "394789650127468861490822526766717770136680743866932662343305" + "821821344306240809967537078707691232937387041140557168161956" + "672595323950666742010786584275766171661791973302251394804664" + "351065107886557299707326005651230394674710597929211000345040" + "748992483614253006562424867893567074606589931788062200063807" + "336740036940230215831403322125165368742446805152078682411506" + "081843753974005583111391605547148303480887461773984314393817" + "233328426227146997925421743280885595916487699461777590949432" + "536021389649845214065322016198143547250143861460313408300535" + "800647014276175548485543791298383644643679669618879907720347" + "361578030001247419574448359597988425487829219851305162204925" + "876422580754230478244492592334149461342828532046897137732862" + "560405101567370570895662663174689131741739602970845694214086" + "383402465037069569640956912385125748139813888875258203003486" + "978747055202810394072908580324008598756993885667142200558137" + "216665049755676940757442911860295559656788759871904662758651" + "106796978788783386988295123326864580419821595430891867179378" + "372968821128698879468814267529461494723425453808822356093436" + "114567635804621183162768389034017821036515461700163537265334" + "837042272659885702600247792917728828912373907035369136531164" + "551871575024551077026080114197652598224677403885378544255851" + "452142889211152237506343909351748731538683443195842912801950" + "740929058503113127929421291089844021925400931905939216271347" + "501989193058654389516377770771439860033940981826669939750630" + "966060749188986231404992238674933998516958950824840538996637" + "227947236848099456610159878061379742621311380927234118601003" + "068752002060437285024623575047782086630607224900910789188204" + "422115342157245494745974521832782208601602710639261482504706" + "793704189474198047840288064399210243702202724597107455534275" + "321401119382263147115748905050195256886082040192083380490209" + "648570353905656303876661710430922155024620842080323610266391" + "819853291160589645614945256684769911320943457402697573094119" + "430125589389298495428377185239916427991844172165080029177729" + "625180644077484441695092005844026411665118679537869781924378" + "377060887769389297625907410934020531742739577183152327119791" + "567636713426904553654134937766951789571845662564530364234831" + "655818811851573018210173773037253988893680153247404060131255" + "432297982534770778617218088583998040670598195597843579610890" + "315316606725381521608825464438386306376596459107591134507541" + "153403024199191222328259713530472683187873517955642380703639" + "029816037096049042094836437281075965243968431839386959736989" + "889027924230006904683050305965712585804355337311372959487108" + "794286031594805559334414767793211932142402860019029250966461" + "933621763149049802791695077716375242516443825235146860078555" + "453142397983479144560015010889077242726183149587493050950967" + "941488752366197740591478464591650201477772717579831983405962" + "171742164889284586217913115136227964861078958766284010901639" + "781256012341028188155836968476480842715858962105341815444164" + "696766584018508513610260777540911573496315580383328678958350" + "148157337222619548467971967434956296433870815461340134721800" + "205755114983399523323106573720732056659216468891205124203527" + "449961814733926916757607468806003312492414061695431041238453" + "023522795690830184799840657478014435335788410588338795921829" + "674102072285495410088727730494748054715270026371111466557692" + "092596172401951206117443077191868585496116051853795368595736" + "003882511620497061598923985774687093334185939744167238203676" + "453052472980823976562293117120372063945943890666325365061961" + "022928215929070357135085816756816486043117613837876554929621" + "856269743752885605649447338817178927896144473776360438797900" + "366212779802747593450564030114752479071739585723270865632758" + "495434839556211713523098602573445161475191311400514062427097" + "780117858230840648695846140902244217544683559565818359212130" + "972233447491583165728635513802591543441145939539353470970452" + "5536550715391.999", + false, + 0xf.fffffp+124, + INF, + 0xf.fffffp+124, + INF, + false, + 0xf.ffffffffffff8p+1020, + INF, + 0xf.ffffffffffff8p+1020, + INF, + false, + 0xf.fffffffffffffffp+16380, + INF, + 0xf.fffffffffffffffp+16380, + INF, + false, + 0xf.fffffffffffffffp+16380, + INF, + 0xf.fffffffffffffffp+16380, + INF, + false, + 0xf.fffffffffffffffffffffffffcp+1020, + INF, + 0xf.fffffffffffffffffffffffffcp+1020, + INF, + false, + 0xf.fffffffffffffffffffffffffff8p+16380, + 0xf.fffffffffffffffffffffffffff8p+16380, + 0xf.fffffffffffffffffffffffffff8p+16380, + INF), + TEST ("118973149535723176508575932662800707347995686986910214150118" + "685272271246896789803961473130416053705672050873552479421805" + "932646640744124594447361172514341324846716679654551308018400" + "452551246797021031695590308415421099521962856162050274568841" + "297915828747574343774874752902176710049525787625138678906010" + "048638212027057374683542842282633896097240913572043788690878" + "561421008447838407815393303366617352859876685151925036335142" + "606462825839541908847139311166770091872983498508632067665424" + "131663456011801988221011933744533095583591952713287509471572" + "005635584655570174753698625195967118200265238753375268656404" + "300638718932246773699829720984119713851462400809295266529707" + "450603039675996477317034685632764277790214944500590950459817" + "905458649624723235138950801408157339866516893477731877579183" + "713595679581558427625325833939652897845282019149923069371763" + "621014587926698827182969408373803807712292191282429102445352" + "493434039402290243933941906906661090602900960765874258303002" + "994639315656152078708796474719793763077934223746582725715380" + "546621026022818892467551940977566283266498758568504813830755" + "715585325649227824857891916443381390920079346240984072859876" + "394789650127468861490822526766717770136680743866932662343305" + "821821344306240809967537078707691232937387041140557168161956" + "672595323950666742010786584275766171661791973302251394804664" + "351065107886557299707326005651230394674710597929211000345040" + "748992483614253006562424867893567074606589931788062200063807" + "336740036940230215831403322125165368742446805152078682411506" + "081843753974005583111391605547148303480887461773984314393817" + "233328426227146997925421743280885595916487699461777590949432" + "536021389649845214065322016198143547250143861460313408300535" + "800647014276175548485543791298383644643679669618879907720347" + "361578030001247419574448359597988425487829219851305162204925" + "876422580754230478244492592334149461342828532046897137732862" + "560405101567370570895662663174689131741739602970845694214086" + "383402465037069569640956912385125748139813888875258203003486" + "978747055202810394072908580324008598756993885667142200558137" + "216665049755676940757442911860295559656788759871904662758651" + "106796978788783386988295123326864580419821595430891867179378" + "372968821128698879468814267529461494723425453808822356093436" + "114567635804621183162768389034017821036515461700163537265334" + "837042272659885702600247792917728828912373907035369136531164" + "551871575024551077026080114197652598224677403885378544255851" + "452142889211152237506343909351748731538683443195842912801950" + "740929058503113127929421291089844021925400931905939216271347" + "501989193058654389516377770771439860033940981826669939750630" + "966060749188986231404992238674933998516958950824840538996637" + "227947236848099456610159878061379742621311380927234118601003" + "068752002060437285024623575047782086630607224900910789188204" + "422115342157245494745974521832782208601602710639261482504706" + "793704189474198047840288064399210243702202724597107455534275" + "321401119382263147115748905050195256886082040192083380490209" + "648570353905656303876661710430922155024620842080323610266391" + "819853291160589645614945256684769911320943457402697573094119" + "430125589389298495428377185239916427991844172165080029177729" + "625180644077484441695092005844026411665118679537869781924378" + "377060887769389297625907410934020531742739577183152327119791" + "567636713426904553654134937766951789571845662564530364234831" + "655818811851573018210173773037253988893680153247404060131255" + "432297982534770778617218088583998040670598195597843579610890" + "315316606725381521608825464438386306376596459107591134507541" + "153403024199191222328259713530472683187873517955642380703639" + "029816037096049042094836437281075965243968431839386959736989" + "889027924230006904683050305965712585804355337311372959487108" + "794286031594805559334414767793211932142402860019029250966461" + "933621763149049802791695077716375242516443825235146860078555" + "453142397983479144560015010889077242726183149587493050950967" + "941488752366197740591478464591650201477772717579831983405962" + "171742164889284586217913115136227964861078958766284010901639" + "781256012341028188155836968476480842715858962105341815444164" + "696766584018508513610260777540911573496315580383328678958350" + "148157337222619548467971967434956296433870815461340134721800" + "205755114983399523323106573720732056659216468891205124203527" + "449961814733926916757607468806003312492414061695431041238453" + "023522795690830184799840657478014435335788410588338795921829" + "674102072285495410088727730494748054715270026371111466557692" + "092596172401951206117443077191868585496116051853795368595736" + "003882511620497061598923985774687093334185939744167238203676" + "453052472980823976562293117120372063945943890666325365061961" + "022928215929070357135085816756816486043117613837876554929621" + "856269743752885605649447338817178927896144473776360438797900" + "366212779802747593450564030114752479071739585723270865632758" + "495434839556211713523098602573445161475191311400514062427097" + "780117858230840648695846140902244217544683559565818359212130" + "972233447491583165728635513802591543441145939539353470970452" + "5536550715392", + false, + 0xf.fffffp+124, + INF, + 0xf.fffffp+124, + INF, + false, + 0xf.ffffffffffff8p+1020, + INF, + 0xf.ffffffffffff8p+1020, + INF, + false, + 0xf.fffffffffffffffp+16380, + INF, + 0xf.fffffffffffffffp+16380, + INF, + false, + 0xf.fffffffffffffffp+16380, + INF, + 0xf.fffffffffffffffp+16380, + INF, + false, + 0xf.fffffffffffffffffffffffffcp+1020, + INF, + 0xf.fffffffffffffffffffffffffcp+1020, + INF, + false, + 0xf.fffffffffffffffffffffffffff8p+16380, + INF, + 0xf.fffffffffffffffffffffffffff8p+16380, + INF), + TEST ("118973149535723176508575932662800707347995686986910214150118" + "685272271246896789803961473130416053705672050873552479421805" + "932646640744124594447361172514341324846716679654551308018400" + "452551246797021031695590308415421099521962856162050274568841" + "297915828747574343774874752902176710049525787625138678906010" + "048638212027057374683542842282633896097240913572043788690878" + "561421008447838407815393303366617352859876685151925036335142" + "606462825839541908847139311166770091872983498508632067665424" + "131663456011801988221011933744533095583591952713287509471572" + "005635584655570174753698625195967118200265238753375268656404" + "300638718932246773699829720984119713851462400809295266529707" + "450603039675996477317034685632764277790214944500590950459817" + "905458649624723235138950801408157339866516893477731877579183" + "713595679581558427625325833939652897845282019149923069371763" + "621014587926698827182969408373803807712292191282429102445352" + "493434039402290243933941906906661090602900960765874258303002" + "994639315656152078708796474719793763077934223746582725715380" + "546621026022818892467551940977566283266498758568504813830755" + "715585325649227824857891916443381390920079346240984072859876" + "394789650127468861490822526766717770136680743866932662343305" + "821821344306240809967537078707691232937387041140557168161956" + "672595323950666742010786584275766171661791973302251394804664" + "351065107886557299707326005651230394674710597929211000345040" + "748992483614253006562424867893567074606589931788062200063807" + "336740036940230215831403322125165368742446805152078682411506" + "081843753974005583111391605547148303480887461773984314393817" + "233328426227146997925421743280885595916487699461777590949432" + "536021389649845214065322016198143547250143861460313408300535" + "800647014276175548485543791298383644643679669618879907720347" + "361578030001247419574448359597988425487829219851305162204925" + "876422580754230478244492592334149461342828532046897137732862" + "560405101567370570895662663174689131741739602970845694214086" + "383402465037069569640956912385125748139813888875258203003486" + "978747055202810394072908580324008598756993885667142200558137" + "216665049755676940757442911860295559656788759871904662758651" + "106796978788783386988295123326864580419821595430891867179378" + "372968821128698879468814267529461494723425453808822356093436" + "114567635804621183162768389034017821036515461700163537265334" + "837042272659885702600247792917728828912373907035369136531164" + "551871575024551077026080114197652598224677403885378544255851" + "452142889211152237506343909351748731538683443195842912801950" + "740929058503113127929421291089844021925400931905939216271347" + "501989193058654389516377770771439860033940981826669939750630" + "966060749188986231404992238674933998516958950824840538996637" + "227947236848099456610159878061379742621311380927234118601003" + "068752002060437285024623575047782086630607224900910789188204" + "422115342157245494745974521832782208601602710639261482504706" + "793704189474198047840288064399210243702202724597107455534275" + "321401119382263147115748905050195256886082040192083380490209" + "648570353905656303876661710430922155024620842080323610266391" + "819853291160589645614945256684769911320943457402697573094119" + "430125589389298495428377185239916427991844172165080029177729" + "625180644077484441695092005844026411665118679537869781924378" + "377060887769389297625907410934020531742739577183152327119791" + "567636713426904553654134937766951789571845662564530364234831" + "655818811851573018210173773037253988893680153247404060131255" + "432297982534770778617218088583998040670598195597843579610890" + "315316606725381521608825464438386306376596459107591134507541" + "153403024199191222328259713530472683187873517955642380703639" + "029816037096049042094836437281075965243968431839386959736989" + "889027924230006904683050305965712585804355337311372959487108" + "794286031594805559334414767793211932142402860019029250966461" + "933621763149049802791695077716375242516443825235146860078555" + "453142397983479144560015010889077242726183149587493050950967" + "941488752366197740591478464591650201477772717579831983405962" + "171742164889284586217913115136227964861078958766284010901639" + "781256012341028188155836968476480842715858962105341815444164" + "696766584018508513610260777540911573496315580383328678958350" + "148157337222619548467971967434956296433870815461340134721800" + "205755114983399523323106573720732056659216468891205124203527" + "449961814733926916757607468806003312492414061695431041238453" + "023522795690830184799840657478014435335788410588338795921829" + "674102072285495410088727730494748054715270026371111466557692" + "092596172401951206117443077191868585496116051853795368595736" + "003882511620497061598923985774687093334185939744167238203676" + "453052472980823976562293117120372063945943890666325365061961" + "022928215929070357135085816756816486043117613837876554929621" + "856269743752885605649447338817178927896144473776360438797900" + "366212779802747593450564030114752479071739585723270865632758" + "495434839556211713523098602573445161475191311400514062427097" + "780117858230840648695846140902244217544683559565818359212130" + "972233447491583165728635513802591543441145939539353470970452" + "5536550715392.001", + false, + 0xf.fffffp+124, + INF, + 0xf.fffffp+124, + INF, + false, + 0xf.ffffffffffff8p+1020, + INF, + 0xf.ffffffffffff8p+1020, + INF, + false, + 0xf.fffffffffffffffp+16380, + INF, + 0xf.fffffffffffffffp+16380, + INF, + false, + 0xf.fffffffffffffffp+16380, + INF, + 0xf.fffffffffffffffp+16380, + INF, + false, + 0xf.fffffffffffffffffffffffffcp+1020, + INF, + 0xf.fffffffffffffffffffffffffcp+1020, + INF, + false, + 0xf.fffffffffffffffffffffffffff8p+16380, + INF, + 0xf.fffffffffffffffffffffffffff8p+16380, + INF), + TEST ("-11897314953572317650857593266280070734799568698691021415011" + "868527227124689678980396147313041605370567205087355247942180" + "593264664074412459444736117251434132484671667965455130801840" + "045255124679702103169559030841542109952196285616205027456884" + "129791582874757434377487475290217671004952578762513867890601" + "004863821202705737468354284228263389609724091357204378869087" + "856142100844783840781539330336661735285987668515192503633514" + "260646282583954190884713931116677009187298349850863206766542" + "413166345601180198822101193374453309558359195271328750947157" + "200563558465557017475369862519596711820026523875337526865640" + "430063871893224677369982972098411971385146240080929526652970" + "745060303967599647731703468563276427779021494450059095045981" + "790545864962472323513895080140815733986651689347773187757918" + "371359567958155842762532583393965289784528201914992306937176" + "362101458792669882718296940837380380771229219128242910244535" + "249343403940229024393394190690666109060290096076587425830300" + "299463931565615207870879647471979376307793422374658272571538" + "054662102602281889246755194097756628326649875856850481383075" + "571558532564922782485789191644338139092007934624098407285987" + "639478965012746886149082252676671777013668074386693266234330" + "582182134430624080996753707870769123293738704114055716816195" + "667259532395066674201078658427576617166179197330225139480466" + "435106510788655729970732600565123039467471059792921100034504" + "074899248361425300656242486789356707460658993178806220006380" + "733674003694023021583140332212516536874244680515207868241150" + "608184375397400558311139160554714830348088746177398431439381" + "723332842622714699792542174328088559591648769946177759094943" + "253602138964984521406532201619814354725014386146031340830053" + "580064701427617554848554379129838364464367966961887990772034" + "736157803000124741957444835959798842548782921985130516220492" + "587642258075423047824449259233414946134282853204689713773286" + "256040510156737057089566266317468913174173960297084569421408" + "638340246503706956964095691238512574813981388887525820300348" + "697874705520281039407290858032400859875699388566714220055813" + "721666504975567694075744291186029555965678875987190466275865" + "110679697878878338698829512332686458041982159543089186717937" + "837296882112869887946881426752946149472342545380882235609343" + "611456763580462118316276838903401782103651546170016353726533" + "483704227265988570260024779291772882891237390703536913653116" + "455187157502455107702608011419765259822467740388537854425585" + "145214288921115223750634390935174873153868344319584291280195" + "074092905850311312792942129108984402192540093190593921627134" + "750198919305865438951637777077143986003394098182666993975063" + "096606074918898623140499223867493399851695895082484053899663" + "722794723684809945661015987806137974262131138092723411860100" + "306875200206043728502462357504778208663060722490091078918820" + "442211534215724549474597452183278220860160271063926148250470" + "679370418947419804784028806439921024370220272459710745553427" + "532140111938226314711574890505019525688608204019208338049020" + "964857035390565630387666171043092215502462084208032361026639" + "181985329116058964561494525668476991132094345740269757309411" + "943012558938929849542837718523991642799184417216508002917772" + "962518064407748444169509200584402641166511867953786978192437" + "837706088776938929762590741093402053174273957718315232711979" + "156763671342690455365413493776695178957184566256453036423483" + "165581881185157301821017377303725398889368015324740406013125" + "543229798253477077861721808858399804067059819559784357961089" + "031531660672538152160882546443838630637659645910759113450754" + "115340302419919122232825971353047268318787351795564238070363" + "902981603709604904209483643728107596524396843183938695973698" + "988902792423000690468305030596571258580435533731137295948710" + "879428603159480555933441476779321193214240286001902925096646" + "193362176314904980279169507771637524251644382523514686007855" + "545314239798347914456001501088907724272618314958749305095096" + "794148875236619774059147846459165020147777271757983198340596" + "217174216488928458621791311513622796486107895876628401090163" + "978125601234102818815583696847648084271585896210534181544416" + "469676658401850851361026077754091157349631558038332867895835" + "014815733722261954846797196743495629643387081546134013472180" + "020575511498339952332310657372073205665921646889120512420352" + "744996181473392691675760746880600331249241406169543104123845" + "302352279569083018479984065747801443533578841058833879592182" + "967410207228549541008872773049474805471527002637111146655769" + "209259617240195120611744307719186858549611605185379536859573" + "600388251162049706159892398577468709333418593974416723820367" + "645305247298082397656229311712037206394594389066632536506196" + "102292821592907035713508581675681648604311761383787655492962" + "185626974375288560564944733881717892789614447377636043879790" + "036621277980274759345056403011475247907173958572327086563275" + "849543483955621171352309860257344516147519131140051406242709" + "778011785823084064869584614090224421754468355956581835921213" + "097223344749158316572863551380259154344114593953935347097045" + "25536550715391.999", + false, + -INF, + -INF, + -0xf.fffffp+124, + -0xf.fffffp+124, + false, + -INF, + -INF, + -0xf.ffffffffffff8p+1020, + -0xf.ffffffffffff8p+1020, + false, + -INF, + -INF, + -0xf.fffffffffffffffp+16380, + -0xf.fffffffffffffffp+16380, + false, + -INF, + -INF, + -0xf.fffffffffffffffp+16380, + -0xf.fffffffffffffffp+16380, + false, + -INF, + -INF, + -0xf.fffffffffffffffffffffffffcp+1020, + -0xf.fffffffffffffffffffffffffcp+1020, + false, + -INF, + -0xf.fffffffffffffffffffffffffff8p+16380, + -0xf.fffffffffffffffffffffffffff8p+16380, + -0xf.fffffffffffffffffffffffffff8p+16380), + TEST ("-11897314953572317650857593266280070734799568698691021415011" + "868527227124689678980396147313041605370567205087355247942180" + "593264664074412459444736117251434132484671667965455130801840" + "045255124679702103169559030841542109952196285616205027456884" + "129791582874757434377487475290217671004952578762513867890601" + "004863821202705737468354284228263389609724091357204378869087" + "856142100844783840781539330336661735285987668515192503633514" + "260646282583954190884713931116677009187298349850863206766542" + "413166345601180198822101193374453309558359195271328750947157" + "200563558465557017475369862519596711820026523875337526865640" + "430063871893224677369982972098411971385146240080929526652970" + "745060303967599647731703468563276427779021494450059095045981" + "790545864962472323513895080140815733986651689347773187757918" + "371359567958155842762532583393965289784528201914992306937176" + "362101458792669882718296940837380380771229219128242910244535" + "249343403940229024393394190690666109060290096076587425830300" + "299463931565615207870879647471979376307793422374658272571538" + "054662102602281889246755194097756628326649875856850481383075" + "571558532564922782485789191644338139092007934624098407285987" + "639478965012746886149082252676671777013668074386693266234330" + "582182134430624080996753707870769123293738704114055716816195" + "667259532395066674201078658427576617166179197330225139480466" + "435106510788655729970732600565123039467471059792921100034504" + "074899248361425300656242486789356707460658993178806220006380" + "733674003694023021583140332212516536874244680515207868241150" + "608184375397400558311139160554714830348088746177398431439381" + "723332842622714699792542174328088559591648769946177759094943" + "253602138964984521406532201619814354725014386146031340830053" + "580064701427617554848554379129838364464367966961887990772034" + "736157803000124741957444835959798842548782921985130516220492" + "587642258075423047824449259233414946134282853204689713773286" + "256040510156737057089566266317468913174173960297084569421408" + "638340246503706956964095691238512574813981388887525820300348" + "697874705520281039407290858032400859875699388566714220055813" + "721666504975567694075744291186029555965678875987190466275865" + "110679697878878338698829512332686458041982159543089186717937" + "837296882112869887946881426752946149472342545380882235609343" + "611456763580462118316276838903401782103651546170016353726533" + "483704227265988570260024779291772882891237390703536913653116" + "455187157502455107702608011419765259822467740388537854425585" + "145214288921115223750634390935174873153868344319584291280195" + "074092905850311312792942129108984402192540093190593921627134" + "750198919305865438951637777077143986003394098182666993975063" + "096606074918898623140499223867493399851695895082484053899663" + "722794723684809945661015987806137974262131138092723411860100" + "306875200206043728502462357504778208663060722490091078918820" + "442211534215724549474597452183278220860160271063926148250470" + "679370418947419804784028806439921024370220272459710745553427" + "532140111938226314711574890505019525688608204019208338049020" + "964857035390565630387666171043092215502462084208032361026639" + "181985329116058964561494525668476991132094345740269757309411" + "943012558938929849542837718523991642799184417216508002917772" + "962518064407748444169509200584402641166511867953786978192437" + "837706088776938929762590741093402053174273957718315232711979" + "156763671342690455365413493776695178957184566256453036423483" + "165581881185157301821017377303725398889368015324740406013125" + "543229798253477077861721808858399804067059819559784357961089" + "031531660672538152160882546443838630637659645910759113450754" + "115340302419919122232825971353047268318787351795564238070363" + "902981603709604904209483643728107596524396843183938695973698" + "988902792423000690468305030596571258580435533731137295948710" + "879428603159480555933441476779321193214240286001902925096646" + "193362176314904980279169507771637524251644382523514686007855" + "545314239798347914456001501088907724272618314958749305095096" + "794148875236619774059147846459165020147777271757983198340596" + "217174216488928458621791311513622796486107895876628401090163" + "978125601234102818815583696847648084271585896210534181544416" + "469676658401850851361026077754091157349631558038332867895835" + "014815733722261954846797196743495629643387081546134013472180" + "020575511498339952332310657372073205665921646889120512420352" + "744996181473392691675760746880600331249241406169543104123845" + "302352279569083018479984065747801443533578841058833879592182" + "967410207228549541008872773049474805471527002637111146655769" + "209259617240195120611744307719186858549611605185379536859573" + "600388251162049706159892398577468709333418593974416723820367" + "645305247298082397656229311712037206394594389066632536506196" + "102292821592907035713508581675681648604311761383787655492962" + "185626974375288560564944733881717892789614447377636043879790" + "036621277980274759345056403011475247907173958572327086563275" + "849543483955621171352309860257344516147519131140051406242709" + "778011785823084064869584614090224421754468355956581835921213" + "097223344749158316572863551380259154344114593953935347097045" + "25536550715392", + false, + -INF, + -INF, + -0xf.fffffp+124, + -0xf.fffffp+124, + false, + -INF, + -INF, + -0xf.ffffffffffff8p+1020, + -0xf.ffffffffffff8p+1020, + false, + -INF, + -INF, + -0xf.fffffffffffffffp+16380, + -0xf.fffffffffffffffp+16380, + false, + -INF, + -INF, + -0xf.fffffffffffffffp+16380, + -0xf.fffffffffffffffp+16380, + false, + -INF, + -INF, + -0xf.fffffffffffffffffffffffffcp+1020, + -0xf.fffffffffffffffffffffffffcp+1020, + false, + -INF, + -INF, + -0xf.fffffffffffffffffffffffffff8p+16380, + -0xf.fffffffffffffffffffffffffff8p+16380), + TEST ("-11897314953572317650857593266280070734799568698691021415011" + "868527227124689678980396147313041605370567205087355247942180" + "593264664074412459444736117251434132484671667965455130801840" + "045255124679702103169559030841542109952196285616205027456884" + "129791582874757434377487475290217671004952578762513867890601" + "004863821202705737468354284228263389609724091357204378869087" + "856142100844783840781539330336661735285987668515192503633514" + "260646282583954190884713931116677009187298349850863206766542" + "413166345601180198822101193374453309558359195271328750947157" + "200563558465557017475369862519596711820026523875337526865640" + "430063871893224677369982972098411971385146240080929526652970" + "745060303967599647731703468563276427779021494450059095045981" + "790545864962472323513895080140815733986651689347773187757918" + "371359567958155842762532583393965289784528201914992306937176" + "362101458792669882718296940837380380771229219128242910244535" + "249343403940229024393394190690666109060290096076587425830300" + "299463931565615207870879647471979376307793422374658272571538" + "054662102602281889246755194097756628326649875856850481383075" + "571558532564922782485789191644338139092007934624098407285987" + "639478965012746886149082252676671777013668074386693266234330" + "582182134430624080996753707870769123293738704114055716816195" + "667259532395066674201078658427576617166179197330225139480466" + "435106510788655729970732600565123039467471059792921100034504" + "074899248361425300656242486789356707460658993178806220006380" + "733674003694023021583140332212516536874244680515207868241150" + "608184375397400558311139160554714830348088746177398431439381" + "723332842622714699792542174328088559591648769946177759094943" + "253602138964984521406532201619814354725014386146031340830053" + "580064701427617554848554379129838364464367966961887990772034" + "736157803000124741957444835959798842548782921985130516220492" + "587642258075423047824449259233414946134282853204689713773286" + "256040510156737057089566266317468913174173960297084569421408" + "638340246503706956964095691238512574813981388887525820300348" + "697874705520281039407290858032400859875699388566714220055813" + "721666504975567694075744291186029555965678875987190466275865" + "110679697878878338698829512332686458041982159543089186717937" + "837296882112869887946881426752946149472342545380882235609343" + "611456763580462118316276838903401782103651546170016353726533" + "483704227265988570260024779291772882891237390703536913653116" + "455187157502455107702608011419765259822467740388537854425585" + "145214288921115223750634390935174873153868344319584291280195" + "074092905850311312792942129108984402192540093190593921627134" + "750198919305865438951637777077143986003394098182666993975063" + "096606074918898623140499223867493399851695895082484053899663" + "722794723684809945661015987806137974262131138092723411860100" + "306875200206043728502462357504778208663060722490091078918820" + "442211534215724549474597452183278220860160271063926148250470" + "679370418947419804784028806439921024370220272459710745553427" + "532140111938226314711574890505019525688608204019208338049020" + "964857035390565630387666171043092215502462084208032361026639" + "181985329116058964561494525668476991132094345740269757309411" + "943012558938929849542837718523991642799184417216508002917772" + "962518064407748444169509200584402641166511867953786978192437" + "837706088776938929762590741093402053174273957718315232711979" + "156763671342690455365413493776695178957184566256453036423483" + "165581881185157301821017377303725398889368015324740406013125" + "543229798253477077861721808858399804067059819559784357961089" + "031531660672538152160882546443838630637659645910759113450754" + "115340302419919122232825971353047268318787351795564238070363" + "902981603709604904209483643728107596524396843183938695973698" + "988902792423000690468305030596571258580435533731137295948710" + "879428603159480555933441476779321193214240286001902925096646" + "193362176314904980279169507771637524251644382523514686007855" + "545314239798347914456001501088907724272618314958749305095096" + "794148875236619774059147846459165020147777271757983198340596" + "217174216488928458621791311513622796486107895876628401090163" + "978125601234102818815583696847648084271585896210534181544416" + "469676658401850851361026077754091157349631558038332867895835" + "014815733722261954846797196743495629643387081546134013472180" + "020575511498339952332310657372073205665921646889120512420352" + "744996181473392691675760746880600331249241406169543104123845" + "302352279569083018479984065747801443533578841058833879592182" + "967410207228549541008872773049474805471527002637111146655769" + "209259617240195120611744307719186858549611605185379536859573" + "600388251162049706159892398577468709333418593974416723820367" + "645305247298082397656229311712037206394594389066632536506196" + "102292821592907035713508581675681648604311761383787655492962" + "185626974375288560564944733881717892789614447377636043879790" + "036621277980274759345056403011475247907173958572327086563275" + "849543483955621171352309860257344516147519131140051406242709" + "778011785823084064869584614090224421754468355956581835921213" + "097223344749158316572863551380259154344114593953935347097045" + "25536550715392.001", + false, + -INF, + -INF, + -0xf.fffffp+124, + -0xf.fffffp+124, + false, + -INF, + -INF, + -0xf.ffffffffffff8p+1020, + -0xf.ffffffffffff8p+1020, + false, + -INF, + -INF, + -0xf.fffffffffffffffp+16380, + -0xf.fffffffffffffffp+16380, + false, + -INF, + -INF, + -0xf.fffffffffffffffp+16380, + -0xf.fffffffffffffffp+16380, + false, + -INF, + -INF, + -0xf.fffffffffffffffffffffffffcp+1020, + -0xf.fffffffffffffffffffffffffcp+1020, + false, + -INF, + -INF, + -0xf.fffffffffffffffffffffffffff8p+16380, + -0xf.fffffffffffffffffffffffffff8p+16380), + TEST ("2.1019476964872256063855943749348741969203929128147736576356" + "0242583468662402879090222995728254318237304687499e-45", + false, + 0x8p-152, + 0x8p-152, + 0x8p-152, + 0x1p-148, + false, + 0xb.ffffffffffff8p-152, + 0xcp-152, + 0xb.ffffffffffff8p-152, + 0xcp-152, + false, + 0xb.fffffffffffffffp-152, + 0xcp-152, + 0xb.fffffffffffffffp-152, + 0xcp-152, + false, + 0xb.fffffffffffffffp-152, + 0xcp-152, + 0xb.fffffffffffffffp-152, + 0xcp-152, + false, + 0xb.fffffffffffffffffffffffffcp-152, + 0xcp-152, + 0xb.fffffffffffffffffffffffffcp-152, + 0xcp-152, + false, + 0xb.fffffffffffffffffffffffffff8p-152, + 0xcp-152, + 0xb.fffffffffffffffffffffffffff8p-152, + 0xcp-152), + TEST ("2.1019476964872256063855943749348741969203929128147736576356" + "02425834686624028790902229957282543182373046875e-45", + false, + 0x8p-152, + 0x1p-148, + 0x8p-152, + 0x1p-148, + true, + 0xcp-152, + 0xcp-152, + 0xcp-152, + 0xcp-152, + true, + 0xcp-152, + 0xcp-152, + 0xcp-152, + 0xcp-152, + true, + 0xcp-152, + 0xcp-152, + 0xcp-152, + 0xcp-152, + true, + 0xcp-152, + 0xcp-152, + 0xcp-152, + 0xcp-152, + true, + 0xcp-152, + 0xcp-152, + 0xcp-152, + 0xcp-152), + TEST ("2.1019476964872256063855943749348741969203929128147736576356" + "0242583468662402879090222995728254318237304687501e-45", + false, + 0x8p-152, + 0x1p-148, + 0x8p-152, + 0x1p-148, + false, + 0xcp-152, + 0xcp-152, + 0xcp-152, + 0xc.0000000000008p-152, + false, + 0xcp-152, + 0xcp-152, + 0xcp-152, + 0xc.000000000000001p-152, + false, + 0xcp-152, + 0xcp-152, + 0xcp-152, + 0xc.000000000000001p-152, + false, + 0xcp-152, + 0xcp-152, + 0xcp-152, + 0xc.00000000000000000000000004p-152, + false, + 0xcp-152, + 0xcp-152, + 0xcp-152, + 0xc.0000000000000000000000000008p-152), + TEST ("-2.101947696487225606385594374934874196920392912814773657635" + "60242583468662402879090222995728254318237304687499e-45", + false, + -0x1p-148, + -0x8p-152, + -0x8p-152, + -0x8p-152, + false, + -0xcp-152, + -0xcp-152, + -0xb.ffffffffffff8p-152, + -0xb.ffffffffffff8p-152, + false, + -0xcp-152, + -0xcp-152, + -0xb.fffffffffffffffp-152, + -0xb.fffffffffffffffp-152, + false, + -0xcp-152, + -0xcp-152, + -0xb.fffffffffffffffp-152, + -0xb.fffffffffffffffp-152, + false, + -0xcp-152, + -0xcp-152, + -0xb.fffffffffffffffffffffffffcp-152, + -0xb.fffffffffffffffffffffffffcp-152, + false, + -0xcp-152, + -0xcp-152, + -0xb.fffffffffffffffffffffffffff8p-152, + -0xb.fffffffffffffffffffffffffff8p-152), + TEST ("-2.101947696487225606385594374934874196920392912814773657635" + "602425834686624028790902229957282543182373046875e-45", + false, + -0x1p-148, + -0x1p-148, + -0x8p-152, + -0x8p-152, + true, + -0xcp-152, + -0xcp-152, + -0xcp-152, + -0xcp-152, + true, + -0xcp-152, + -0xcp-152, + -0xcp-152, + -0xcp-152, + true, + -0xcp-152, + -0xcp-152, + -0xcp-152, + -0xcp-152, + true, + -0xcp-152, + -0xcp-152, + -0xcp-152, + -0xcp-152, + true, + -0xcp-152, + -0xcp-152, + -0xcp-152, + -0xcp-152), + TEST ("-2.101947696487225606385594374934874196920392912814773657635" + "60242583468662402879090222995728254318237304687501e-45", + false, + -0x1p-148, + -0x1p-148, + -0x8p-152, + -0x8p-152, + false, + -0xc.0000000000008p-152, + -0xcp-152, + -0xcp-152, + -0xcp-152, + false, + -0xc.000000000000001p-152, + -0xcp-152, + -0xcp-152, + -0xcp-152, + false, + -0xc.000000000000001p-152, + -0xcp-152, + -0xcp-152, + -0xcp-152, + false, + -0xc.00000000000000000000000004p-152, + -0xcp-152, + -0xcp-152, + -0xcp-152, + false, + -0xc.0000000000000000000000000008p-152, + -0xcp-152, + -0xcp-152, + -0xcp-152), + TEST ("3.5032461608120426773093239582247903282006548546912894293926" + "7070972447770671465150371659547090530395507812499e-45", + false, + 0x1p-148, + 0x1p-148, + 0x1p-148, + 0x1.8p-148, + false, + 0x1.3ffffffffffffp-148, + 0x1.4p-148, + 0x1.3ffffffffffffp-148, + 0x1.4p-148, + false, + 0x1.3ffffffffffffffep-148, + 0x1.4p-148, + 0x1.3ffffffffffffffep-148, + 0x1.4p-148, + false, + 0x1.3ffffffffffffffep-148, + 0x1.4p-148, + 0x1.3ffffffffffffffep-148, + 0x1.4p-148, + false, + 0x1.3fffffffffffffffffffffffff8p-148, + 0x1.4p-148, + 0x1.3fffffffffffffffffffffffff8p-148, + 0x1.4p-148, + false, + 0x1.3fffffffffffffffffffffffffffp-148, + 0x1.4p-148, + 0x1.3fffffffffffffffffffffffffffp-148, + 0x1.4p-148), + TEST ("3.5032461608120426773093239582247903282006548546912894293926" + "70709724477706714651503716595470905303955078125e-45", + false, + 0x1p-148, + 0x1p-148, + 0x1p-148, + 0x1.8p-148, + true, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4p-148, + true, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4p-148, + true, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4p-148, + true, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4p-148, + true, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4p-148), + TEST ("3.5032461608120426773093239582247903282006548546912894293926" + "7070972447770671465150371659547090530395507812501e-45", + false, + 0x1p-148, + 0x1.8p-148, + 0x1p-148, + 0x1.8p-148, + false, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4000000000001p-148, + false, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4000000000000002p-148, + false, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4000000000000002p-148, + false, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4p-148, + 0x1.400000000000000000000000008p-148, + false, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4p-148, + 0x1.4000000000000000000000000001p-148), + TEST ("-3.503246160812042677309323958224790328200654854691289429392" + "67070972447770671465150371659547090530395507812499e-45", + false, + -0x1.8p-148, + -0x1p-148, + -0x1p-148, + -0x1p-148, + false, + -0x1.4p-148, + -0x1.4p-148, + -0x1.3ffffffffffffp-148, + -0x1.3ffffffffffffp-148, + false, + -0x1.4p-148, + -0x1.4p-148, + -0x1.3ffffffffffffffep-148, + -0x1.3ffffffffffffffep-148, + false, + -0x1.4p-148, + -0x1.4p-148, + -0x1.3ffffffffffffffep-148, + -0x1.3ffffffffffffffep-148, + false, + -0x1.4p-148, + -0x1.4p-148, + -0x1.3fffffffffffffffffffffffff8p-148, + -0x1.3fffffffffffffffffffffffff8p-148, + false, + -0x1.4p-148, + -0x1.4p-148, + -0x1.3fffffffffffffffffffffffffffp-148, + -0x1.3fffffffffffffffffffffffffffp-148), + TEST ("-3.503246160812042677309323958224790328200654854691289429392" + "670709724477706714651503716595470905303955078125e-45", + false, + -0x1.8p-148, + -0x1p-148, + -0x1p-148, + -0x1p-148, + true, + -0x1.4p-148, + -0x1.4p-148, + -0x1.4p-148, + -0x1.4p-148, + true, + -0x1.4p-148, + -0x1.4p-148, + -0x1.4p-148, + -0x1.4p-148, + true, + -0x1.4p-148, + -0x1.4p-148, + -0x1.4p-148, + -0x1.4p-148, + true, + -0x1.4p-148, + -0x1.4p-148, + -0x1.4p-148, + -0x1.4p-148, + true, + -0x1.4p-148, + -0x1.4p-148, + -0x1.4p-148, + -0x1.4p-148), + TEST ("-3.503246160812042677309323958224790328200654854691289429392" + "67070972447770671465150371659547090530395507812501e-45", + false, + -0x1.8p-148, + -0x1.8p-148, + -0x1p-148, + -0x1p-148, + false, + -0x1.4000000000001p-148, + -0x1.4p-148, + -0x1.4p-148, + -0x1.4p-148, + false, + -0x1.4000000000000002p-148, + -0x1.4p-148, + -0x1.4p-148, + -0x1.4p-148, + false, + -0x1.4000000000000002p-148, + -0x1.4p-148, + -0x1.4p-148, + -0x1.4p-148, + false, + -0x1.400000000000000000000000008p-148, + -0x1.4p-148, + -0x1.4p-148, + -0x1.4p-148, + false, + -0x1.4000000000000000000000000001p-148, + -0x1.4p-148, + -0x1.4p-148, + -0x1.4p-148), + TEST ("7.4109846876186981626485318930233205854758970392148714663837" + "852375101326090531312779794975454245398856969484704316857659" + "638998506553390969459816219401617281718945106978546710679176" + "872575177347315553307795408549809608457500958111373034747658" + "096871009590975442271004757307809711118935784838675653998783" + "503015228055934046593739791790738723868299395818481660169122" + "019456499931289798411362062484498678713572180352209017023903" + "285791732520220528974020802906854021606612375549983402671300" + "035812486479041385743401875520901590172592547146296175134159" + "774938718574737870961645638908718119841271673056017045493004" + "705269590165763776884908267986972573366521765567941072508764" + "337560846003984904972149117463085539556354188641513168478436" + "31308023759629577398300170898437499e-324", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x4p-1076, + 0x4p-1076, + 0x4p-1076, + 0x8p-1076, + false, + 0x5.fffffffffffffff8p-1076, + 0x6p-1076, + 0x5.fffffffffffffff8p-1076, + 0x6p-1076, + false, + 0x5.fffffffffffffff8p-1076, + 0x6p-1076, + 0x5.fffffffffffffff8p-1076, + 0x6p-1076, + false, + 0x4p-1076, + 0x4p-1076, + 0x4p-1076, + 0x8p-1076, + false, + 0x5.fffffffffffffffffffffffffffcp-1076, + 0x6p-1076, + 0x5.fffffffffffffffffffffffffffcp-1076, + 0x6p-1076), + TEST ("7.4109846876186981626485318930233205854758970392148714663837" + "852375101326090531312779794975454245398856969484704316857659" + "638998506553390969459816219401617281718945106978546710679176" + "872575177347315553307795408549809608457500958111373034747658" + "096871009590975442271004757307809711118935784838675653998783" + "503015228055934046593739791790738723868299395818481660169122" + "019456499931289798411362062484498678713572180352209017023903" + "285791732520220528974020802906854021606612375549983402671300" + "035812486479041385743401875520901590172592547146296175134159" + "774938718574737870961645638908718119841271673056017045493004" + "705269590165763776884908267986972573366521765567941072508764" + "337560846003984904972149117463085539556354188641513168478436" + "313080237596295773983001708984375e-324", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x4p-1076, + 0x8p-1076, + 0x4p-1076, + 0x8p-1076, + true, + 0x6p-1076, + 0x6p-1076, + 0x6p-1076, + 0x6p-1076, + true, + 0x6p-1076, + 0x6p-1076, + 0x6p-1076, + 0x6p-1076, + false, + 0x4p-1076, + 0x8p-1076, + 0x4p-1076, + 0x8p-1076, + true, + 0x6p-1076, + 0x6p-1076, + 0x6p-1076, + 0x6p-1076), + TEST ("7.4109846876186981626485318930233205854758970392148714663837" + "852375101326090531312779794975454245398856969484704316857659" + "638998506553390969459816219401617281718945106978546710679176" + "872575177347315553307795408549809608457500958111373034747658" + "096871009590975442271004757307809711118935784838675653998783" + "503015228055934046593739791790738723868299395818481660169122" + "019456499931289798411362062484498678713572180352209017023903" + "285791732520220528974020802906854021606612375549983402671300" + "035812486479041385743401875520901590172592547146296175134159" + "774938718574737870961645638908718119841271673056017045493004" + "705269590165763776884908267986972573366521765567941072508764" + "337560846003984904972149117463085539556354188641513168478436" + "31308023759629577398300170898437501e-324", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x4p-1076, + 0x8p-1076, + 0x4p-1076, + 0x8p-1076, + false, + 0x6p-1076, + 0x6p-1076, + 0x6p-1076, + 0x6.0000000000000008p-1076, + false, + 0x6p-1076, + 0x6p-1076, + 0x6p-1076, + 0x6.0000000000000008p-1076, + false, + 0x4p-1076, + 0x8p-1076, + 0x4p-1076, + 0x8p-1076, + false, + 0x6p-1076, + 0x6p-1076, + 0x6p-1076, + 0x6.0000000000000000000000000004p-1076), + TEST ("-7.410984687618698162648531893023320585475897039214871466383" + "785237510132609053131277979497545424539885696948470431685765" + "963899850655339096945981621940161728171894510697854671067917" + "687257517734731555330779540854980960845750095811137303474765" + "809687100959097544227100475730780971111893578483867565399878" + "350301522805593404659373979179073872386829939581848166016912" + "201945649993128979841136206248449867871357218035220901702390" + "328579173252022052897402080290685402160661237554998340267130" + "003581248647904138574340187552090159017259254714629617513415" + "977493871857473787096164563890871811984127167305601704549300" + "470526959016576377688490826798697257336652176556794107250876" + "433756084600398490497214911746308553955635418864151316847843" + "631308023759629577398300170898437499e-324", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x8p-1076, + -0x4p-1076, + -0x4p-1076, + -0x4p-1076, + false, + -0x6p-1076, + -0x6p-1076, + -0x5.fffffffffffffff8p-1076, + -0x5.fffffffffffffff8p-1076, + false, + -0x6p-1076, + -0x6p-1076, + -0x5.fffffffffffffff8p-1076, + -0x5.fffffffffffffff8p-1076, + false, + -0x8p-1076, + -0x4p-1076, + -0x4p-1076, + -0x4p-1076, + false, + -0x6p-1076, + -0x6p-1076, + -0x5.fffffffffffffffffffffffffffcp-1076, + -0x5.fffffffffffffffffffffffffffcp-1076), + TEST ("-7.410984687618698162648531893023320585475897039214871466383" + "785237510132609053131277979497545424539885696948470431685765" + "963899850655339096945981621940161728171894510697854671067917" + "687257517734731555330779540854980960845750095811137303474765" + "809687100959097544227100475730780971111893578483867565399878" + "350301522805593404659373979179073872386829939581848166016912" + "201945649993128979841136206248449867871357218035220901702390" + "328579173252022052897402080290685402160661237554998340267130" + "003581248647904138574340187552090159017259254714629617513415" + "977493871857473787096164563890871811984127167305601704549300" + "470526959016576377688490826798697257336652176556794107250876" + "433756084600398490497214911746308553955635418864151316847843" + "6313080237596295773983001708984375e-324", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x8p-1076, + -0x8p-1076, + -0x4p-1076, + -0x4p-1076, + true, + -0x6p-1076, + -0x6p-1076, + -0x6p-1076, + -0x6p-1076, + true, + -0x6p-1076, + -0x6p-1076, + -0x6p-1076, + -0x6p-1076, + false, + -0x8p-1076, + -0x8p-1076, + -0x4p-1076, + -0x4p-1076, + true, + -0x6p-1076, + -0x6p-1076, + -0x6p-1076, + -0x6p-1076), + TEST ("-7.410984687618698162648531893023320585475897039214871466383" + "785237510132609053131277979497545424539885696948470431685765" + "963899850655339096945981621940161728171894510697854671067917" + "687257517734731555330779540854980960845750095811137303474765" + "809687100959097544227100475730780971111893578483867565399878" + "350301522805593404659373979179073872386829939581848166016912" + "201945649993128979841136206248449867871357218035220901702390" + "328579173252022052897402080290685402160661237554998340267130" + "003581248647904138574340187552090159017259254714629617513415" + "977493871857473787096164563890871811984127167305601704549300" + "470526959016576377688490826798697257336652176556794107250876" + "433756084600398490497214911746308553955635418864151316847843" + "631308023759629577398300170898437501e-324", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x8p-1076, + -0x8p-1076, + -0x4p-1076, + -0x4p-1076, + false, + -0x6.0000000000000008p-1076, + -0x6p-1076, + -0x6p-1076, + -0x6p-1076, + false, + -0x6.0000000000000008p-1076, + -0x6p-1076, + -0x6p-1076, + -0x6p-1076, + false, + -0x8p-1076, + -0x8p-1076, + -0x4p-1076, + -0x4p-1076, + false, + -0x6.0000000000000000000000000004p-1076, + -0x6p-1076, + -0x6p-1076, + -0x6p-1076), + TEST ("5.4677992978237119037926089004291297245985762235403450155814" + "707305425575329500966052143410629387408077958710210208052966" + "529504784489330482549602621133847135082257338717668975178538" + "378957084503396349323438489751160934104796903302909028868611" + "999312592165232778075745690821530731336739429587895774023213" + "939331012985331912661021188896306095323395084578542200319963" + "179359407180003251440084380484161504585462684082946932782829" + "488183829817567452314437076943950532707791252404699268678810" + "198502871250235796855577909830559749628817599194837522029036" + "891995648803056846354520653635957919882905363521007017169741" + "463296044392266269433408052686419017699718627761948763856040" + "592690841721239300491445991666051031755802326720329666454066" + "568630314348735511753639418257984253319063825247065727664852" + "328745422305642626091617823968872438962470092440688372515677" + "832232712866924800106797113478024083516199991991274936894113" + "006233377518471389394984262004503058455485659100090665241525" + "454803628182902241401701783637353179296850056973639305945938" + "813428953287892593620291195986011128990061888798763718548789" + "025717537674780281005583347165047846045925077914824515331335" + "131286063574407181821236377907693209224423490663289916878620" + "725507793163931390372011875799729330162278748985052557432333" + "005334989519381566364065326138465761456173231416844807264090" + "741841972247545424908843928136253653308813487994328446248389" + "608261444391573619177442907290731163188581917588219420107047" + "265367485141413919810885909689112244064797106324295291545892" + "937991321479061743491490060940946128274533657682130125169586" + "930571899403551122506297763180795732325134340989331155893724" + "289358918212707392997768032299997207208451112971425779939507" + "837165263255764268971211819536322993221774123134726665579460" + "265871378186589562858761835613344584269098062275786969729830" + "545786485401407774313414954958161677096004701941411411592755" + "485864471870515173326244464631295701572087440183178339987662" + "926763241220698078822661709054601073523477544653542795020468" + "256078409306409100874886828781860529824879343987945751252081" + "314345990313550683792348814627862441324030155730592166581251" + "009922787324590431548734575328663628650380722603024383412564" + "651446272117561042207738413114131099731016728935023152239431" + "311619533848376583687509108453086730196255111695352464186678" + "221927564757730319825223049341618853631333478241227227268084" + "583396688436229936266854011427192767039363517491659523133852" + "472534104124441112346615696891097070121463652258681270378076" + "538381697594264658479637863087159293838880752928175545408262" + "813403793568695416998388572304528748824756265665683890518422" + "696169422338806137532304784682662448207928681740476188343739" + "117833525916386815135793034906806117413105008719197882837614" + "738262050320291539494104952056471606645482046176634075459021" + "552555959590354956262127809953013679512507451424271839221946" + "794056861055980558363033732905772356986051180966474116423192" + "194741572438649215204229781279620370445373851348786918527399" + "785630808242657122705381806661616271132182017797793661244078" + "445747547535623384548769818529655539279036503234072455810991" + "588075181817695975173110136482659854557506203058080551018873" + "203138260451109855100526720073566126209666125604482413705611" + "996796777927332827103568863352291499261312290355143742018042" + "254470707107847293593205234049774839191754781030496978091006" + "099559675240966730110167624903610656473267105556155633783594" + "089546261107653110531808279445757724399186120387548675148632" + "176049190701680305210224388072261974806791922636412897526952" + "793677946622674149577084803568051242934076450942927092705684" + "547042915490323112457971853658760725588190377666477106903106" + "693847278847646032201293023329503348730723947218797410452333" + "910847913892827195814551858335519518939031446093385329182820" + "714173657946661746005901866885589732922652604573972842197231" + "187365263381958925227970038358064987248233271706462687651143" + "350472018043321314534759819524203308490914358596886150053406" + "629512434788155355109100540319857813535695923273426256911552" + "977539394209918630668466632881929661971212772444625151371953" + "428875491139683919687008724010475217255347915698820960215217" + "257390308560235323463096946442080548018754166369706161589705" + "215873687166365628787796501470056870127729464714362172216802" + "441045276911597009443281135389729130222603185665646434661947" + "627628077723219376892727386120519287577405410510114936151502" + "752997122750262781911372625997223415283516995479265631485799" + "456782561734766648462849641064097181818204279498552827825384" + "186202065516999362573388136163077477126602169410435905014077" + "049808497409025369325795765272066650278004200357878990911374" + "982857977108488482528354406313893864211497105765030504600982" + "253488805474531798742143374465080240030582370086699167937651" + "038307909706139327119325418854546478285735654541635477790346" + "964782617354265050767878335230272194896680141986745074630225" + "893106573559558843545841186025169531604151588481389164948914" + "823593944287133336263680358191369540321930649824471425485137" + "777984823525402115151171093313613251350685343824859052220126" + "891551966018355920872775724807128769003243129486808733796350" + "497668255116485157191011858830643898323628223472099280243583" + "164434348347014910398004439821970508280440872759395827943270" + "985008769143562351938091476215083548164137333541883808870019" + "116234099013452929807950151652297436436006149684939775781234" + "660954156154478642694176038524277810483833149798681345708089" + "152179193979463169402340611793486272301808073267534612685593" + "859596787866884211031341417903391749825320454663508370385251" + "831778477311017089729361152161928815389818579983544490982891" + "734081131312309744330960666031291451740885503458543884956367" + "654943799264600314531815427932691107874782328654759293575803" + "481929361961781073958502075438499070633193799699311694287183" + "299423475339817655608058724723221867087563064557636112380829" + "514501382073257737022472866608244164310385205213523702910787" + "182472517125030106491031844871593141759729773907719510044049" + "352857426592936763727969496103940591601975078602859660478614" + "119405428212830134490731706220583788265344728818766885126977" + "588151111984290444321648931907188080336064713873288834096229" + "203276676119810521851726133377700616341304257822975788967472" + "152742255041912584197045423031298506219011800240120182445838" + "590696647416285334515631019799007515682004250060857020904012" + "215375170479800482680554499806010766109655061507421747722461" + "180617361402575082294678925605271083587897845390768226405648" + "508518103525778638618195775128516073959272990148239415346263" + "486966573934577450787243667063244378381883115827207605856174" + "876350045086885320626669331311880593775916269643646395423220" + "549940790476989709243027420158390806135690975149384714684219" + "964938182719962913931464979458639185519531490009437619838306" + "362365453754807654884704163490469296444427144778593725687358" + "437087390151990694667516279202024332494828210657618261952038" + "597230263799412584275851667403910657370879707181053365818502" + "680037431560091209982641738995652793235851569372314130107647" + "166085235615697257094269133100914135783178856280392139325001" + "352841718610484616627448189556913621837791650699820323059708" + "766420810133584841826718631681683381743511974264126250984214" + "812397119978273917903889865891718836792263377888052458189238" + "746074986456016681098722869419588274020181430652732817858728" + "473849369539367463917171317324882099804999043054467247785592" + "038464723442276239896066431580123756428540074945472427752568" + "981171400621705853374875885943072600692576914790467205905272" + "372594740187988081900317493185005142913607163380720069786786" + "782095331840893694073778325119471833528492917081008547303414" + "509381563617864195257751546539575461435803625993888325647883" + "541039192368366987400263049681218831477776345118518503709588" + "840859023379762456561030683928115349942393963185677123055324" + "771693784214924931737043793679546051454845624150270955450608" + "318747395755728950832754611277041359602301205138509175543313" + "522772786504141007552691902249572375175731740923618769197304" + "652898352694386665448260033458575323252814233868098279476166" + "764258284911434288072243178941698347365985427696983129579496" + "059032032841281149923518087084876885114369033227736521245740" + "554711771423492719899982357711910225545480424688322195336240" + "492253136281857837808491795993788199125205555222116581071134" + "476787468430539307909617442106685159519071053844987343666452" + "494280317720153567054364117244775141336558406098548803924509" + "496052261825198043140272655303625315605326569530252885854991" + "822289219201218313590745412010446642247111703901991591338062" + "693320157180618736569439969283245279430312651192668788340033" + "626825194260296262959884258597703584888770801961209652822982" + "322376122303586169861685106043820510444293432856251210395693" + "261264867823980172683352796141772210301725997652373804152525" + "037162852291403804455997331367378463632437773242905518075065" + "414724295857460288225400061608664961649196400079359622673770" + "607898395269075056596627116148289491042491764170924014885106" + "158235482774778418134123293974436877051995673618683751115353" + "808771434984204447736174758316063096245047311279841579995578" + "186609402864244042751443128536278453430633423118662852688374" + "229600894418958824842459450540826176452145829389286103522774" + "101195556029650753254244433565937938526828990893149766298997" + "738359913887178888607190765709867052470880785937935110091424" + "743449966353497865681753841380246075612094033617488674676296" + "822570077027076266879557913673839341012099558043806442348798" + "053951239274913334631522409564461770434875790402230022872647" + "568436177018658068697071731879399180374560963492726714528729" + "224208938589940272515747888379118461617702271694075087419634" + "147298076764775745707026934442908236664400557265527951453482" + "191684597674273691978253678690951178777239573925410438679099" + "374700609973920128201422381329108236575369403675960765238333" + "778127017096574296148321075566959285042221837159799800133563" + "239963969638610872680393210300180152020613051613414547163713" + "772512617757277955979895866367571776456268564191092477027650" + "135832200376440239783726540552694851717269598489288851529660" + "975027775639565229734596726205832668434979354541943345062977" + "891187146561050118118108223323735210843681128615413601091222" + "007912350536959777114306541514511332368936078560929788143798" + "814391221507522370648646767364209132147312407014953113532379" + "838195728491128536978285918066991040993153064356179903885952" + "027952713749653604502053512355449916680887234238773855581636" + "172479594866871765094513940103284167914110196720261110812716" + "776424260154507395050380575452850420730818412994731079307343" + "538376880280124019321040198038723558784544408584344466090982" + "802067326529000931562048932875469079874956595180595395347093" + "285140279165467965596318365749701535812384333240968283640721" + "344003442002691613772056762099098025739332715913970186225176" + "459563484134139746647940170537900275350480490468851439300771" + "949915194703080576611022590670399844931867609777417528903454" + "731922206378932141464755402629420074293816349270038351339419" + "146768473851353171629153912238797141905920143036064131705230" + "421762305232861503856799511155936565169005916711845389135580" + "928162511912438531204156138447775120789548666143600293412065" + "767167106888509172568003530668539460588248316513392652567856" + "224602697296203328920073354425994044956624831346979458846837" + "597950064151867164583749203433942592178528868981311575331848" + "941597492470436782387502687532649093096498315347403977436001" + "399982102030846763698994785054617523241463186980898394504211" + "430763617825306895065661536045431497903759118007934839122881" + "885863091769469883539876840543521295706315919855784493235603" + "866268925981702690270202829595794350800918257913991744455922" + "683343374046671669930219650268554687499e-4951", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x8p-16448, + 0x8p-16448, + 0x8p-16448, + 0x1p-16444, + false, + 0x8p-16448, + 0xcp-16448, + 0x8p-16448, + 0xcp-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0xb.fffffffffffcp-16448, + 0xcp-16448, + 0xb.fffffffffffcp-16448, + 0xcp-16448), + TEST ("5.4677992978237119037926089004291297245985762235403450155814" + "707305425575329500966052143410629387408077958710210208052966" + "529504784489330482549602621133847135082257338717668975178538" + "378957084503396349323438489751160934104796903302909028868611" + "999312592165232778075745690821530731336739429587895774023213" + "939331012985331912661021188896306095323395084578542200319963" + "179359407180003251440084380484161504585462684082946932782829" + "488183829817567452314437076943950532707791252404699268678810" + "198502871250235796855577909830559749628817599194837522029036" + "891995648803056846354520653635957919882905363521007017169741" + "463296044392266269433408052686419017699718627761948763856040" + "592690841721239300491445991666051031755802326720329666454066" + "568630314348735511753639418257984253319063825247065727664852" + "328745422305642626091617823968872438962470092440688372515677" + "832232712866924800106797113478024083516199991991274936894113" + "006233377518471389394984262004503058455485659100090665241525" + "454803628182902241401701783637353179296850056973639305945938" + "813428953287892593620291195986011128990061888798763718548789" + "025717537674780281005583347165047846045925077914824515331335" + "131286063574407181821236377907693209224423490663289916878620" + "725507793163931390372011875799729330162278748985052557432333" + "005334989519381566364065326138465761456173231416844807264090" + "741841972247545424908843928136253653308813487994328446248389" + "608261444391573619177442907290731163188581917588219420107047" + "265367485141413919810885909689112244064797106324295291545892" + "937991321479061743491490060940946128274533657682130125169586" + "930571899403551122506297763180795732325134340989331155893724" + "289358918212707392997768032299997207208451112971425779939507" + "837165263255764268971211819536322993221774123134726665579460" + "265871378186589562858761835613344584269098062275786969729830" + "545786485401407774313414954958161677096004701941411411592755" + "485864471870515173326244464631295701572087440183178339987662" + "926763241220698078822661709054601073523477544653542795020468" + "256078409306409100874886828781860529824879343987945751252081" + "314345990313550683792348814627862441324030155730592166581251" + "009922787324590431548734575328663628650380722603024383412564" + "651446272117561042207738413114131099731016728935023152239431" + "311619533848376583687509108453086730196255111695352464186678" + "221927564757730319825223049341618853631333478241227227268084" + "583396688436229936266854011427192767039363517491659523133852" + "472534104124441112346615696891097070121463652258681270378076" + "538381697594264658479637863087159293838880752928175545408262" + "813403793568695416998388572304528748824756265665683890518422" + "696169422338806137532304784682662448207928681740476188343739" + "117833525916386815135793034906806117413105008719197882837614" + "738262050320291539494104952056471606645482046176634075459021" + "552555959590354956262127809953013679512507451424271839221946" + "794056861055980558363033732905772356986051180966474116423192" + "194741572438649215204229781279620370445373851348786918527399" + "785630808242657122705381806661616271132182017797793661244078" + "445747547535623384548769818529655539279036503234072455810991" + "588075181817695975173110136482659854557506203058080551018873" + "203138260451109855100526720073566126209666125604482413705611" + "996796777927332827103568863352291499261312290355143742018042" + "254470707107847293593205234049774839191754781030496978091006" + "099559675240966730110167624903610656473267105556155633783594" + "089546261107653110531808279445757724399186120387548675148632" + "176049190701680305210224388072261974806791922636412897526952" + "793677946622674149577084803568051242934076450942927092705684" + "547042915490323112457971853658760725588190377666477106903106" + "693847278847646032201293023329503348730723947218797410452333" + "910847913892827195814551858335519518939031446093385329182820" + "714173657946661746005901866885589732922652604573972842197231" + "187365263381958925227970038358064987248233271706462687651143" + "350472018043321314534759819524203308490914358596886150053406" + "629512434788155355109100540319857813535695923273426256911552" + "977539394209918630668466632881929661971212772444625151371953" + "428875491139683919687008724010475217255347915698820960215217" + "257390308560235323463096946442080548018754166369706161589705" + "215873687166365628787796501470056870127729464714362172216802" + "441045276911597009443281135389729130222603185665646434661947" + "627628077723219376892727386120519287577405410510114936151502" + "752997122750262781911372625997223415283516995479265631485799" + "456782561734766648462849641064097181818204279498552827825384" + "186202065516999362573388136163077477126602169410435905014077" + "049808497409025369325795765272066650278004200357878990911374" + "982857977108488482528354406313893864211497105765030504600982" + "253488805474531798742143374465080240030582370086699167937651" + "038307909706139327119325418854546478285735654541635477790346" + "964782617354265050767878335230272194896680141986745074630225" + "893106573559558843545841186025169531604151588481389164948914" + "823593944287133336263680358191369540321930649824471425485137" + "777984823525402115151171093313613251350685343824859052220126" + "891551966018355920872775724807128769003243129486808733796350" + "497668255116485157191011858830643898323628223472099280243583" + "164434348347014910398004439821970508280440872759395827943270" + "985008769143562351938091476215083548164137333541883808870019" + "116234099013452929807950151652297436436006149684939775781234" + "660954156154478642694176038524277810483833149798681345708089" + "152179193979463169402340611793486272301808073267534612685593" + "859596787866884211031341417903391749825320454663508370385251" + "831778477311017089729361152161928815389818579983544490982891" + "734081131312309744330960666031291451740885503458543884956367" + "654943799264600314531815427932691107874782328654759293575803" + "481929361961781073958502075438499070633193799699311694287183" + "299423475339817655608058724723221867087563064557636112380829" + "514501382073257737022472866608244164310385205213523702910787" + "182472517125030106491031844871593141759729773907719510044049" + "352857426592936763727969496103940591601975078602859660478614" + "119405428212830134490731706220583788265344728818766885126977" + "588151111984290444321648931907188080336064713873288834096229" + "203276676119810521851726133377700616341304257822975788967472" + "152742255041912584197045423031298506219011800240120182445838" + "590696647416285334515631019799007515682004250060857020904012" + "215375170479800482680554499806010766109655061507421747722461" + "180617361402575082294678925605271083587897845390768226405648" + "508518103525778638618195775128516073959272990148239415346263" + "486966573934577450787243667063244378381883115827207605856174" + "876350045086885320626669331311880593775916269643646395423220" + "549940790476989709243027420158390806135690975149384714684219" + "964938182719962913931464979458639185519531490009437619838306" + "362365453754807654884704163490469296444427144778593725687358" + "437087390151990694667516279202024332494828210657618261952038" + "597230263799412584275851667403910657370879707181053365818502" + "680037431560091209982641738995652793235851569372314130107647" + "166085235615697257094269133100914135783178856280392139325001" + "352841718610484616627448189556913621837791650699820323059708" + "766420810133584841826718631681683381743511974264126250984214" + "812397119978273917903889865891718836792263377888052458189238" + "746074986456016681098722869419588274020181430652732817858728" + "473849369539367463917171317324882099804999043054467247785592" + "038464723442276239896066431580123756428540074945472427752568" + "981171400621705853374875885943072600692576914790467205905272" + "372594740187988081900317493185005142913607163380720069786786" + "782095331840893694073778325119471833528492917081008547303414" + "509381563617864195257751546539575461435803625993888325647883" + "541039192368366987400263049681218831477776345118518503709588" + "840859023379762456561030683928115349942393963185677123055324" + "771693784214924931737043793679546051454845624150270955450608" + "318747395755728950832754611277041359602301205138509175543313" + "522772786504141007552691902249572375175731740923618769197304" + "652898352694386665448260033458575323252814233868098279476166" + "764258284911434288072243178941698347365985427696983129579496" + "059032032841281149923518087084876885114369033227736521245740" + "554711771423492719899982357711910225545480424688322195336240" + "492253136281857837808491795993788199125205555222116581071134" + "476787468430539307909617442106685159519071053844987343666452" + "494280317720153567054364117244775141336558406098548803924509" + "496052261825198043140272655303625315605326569530252885854991" + "822289219201218313590745412010446642247111703901991591338062" + "693320157180618736569439969283245279430312651192668788340033" + "626825194260296262959884258597703584888770801961209652822982" + "322376122303586169861685106043820510444293432856251210395693" + "261264867823980172683352796141772210301725997652373804152525" + "037162852291403804455997331367378463632437773242905518075065" + "414724295857460288225400061608664961649196400079359622673770" + "607898395269075056596627116148289491042491764170924014885106" + "158235482774778418134123293974436877051995673618683751115353" + "808771434984204447736174758316063096245047311279841579995578" + "186609402864244042751443128536278453430633423118662852688374" + "229600894418958824842459450540826176452145829389286103522774" + "101195556029650753254244433565937938526828990893149766298997" + "738359913887178888607190765709867052470880785937935110091424" + "743449966353497865681753841380246075612094033617488674676296" + "822570077027076266879557913673839341012099558043806442348798" + "053951239274913334631522409564461770434875790402230022872647" + "568436177018658068697071731879399180374560963492726714528729" + "224208938589940272515747888379118461617702271694075087419634" + "147298076764775745707026934442908236664400557265527951453482" + "191684597674273691978253678690951178777239573925410438679099" + "374700609973920128201422381329108236575369403675960765238333" + "778127017096574296148321075566959285042221837159799800133563" + "239963969638610872680393210300180152020613051613414547163713" + "772512617757277955979895866367571776456268564191092477027650" + "135832200376440239783726540552694851717269598489288851529660" + "975027775639565229734596726205832668434979354541943345062977" + "891187146561050118118108223323735210843681128615413601091222" + "007912350536959777114306541514511332368936078560929788143798" + "814391221507522370648646767364209132147312407014953113532379" + "838195728491128536978285918066991040993153064356179903885952" + "027952713749653604502053512355449916680887234238773855581636" + "172479594866871765094513940103284167914110196720261110812716" + "776424260154507395050380575452850420730818412994731079307343" + "538376880280124019321040198038723558784544408584344466090982" + "802067326529000931562048932875469079874956595180595395347093" + "285140279165467965596318365749701535812384333240968283640721" + "344003442002691613772056762099098025739332715913970186225176" + "459563484134139746647940170537900275350480490468851439300771" + "949915194703080576611022590670399844931867609777417528903454" + "731922206378932141464755402629420074293816349270038351339419" + "146768473851353171629153912238797141905920143036064131705230" + "421762305232861503856799511155936565169005916711845389135580" + "928162511912438531204156138447775120789548666143600293412065" + "767167106888509172568003530668539460588248316513392652567856" + "224602697296203328920073354425994044956624831346979458846837" + "597950064151867164583749203433942592178528868981311575331848" + "941597492470436782387502687532649093096498315347403977436001" + "399982102030846763698994785054617523241463186980898394504211" + "430763617825306895065661536045431497903759118007934839122881" + "885863091769469883539876840543521295706315919855784493235603" + "866268925981702690270202829595794350800918257913991744455922" + "6833433740466716699302196502685546875e-4951", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x8p-16448, + 0x1p-16444, + 0x8p-16448, + 0x1p-16444, + true, + 0xcp-16448, + 0xcp-16448, + 0xcp-16448, + 0xcp-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + true, + 0xcp-16448, + 0xcp-16448, + 0xcp-16448, + 0xcp-16448), + TEST ("5.4677992978237119037926089004291297245985762235403450155814" + "707305425575329500966052143410629387408077958710210208052966" + "529504784489330482549602621133847135082257338717668975178538" + "378957084503396349323438489751160934104796903302909028868611" + "999312592165232778075745690821530731336739429587895774023213" + "939331012985331912661021188896306095323395084578542200319963" + "179359407180003251440084380484161504585462684082946932782829" + "488183829817567452314437076943950532707791252404699268678810" + "198502871250235796855577909830559749628817599194837522029036" + "891995648803056846354520653635957919882905363521007017169741" + "463296044392266269433408052686419017699718627761948763856040" + "592690841721239300491445991666051031755802326720329666454066" + "568630314348735511753639418257984253319063825247065727664852" + "328745422305642626091617823968872438962470092440688372515677" + "832232712866924800106797113478024083516199991991274936894113" + "006233377518471389394984262004503058455485659100090665241525" + "454803628182902241401701783637353179296850056973639305945938" + "813428953287892593620291195986011128990061888798763718548789" + "025717537674780281005583347165047846045925077914824515331335" + "131286063574407181821236377907693209224423490663289916878620" + "725507793163931390372011875799729330162278748985052557432333" + "005334989519381566364065326138465761456173231416844807264090" + "741841972247545424908843928136253653308813487994328446248389" + "608261444391573619177442907290731163188581917588219420107047" + "265367485141413919810885909689112244064797106324295291545892" + "937991321479061743491490060940946128274533657682130125169586" + "930571899403551122506297763180795732325134340989331155893724" + "289358918212707392997768032299997207208451112971425779939507" + "837165263255764268971211819536322993221774123134726665579460" + "265871378186589562858761835613344584269098062275786969729830" + "545786485401407774313414954958161677096004701941411411592755" + "485864471870515173326244464631295701572087440183178339987662" + "926763241220698078822661709054601073523477544653542795020468" + "256078409306409100874886828781860529824879343987945751252081" + "314345990313550683792348814627862441324030155730592166581251" + "009922787324590431548734575328663628650380722603024383412564" + "651446272117561042207738413114131099731016728935023152239431" + "311619533848376583687509108453086730196255111695352464186678" + "221927564757730319825223049341618853631333478241227227268084" + "583396688436229936266854011427192767039363517491659523133852" + "472534104124441112346615696891097070121463652258681270378076" + "538381697594264658479637863087159293838880752928175545408262" + "813403793568695416998388572304528748824756265665683890518422" + "696169422338806137532304784682662448207928681740476188343739" + "117833525916386815135793034906806117413105008719197882837614" + "738262050320291539494104952056471606645482046176634075459021" + "552555959590354956262127809953013679512507451424271839221946" + "794056861055980558363033732905772356986051180966474116423192" + "194741572438649215204229781279620370445373851348786918527399" + "785630808242657122705381806661616271132182017797793661244078" + "445747547535623384548769818529655539279036503234072455810991" + "588075181817695975173110136482659854557506203058080551018873" + "203138260451109855100526720073566126209666125604482413705611" + "996796777927332827103568863352291499261312290355143742018042" + "254470707107847293593205234049774839191754781030496978091006" + "099559675240966730110167624903610656473267105556155633783594" + "089546261107653110531808279445757724399186120387548675148632" + "176049190701680305210224388072261974806791922636412897526952" + "793677946622674149577084803568051242934076450942927092705684" + "547042915490323112457971853658760725588190377666477106903106" + "693847278847646032201293023329503348730723947218797410452333" + "910847913892827195814551858335519518939031446093385329182820" + "714173657946661746005901866885589732922652604573972842197231" + "187365263381958925227970038358064987248233271706462687651143" + "350472018043321314534759819524203308490914358596886150053406" + "629512434788155355109100540319857813535695923273426256911552" + "977539394209918630668466632881929661971212772444625151371953" + "428875491139683919687008724010475217255347915698820960215217" + "257390308560235323463096946442080548018754166369706161589705" + "215873687166365628787796501470056870127729464714362172216802" + "441045276911597009443281135389729130222603185665646434661947" + "627628077723219376892727386120519287577405410510114936151502" + "752997122750262781911372625997223415283516995479265631485799" + "456782561734766648462849641064097181818204279498552827825384" + "186202065516999362573388136163077477126602169410435905014077" + "049808497409025369325795765272066650278004200357878990911374" + "982857977108488482528354406313893864211497105765030504600982" + "253488805474531798742143374465080240030582370086699167937651" + "038307909706139327119325418854546478285735654541635477790346" + "964782617354265050767878335230272194896680141986745074630225" + "893106573559558843545841186025169531604151588481389164948914" + "823593944287133336263680358191369540321930649824471425485137" + "777984823525402115151171093313613251350685343824859052220126" + "891551966018355920872775724807128769003243129486808733796350" + "497668255116485157191011858830643898323628223472099280243583" + "164434348347014910398004439821970508280440872759395827943270" + "985008769143562351938091476215083548164137333541883808870019" + "116234099013452929807950151652297436436006149684939775781234" + "660954156154478642694176038524277810483833149798681345708089" + "152179193979463169402340611793486272301808073267534612685593" + "859596787866884211031341417903391749825320454663508370385251" + "831778477311017089729361152161928815389818579983544490982891" + "734081131312309744330960666031291451740885503458543884956367" + "654943799264600314531815427932691107874782328654759293575803" + "481929361961781073958502075438499070633193799699311694287183" + "299423475339817655608058724723221867087563064557636112380829" + "514501382073257737022472866608244164310385205213523702910787" + "182472517125030106491031844871593141759729773907719510044049" + "352857426592936763727969496103940591601975078602859660478614" + "119405428212830134490731706220583788265344728818766885126977" + "588151111984290444321648931907188080336064713873288834096229" + "203276676119810521851726133377700616341304257822975788967472" + "152742255041912584197045423031298506219011800240120182445838" + "590696647416285334515631019799007515682004250060857020904012" + "215375170479800482680554499806010766109655061507421747722461" + "180617361402575082294678925605271083587897845390768226405648" + "508518103525778638618195775128516073959272990148239415346263" + "486966573934577450787243667063244378381883115827207605856174" + "876350045086885320626669331311880593775916269643646395423220" + "549940790476989709243027420158390806135690975149384714684219" + "964938182719962913931464979458639185519531490009437619838306" + "362365453754807654884704163490469296444427144778593725687358" + "437087390151990694667516279202024332494828210657618261952038" + "597230263799412584275851667403910657370879707181053365818502" + "680037431560091209982641738995652793235851569372314130107647" + "166085235615697257094269133100914135783178856280392139325001" + "352841718610484616627448189556913621837791650699820323059708" + "766420810133584841826718631681683381743511974264126250984214" + "812397119978273917903889865891718836792263377888052458189238" + "746074986456016681098722869419588274020181430652732817858728" + "473849369539367463917171317324882099804999043054467247785592" + "038464723442276239896066431580123756428540074945472427752568" + "981171400621705853374875885943072600692576914790467205905272" + "372594740187988081900317493185005142913607163380720069786786" + "782095331840893694073778325119471833528492917081008547303414" + "509381563617864195257751546539575461435803625993888325647883" + "541039192368366987400263049681218831477776345118518503709588" + "840859023379762456561030683928115349942393963185677123055324" + "771693784214924931737043793679546051454845624150270955450608" + "318747395755728950832754611277041359602301205138509175543313" + "522772786504141007552691902249572375175731740923618769197304" + "652898352694386665448260033458575323252814233868098279476166" + "764258284911434288072243178941698347365985427696983129579496" + "059032032841281149923518087084876885114369033227736521245740" + "554711771423492719899982357711910225545480424688322195336240" + "492253136281857837808491795993788199125205555222116581071134" + "476787468430539307909617442106685159519071053844987343666452" + "494280317720153567054364117244775141336558406098548803924509" + "496052261825198043140272655303625315605326569530252885854991" + "822289219201218313590745412010446642247111703901991591338062" + "693320157180618736569439969283245279430312651192668788340033" + "626825194260296262959884258597703584888770801961209652822982" + "322376122303586169861685106043820510444293432856251210395693" + "261264867823980172683352796141772210301725997652373804152525" + "037162852291403804455997331367378463632437773242905518075065" + "414724295857460288225400061608664961649196400079359622673770" + "607898395269075056596627116148289491042491764170924014885106" + "158235482774778418134123293974436877051995673618683751115353" + "808771434984204447736174758316063096245047311279841579995578" + "186609402864244042751443128536278453430633423118662852688374" + "229600894418958824842459450540826176452145829389286103522774" + "101195556029650753254244433565937938526828990893149766298997" + "738359913887178888607190765709867052470880785937935110091424" + "743449966353497865681753841380246075612094033617488674676296" + "822570077027076266879557913673839341012099558043806442348798" + "053951239274913334631522409564461770434875790402230022872647" + "568436177018658068697071731879399180374560963492726714528729" + "224208938589940272515747888379118461617702271694075087419634" + "147298076764775745707026934442908236664400557265527951453482" + "191684597674273691978253678690951178777239573925410438679099" + "374700609973920128201422381329108236575369403675960765238333" + "778127017096574296148321075566959285042221837159799800133563" + "239963969638610872680393210300180152020613051613414547163713" + "772512617757277955979895866367571776456268564191092477027650" + "135832200376440239783726540552694851717269598489288851529660" + "975027775639565229734596726205832668434979354541943345062977" + "891187146561050118118108223323735210843681128615413601091222" + "007912350536959777114306541514511332368936078560929788143798" + "814391221507522370648646767364209132147312407014953113532379" + "838195728491128536978285918066991040993153064356179903885952" + "027952713749653604502053512355449916680887234238773855581636" + "172479594866871765094513940103284167914110196720261110812716" + "776424260154507395050380575452850420730818412994731079307343" + "538376880280124019321040198038723558784544408584344466090982" + "802067326529000931562048932875469079874956595180595395347093" + "285140279165467965596318365749701535812384333240968283640721" + "344003442002691613772056762099098025739332715913970186225176" + "459563484134139746647940170537900275350480490468851439300771" + "949915194703080576611022590670399844931867609777417528903454" + "731922206378932141464755402629420074293816349270038351339419" + "146768473851353171629153912238797141905920143036064131705230" + "421762305232861503856799511155936565169005916711845389135580" + "928162511912438531204156138447775120789548666143600293412065" + "767167106888509172568003530668539460588248316513392652567856" + "224602697296203328920073354425994044956624831346979458846837" + "597950064151867164583749203433942592178528868981311575331848" + "941597492470436782387502687532649093096498315347403977436001" + "399982102030846763698994785054617523241463186980898394504211" + "430763617825306895065661536045431497903759118007934839122881" + "885863091769469883539876840543521295706315919855784493235603" + "866268925981702690270202829595794350800918257913991744455922" + "683343374046671669930219650268554687501e-4951", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x8p-16448, + 0x1p-16444, + 0x8p-16448, + 0x1p-16444, + false, + 0xcp-16448, + 0xcp-16448, + 0xcp-16448, + 0x1p-16444, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0xcp-16448, + 0xcp-16448, + 0xcp-16448, + 0xc.000000000004p-16448), + TEST ("-5.467799297823711903792608900429129724598576223540345015581" + "470730542557532950096605214341062938740807795871021020805296" + "652950478448933048254960262113384713508225733871766897517853" + "837895708450339634932343848975116093410479690330290902886861" + "199931259216523277807574569082153073133673942958789577402321" + "393933101298533191266102118889630609532339508457854220031996" + "317935940718000325144008438048416150458546268408294693278282" + "948818382981756745231443707694395053270779125240469926867881" + "019850287125023579685557790983055974962881759919483752202903" + "689199564880305684635452065363595791988290536352100701716974" + "146329604439226626943340805268641901769971862776194876385604" + "059269084172123930049144599166605103175580232672032966645406" + "656863031434873551175363941825798425331906382524706572766485" + "232874542230564262609161782396887243896247009244068837251567" + "783223271286692480010679711347802408351619999199127493689411" + "300623337751847138939498426200450305845548565910009066524152" + "545480362818290224140170178363735317929685005697363930594593" + "881342895328789259362029119598601112899006188879876371854878" + "902571753767478028100558334716504784604592507791482451533133" + "513128606357440718182123637790769320922442349066328991687862" + "072550779316393139037201187579972933016227874898505255743233" + "300533498951938156636406532613846576145617323141684480726409" + "074184197224754542490884392813625365330881348799432844624838" + "960826144439157361917744290729073116318858191758821942010704" + "726536748514141391981088590968911224406479710632429529154589" + "293799132147906174349149006094094612827453365768213012516958" + "693057189940355112250629776318079573232513434098933115589372" + "428935891821270739299776803229999720720845111297142577993950" + "783716526325576426897121181953632299322177412313472666557946" + "026587137818658956285876183561334458426909806227578696972983" + "054578648540140777431341495495816167709600470194141141159275" + "548586447187051517332624446463129570157208744018317833998766" + "292676324122069807882266170905460107352347754465354279502046" + "825607840930640910087488682878186052982487934398794575125208" + "131434599031355068379234881462786244132403015573059216658125" + "100992278732459043154873457532866362865038072260302438341256" + "465144627211756104220773841311413109973101672893502315223943" + "131161953384837658368750910845308673019625511169535246418667" + "822192756475773031982522304934161885363133347824122722726808" + "458339668843622993626685401142719276703936351749165952313385" + "247253410412444111234661569689109707012146365225868127037807" + "653838169759426465847963786308715929383888075292817554540826" + "281340379356869541699838857230452874882475626566568389051842" + "269616942233880613753230478468266244820792868174047618834373" + "911783352591638681513579303490680611741310500871919788283761" + "473826205032029153949410495205647160664548204617663407545902" + "155255595959035495626212780995301367951250745142427183922194" + "679405686105598055836303373290577235698605118096647411642319" + "219474157243864921520422978127962037044537385134878691852739" + "978563080824265712270538180666161627113218201779779366124407" + "844574754753562338454876981852965553927903650323407245581099" + "158807518181769597517311013648265985455750620305808055101887" + "320313826045110985510052672007356612620966612560448241370561" + "199679677792733282710356886335229149926131229035514374201804" + "225447070710784729359320523404977483919175478103049697809100" + "609955967524096673011016762490361065647326710555615563378359" + "408954626110765311053180827944575772439918612038754867514863" + "217604919070168030521022438807226197480679192263641289752695" + "279367794662267414957708480356805124293407645094292709270568" + "454704291549032311245797185365876072558819037766647710690310" + "669384727884764603220129302332950334873072394721879741045233" + "391084791389282719581455185833551951893903144609338532918282" + "071417365794666174600590186688558973292265260457397284219723" + "118736526338195892522797003835806498724823327170646268765114" + "335047201804332131453475981952420330849091435859688615005340" + "662951243478815535510910054031985781353569592327342625691155" + "297753939420991863066846663288192966197121277244462515137195" + "342887549113968391968700872401047521725534791569882096021521" + "725739030856023532346309694644208054801875416636970616158970" + "521587368716636562878779650147005687012772946471436217221680" + "244104527691159700944328113538972913022260318566564643466194" + "762762807772321937689272738612051928757740541051011493615150" + "275299712275026278191137262599722341528351699547926563148579" + "945678256173476664846284964106409718181820427949855282782538" + "418620206551699936257338813616307747712660216941043590501407" + "704980849740902536932579576527206665027800420035787899091137" + "498285797710848848252835440631389386421149710576503050460098" + "225348880547453179874214337446508024003058237008669916793765" + "103830790970613932711932541885454647828573565454163547779034" + "696478261735426505076787833523027219489668014198674507463022" + "589310657355955884354584118602516953160415158848138916494891" + "482359394428713333626368035819136954032193064982447142548513" + "777798482352540211515117109331361325135068534382485905222012" + "689155196601835592087277572480712876900324312948680873379635" + "049766825511648515719101185883064389832362822347209928024358" + "316443434834701491039800443982197050828044087275939582794327" + "098500876914356235193809147621508354816413733354188380887001" + "911623409901345292980795015165229743643600614968493977578123" + "466095415615447864269417603852427781048383314979868134570808" + "915217919397946316940234061179348627230180807326753461268559" + "385959678786688421103134141790339174982532045466350837038525" + "183177847731101708972936115216192881538981857998354449098289" + "173408113131230974433096066603129145174088550345854388495636" + "765494379926460031453181542793269110787478232865475929357580" + "348192936196178107395850207543849907063319379969931169428718" + "329942347533981765560805872472322186708756306455763611238082" + "951450138207325773702247286660824416431038520521352370291078" + "718247251712503010649103184487159314175972977390771951004404" + "935285742659293676372796949610394059160197507860285966047861" + "411940542821283013449073170622058378826534472881876688512697" + "758815111198429044432164893190718808033606471387328883409622" + "920327667611981052185172613337770061634130425782297578896747" + "215274225504191258419704542303129850621901180024012018244583" + "859069664741628533451563101979900751568200425006085702090401" + "221537517047980048268055449980601076610965506150742174772246" + "118061736140257508229467892560527108358789784539076822640564" + "850851810352577863861819577512851607395927299014823941534626" + "348696657393457745078724366706324437838188311582720760585617" + "487635004508688532062666933131188059377591626964364639542322" + "054994079047698970924302742015839080613569097514938471468421" + "996493818271996291393146497945863918551953149000943761983830" + "636236545375480765488470416349046929644442714477859372568735" + "843708739015199069466751627920202433249482821065761826195203" + "859723026379941258427585166740391065737087970718105336581850" + "268003743156009120998264173899565279323585156937231413010764" + "716608523561569725709426913310091413578317885628039213932500" + "135284171861048461662744818955691362183779165069982032305970" + "876642081013358484182671863168168338174351197426412625098421" + "481239711997827391790388986589171883679226337788805245818923" + "874607498645601668109872286941958827402018143065273281785872" + "847384936953936746391717131732488209980499904305446724778559" + "203846472344227623989606643158012375642854007494547242775256" + "898117140062170585337487588594307260069257691479046720590527" + "237259474018798808190031749318500514291360716338072006978678" + "678209533184089369407377832511947183352849291708100854730341" + "450938156361786419525775154653957546143580362599388832564788" + "354103919236836698740026304968121883147777634511851850370958" + "884085902337976245656103068392811534994239396318567712305532" + "477169378421492493173704379367954605145484562415027095545060" + "831874739575572895083275461127704135960230120513850917554331" + "352277278650414100755269190224957237517573174092361876919730" + "465289835269438666544826003345857532325281423386809827947616" + "676425828491143428807224317894169834736598542769698312957949" + "605903203284128114992351808708487688511436903322773652124574" + "055471177142349271989998235771191022554548042468832219533624" + "049225313628185783780849179599378819912520555522211658107113" + "447678746843053930790961744210668515951907105384498734366645" + "249428031772015356705436411724477514133655840609854880392450" + "949605226182519804314027265530362531560532656953025288585499" + "182228921920121831359074541201044664224711170390199159133806" + "269332015718061873656943996928324527943031265119266878834003" + "362682519426029626295988425859770358488877080196120965282298" + "232237612230358616986168510604382051044429343285625121039569" + "326126486782398017268335279614177221030172599765237380415252" + "503716285229140380445599733136737846363243777324290551807506" + "541472429585746028822540006160866496164919640007935962267377" + "060789839526907505659662711614828949104249176417092401488510" + "615823548277477841813412329397443687705199567361868375111535" + "380877143498420444773617475831606309624504731127984157999557" + "818660940286424404275144312853627845343063342311866285268837" + "422960089441895882484245945054082617645214582938928610352277" + "410119555602965075325424443356593793852682899089314976629899" + "773835991388717888860719076570986705247088078593793511009142" + "474344996635349786568175384138024607561209403361748867467629" + "682257007702707626687955791367383934101209955804380644234879" + "805395123927491333463152240956446177043487579040223002287264" + "756843617701865806869707173187939918037456096349272671452872" + "922420893858994027251574788837911846161770227169407508741963" + "414729807676477574570702693444290823666440055726552795145348" + "219168459767427369197825367869095117877723957392541043867909" + "937470060997392012820142238132910823657536940367596076523833" + "377812701709657429614832107556695928504222183715979980013356" + "323996396963861087268039321030018015202061305161341454716371" + "377251261775727795597989586636757177645626856419109247702765" + "013583220037644023978372654055269485171726959848928885152966" + "097502777563956522973459672620583266843497935454194334506297" + "789118714656105011811810822332373521084368112861541360109122" + "200791235053695977711430654151451133236893607856092978814379" + "881439122150752237064864676736420913214731240701495311353237" + "983819572849112853697828591806699104099315306435617990388595" + "202795271374965360450205351235544991668088723423877385558163" + "617247959486687176509451394010328416791411019672026111081271" + "677642426015450739505038057545285042073081841299473107930734" + "353837688028012401932104019803872355878454440858434446609098" + "280206732652900093156204893287546907987495659518059539534709" + "328514027916546796559631836574970153581238433324096828364072" + "134400344200269161377205676209909802573933271591397018622517" + "645956348413413974664794017053790027535048049046885143930077" + "194991519470308057661102259067039984493186760977741752890345" + "473192220637893214146475540262942007429381634927003835133941" + "914676847385135317162915391223879714190592014303606413170523" + "042176230523286150385679951115593656516900591671184538913558" + "092816251191243853120415613844777512078954866614360029341206" + "576716710688850917256800353066853946058824831651339265256785" + "622460269729620332892007335442599404495662483134697945884683" + "759795006415186716458374920343394259217852886898131157533184" + "894159749247043678238750268753264909309649831534740397743600" + "139998210203084676369899478505461752324146318698089839450421" + "143076361782530689506566153604543149790375911800793483912288" + "188586309176946988353987684054352129570631591985578449323560" + "386626892598170269027020282959579435080091825791399174445592" + "2683343374046671669930219650268554687499e-4951", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x1p-16444, + -0x8p-16448, + -0x8p-16448, + -0x8p-16448, + false, + -0xcp-16448, + -0xcp-16448, + -0x8p-16448, + -0x8p-16448, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0xcp-16448, + -0xcp-16448, + -0xb.fffffffffffcp-16448, + -0xb.fffffffffffcp-16448), + TEST ("-5.467799297823711903792608900429129724598576223540345015581" + "470730542557532950096605214341062938740807795871021020805296" + "652950478448933048254960262113384713508225733871766897517853" + "837895708450339634932343848975116093410479690330290902886861" + "199931259216523277807574569082153073133673942958789577402321" + "393933101298533191266102118889630609532339508457854220031996" + "317935940718000325144008438048416150458546268408294693278282" + "948818382981756745231443707694395053270779125240469926867881" + "019850287125023579685557790983055974962881759919483752202903" + "689199564880305684635452065363595791988290536352100701716974" + "146329604439226626943340805268641901769971862776194876385604" + "059269084172123930049144599166605103175580232672032966645406" + "656863031434873551175363941825798425331906382524706572766485" + "232874542230564262609161782396887243896247009244068837251567" + "783223271286692480010679711347802408351619999199127493689411" + "300623337751847138939498426200450305845548565910009066524152" + "545480362818290224140170178363735317929685005697363930594593" + "881342895328789259362029119598601112899006188879876371854878" + "902571753767478028100558334716504784604592507791482451533133" + "513128606357440718182123637790769320922442349066328991687862" + "072550779316393139037201187579972933016227874898505255743233" + "300533498951938156636406532613846576145617323141684480726409" + "074184197224754542490884392813625365330881348799432844624838" + "960826144439157361917744290729073116318858191758821942010704" + "726536748514141391981088590968911224406479710632429529154589" + "293799132147906174349149006094094612827453365768213012516958" + "693057189940355112250629776318079573232513434098933115589372" + "428935891821270739299776803229999720720845111297142577993950" + "783716526325576426897121181953632299322177412313472666557946" + "026587137818658956285876183561334458426909806227578696972983" + "054578648540140777431341495495816167709600470194141141159275" + "548586447187051517332624446463129570157208744018317833998766" + "292676324122069807882266170905460107352347754465354279502046" + "825607840930640910087488682878186052982487934398794575125208" + "131434599031355068379234881462786244132403015573059216658125" + "100992278732459043154873457532866362865038072260302438341256" + "465144627211756104220773841311413109973101672893502315223943" + "131161953384837658368750910845308673019625511169535246418667" + "822192756475773031982522304934161885363133347824122722726808" + "458339668843622993626685401142719276703936351749165952313385" + "247253410412444111234661569689109707012146365225868127037807" + "653838169759426465847963786308715929383888075292817554540826" + "281340379356869541699838857230452874882475626566568389051842" + "269616942233880613753230478468266244820792868174047618834373" + "911783352591638681513579303490680611741310500871919788283761" + "473826205032029153949410495205647160664548204617663407545902" + "155255595959035495626212780995301367951250745142427183922194" + "679405686105598055836303373290577235698605118096647411642319" + "219474157243864921520422978127962037044537385134878691852739" + "978563080824265712270538180666161627113218201779779366124407" + "844574754753562338454876981852965553927903650323407245581099" + "158807518181769597517311013648265985455750620305808055101887" + "320313826045110985510052672007356612620966612560448241370561" + "199679677792733282710356886335229149926131229035514374201804" + "225447070710784729359320523404977483919175478103049697809100" + "609955967524096673011016762490361065647326710555615563378359" + "408954626110765311053180827944575772439918612038754867514863" + "217604919070168030521022438807226197480679192263641289752695" + "279367794662267414957708480356805124293407645094292709270568" + "454704291549032311245797185365876072558819037766647710690310" + "669384727884764603220129302332950334873072394721879741045233" + "391084791389282719581455185833551951893903144609338532918282" + "071417365794666174600590186688558973292265260457397284219723" + "118736526338195892522797003835806498724823327170646268765114" + "335047201804332131453475981952420330849091435859688615005340" + "662951243478815535510910054031985781353569592327342625691155" + "297753939420991863066846663288192966197121277244462515137195" + "342887549113968391968700872401047521725534791569882096021521" + "725739030856023532346309694644208054801875416636970616158970" + "521587368716636562878779650147005687012772946471436217221680" + "244104527691159700944328113538972913022260318566564643466194" + "762762807772321937689272738612051928757740541051011493615150" + "275299712275026278191137262599722341528351699547926563148579" + "945678256173476664846284964106409718181820427949855282782538" + "418620206551699936257338813616307747712660216941043590501407" + "704980849740902536932579576527206665027800420035787899091137" + "498285797710848848252835440631389386421149710576503050460098" + "225348880547453179874214337446508024003058237008669916793765" + "103830790970613932711932541885454647828573565454163547779034" + "696478261735426505076787833523027219489668014198674507463022" + "589310657355955884354584118602516953160415158848138916494891" + "482359394428713333626368035819136954032193064982447142548513" + "777798482352540211515117109331361325135068534382485905222012" + "689155196601835592087277572480712876900324312948680873379635" + "049766825511648515719101185883064389832362822347209928024358" + "316443434834701491039800443982197050828044087275939582794327" + "098500876914356235193809147621508354816413733354188380887001" + "911623409901345292980795015165229743643600614968493977578123" + "466095415615447864269417603852427781048383314979868134570808" + "915217919397946316940234061179348627230180807326753461268559" + "385959678786688421103134141790339174982532045466350837038525" + "183177847731101708972936115216192881538981857998354449098289" + "173408113131230974433096066603129145174088550345854388495636" + "765494379926460031453181542793269110787478232865475929357580" + "348192936196178107395850207543849907063319379969931169428718" + "329942347533981765560805872472322186708756306455763611238082" + "951450138207325773702247286660824416431038520521352370291078" + "718247251712503010649103184487159314175972977390771951004404" + "935285742659293676372796949610394059160197507860285966047861" + "411940542821283013449073170622058378826534472881876688512697" + "758815111198429044432164893190718808033606471387328883409622" + "920327667611981052185172613337770061634130425782297578896747" + "215274225504191258419704542303129850621901180024012018244583" + "859069664741628533451563101979900751568200425006085702090401" + "221537517047980048268055449980601076610965506150742174772246" + "118061736140257508229467892560527108358789784539076822640564" + "850851810352577863861819577512851607395927299014823941534626" + "348696657393457745078724366706324437838188311582720760585617" + "487635004508688532062666933131188059377591626964364639542322" + "054994079047698970924302742015839080613569097514938471468421" + "996493818271996291393146497945863918551953149000943761983830" + "636236545375480765488470416349046929644442714477859372568735" + "843708739015199069466751627920202433249482821065761826195203" + "859723026379941258427585166740391065737087970718105336581850" + "268003743156009120998264173899565279323585156937231413010764" + "716608523561569725709426913310091413578317885628039213932500" + "135284171861048461662744818955691362183779165069982032305970" + "876642081013358484182671863168168338174351197426412625098421" + "481239711997827391790388986589171883679226337788805245818923" + "874607498645601668109872286941958827402018143065273281785872" + "847384936953936746391717131732488209980499904305446724778559" + "203846472344227623989606643158012375642854007494547242775256" + "898117140062170585337487588594307260069257691479046720590527" + "237259474018798808190031749318500514291360716338072006978678" + "678209533184089369407377832511947183352849291708100854730341" + "450938156361786419525775154653957546143580362599388832564788" + "354103919236836698740026304968121883147777634511851850370958" + "884085902337976245656103068392811534994239396318567712305532" + "477169378421492493173704379367954605145484562415027095545060" + "831874739575572895083275461127704135960230120513850917554331" + "352277278650414100755269190224957237517573174092361876919730" + "465289835269438666544826003345857532325281423386809827947616" + "676425828491143428807224317894169834736598542769698312957949" + "605903203284128114992351808708487688511436903322773652124574" + "055471177142349271989998235771191022554548042468832219533624" + "049225313628185783780849179599378819912520555522211658107113" + "447678746843053930790961744210668515951907105384498734366645" + "249428031772015356705436411724477514133655840609854880392450" + "949605226182519804314027265530362531560532656953025288585499" + "182228921920121831359074541201044664224711170390199159133806" + "269332015718061873656943996928324527943031265119266878834003" + "362682519426029626295988425859770358488877080196120965282298" + "232237612230358616986168510604382051044429343285625121039569" + "326126486782398017268335279614177221030172599765237380415252" + "503716285229140380445599733136737846363243777324290551807506" + "541472429585746028822540006160866496164919640007935962267377" + "060789839526907505659662711614828949104249176417092401488510" + "615823548277477841813412329397443687705199567361868375111535" + "380877143498420444773617475831606309624504731127984157999557" + "818660940286424404275144312853627845343063342311866285268837" + "422960089441895882484245945054082617645214582938928610352277" + "410119555602965075325424443356593793852682899089314976629899" + "773835991388717888860719076570986705247088078593793511009142" + "474344996635349786568175384138024607561209403361748867467629" + "682257007702707626687955791367383934101209955804380644234879" + "805395123927491333463152240956446177043487579040223002287264" + "756843617701865806869707173187939918037456096349272671452872" + "922420893858994027251574788837911846161770227169407508741963" + "414729807676477574570702693444290823666440055726552795145348" + "219168459767427369197825367869095117877723957392541043867909" + "937470060997392012820142238132910823657536940367596076523833" + "377812701709657429614832107556695928504222183715979980013356" + "323996396963861087268039321030018015202061305161341454716371" + "377251261775727795597989586636757177645626856419109247702765" + "013583220037644023978372654055269485171726959848928885152966" + "097502777563956522973459672620583266843497935454194334506297" + "789118714656105011811810822332373521084368112861541360109122" + "200791235053695977711430654151451133236893607856092978814379" + "881439122150752237064864676736420913214731240701495311353237" + "983819572849112853697828591806699104099315306435617990388595" + "202795271374965360450205351235544991668088723423877385558163" + "617247959486687176509451394010328416791411019672026111081271" + "677642426015450739505038057545285042073081841299473107930734" + "353837688028012401932104019803872355878454440858434446609098" + "280206732652900093156204893287546907987495659518059539534709" + "328514027916546796559631836574970153581238433324096828364072" + "134400344200269161377205676209909802573933271591397018622517" + "645956348413413974664794017053790027535048049046885143930077" + "194991519470308057661102259067039984493186760977741752890345" + "473192220637893214146475540262942007429381634927003835133941" + "914676847385135317162915391223879714190592014303606413170523" + "042176230523286150385679951115593656516900591671184538913558" + "092816251191243853120415613844777512078954866614360029341206" + "576716710688850917256800353066853946058824831651339265256785" + "622460269729620332892007335442599404495662483134697945884683" + "759795006415186716458374920343394259217852886898131157533184" + "894159749247043678238750268753264909309649831534740397743600" + "139998210203084676369899478505461752324146318698089839450421" + "143076361782530689506566153604543149790375911800793483912288" + "188586309176946988353987684054352129570631591985578449323560" + "386626892598170269027020282959579435080091825791399174445592" + "26833433740466716699302196502685546875e-4951", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x1p-16444, + -0x1p-16444, + -0x8p-16448, + -0x8p-16448, + true, + -0xcp-16448, + -0xcp-16448, + -0xcp-16448, + -0xcp-16448, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0xcp-16448, + -0xcp-16448, + -0xcp-16448, + -0xcp-16448), + TEST ("-5.467799297823711903792608900429129724598576223540345015581" + "470730542557532950096605214341062938740807795871021020805296" + "652950478448933048254960262113384713508225733871766897517853" + "837895708450339634932343848975116093410479690330290902886861" + "199931259216523277807574569082153073133673942958789577402321" + "393933101298533191266102118889630609532339508457854220031996" + "317935940718000325144008438048416150458546268408294693278282" + "948818382981756745231443707694395053270779125240469926867881" + "019850287125023579685557790983055974962881759919483752202903" + "689199564880305684635452065363595791988290536352100701716974" + "146329604439226626943340805268641901769971862776194876385604" + "059269084172123930049144599166605103175580232672032966645406" + "656863031434873551175363941825798425331906382524706572766485" + "232874542230564262609161782396887243896247009244068837251567" + "783223271286692480010679711347802408351619999199127493689411" + "300623337751847138939498426200450305845548565910009066524152" + "545480362818290224140170178363735317929685005697363930594593" + "881342895328789259362029119598601112899006188879876371854878" + "902571753767478028100558334716504784604592507791482451533133" + "513128606357440718182123637790769320922442349066328991687862" + "072550779316393139037201187579972933016227874898505255743233" + "300533498951938156636406532613846576145617323141684480726409" + "074184197224754542490884392813625365330881348799432844624838" + "960826144439157361917744290729073116318858191758821942010704" + "726536748514141391981088590968911224406479710632429529154589" + "293799132147906174349149006094094612827453365768213012516958" + "693057189940355112250629776318079573232513434098933115589372" + "428935891821270739299776803229999720720845111297142577993950" + "783716526325576426897121181953632299322177412313472666557946" + "026587137818658956285876183561334458426909806227578696972983" + "054578648540140777431341495495816167709600470194141141159275" + "548586447187051517332624446463129570157208744018317833998766" + "292676324122069807882266170905460107352347754465354279502046" + "825607840930640910087488682878186052982487934398794575125208" + "131434599031355068379234881462786244132403015573059216658125" + "100992278732459043154873457532866362865038072260302438341256" + "465144627211756104220773841311413109973101672893502315223943" + "131161953384837658368750910845308673019625511169535246418667" + "822192756475773031982522304934161885363133347824122722726808" + "458339668843622993626685401142719276703936351749165952313385" + "247253410412444111234661569689109707012146365225868127037807" + "653838169759426465847963786308715929383888075292817554540826" + "281340379356869541699838857230452874882475626566568389051842" + "269616942233880613753230478468266244820792868174047618834373" + "911783352591638681513579303490680611741310500871919788283761" + "473826205032029153949410495205647160664548204617663407545902" + "155255595959035495626212780995301367951250745142427183922194" + "679405686105598055836303373290577235698605118096647411642319" + "219474157243864921520422978127962037044537385134878691852739" + "978563080824265712270538180666161627113218201779779366124407" + "844574754753562338454876981852965553927903650323407245581099" + "158807518181769597517311013648265985455750620305808055101887" + "320313826045110985510052672007356612620966612560448241370561" + "199679677792733282710356886335229149926131229035514374201804" + "225447070710784729359320523404977483919175478103049697809100" + "609955967524096673011016762490361065647326710555615563378359" + "408954626110765311053180827944575772439918612038754867514863" + "217604919070168030521022438807226197480679192263641289752695" + "279367794662267414957708480356805124293407645094292709270568" + "454704291549032311245797185365876072558819037766647710690310" + "669384727884764603220129302332950334873072394721879741045233" + "391084791389282719581455185833551951893903144609338532918282" + "071417365794666174600590186688558973292265260457397284219723" + "118736526338195892522797003835806498724823327170646268765114" + "335047201804332131453475981952420330849091435859688615005340" + "662951243478815535510910054031985781353569592327342625691155" + "297753939420991863066846663288192966197121277244462515137195" + "342887549113968391968700872401047521725534791569882096021521" + "725739030856023532346309694644208054801875416636970616158970" + "521587368716636562878779650147005687012772946471436217221680" + "244104527691159700944328113538972913022260318566564643466194" + "762762807772321937689272738612051928757740541051011493615150" + "275299712275026278191137262599722341528351699547926563148579" + "945678256173476664846284964106409718181820427949855282782538" + "418620206551699936257338813616307747712660216941043590501407" + "704980849740902536932579576527206665027800420035787899091137" + "498285797710848848252835440631389386421149710576503050460098" + "225348880547453179874214337446508024003058237008669916793765" + "103830790970613932711932541885454647828573565454163547779034" + "696478261735426505076787833523027219489668014198674507463022" + "589310657355955884354584118602516953160415158848138916494891" + "482359394428713333626368035819136954032193064982447142548513" + "777798482352540211515117109331361325135068534382485905222012" + "689155196601835592087277572480712876900324312948680873379635" + "049766825511648515719101185883064389832362822347209928024358" + "316443434834701491039800443982197050828044087275939582794327" + "098500876914356235193809147621508354816413733354188380887001" + "911623409901345292980795015165229743643600614968493977578123" + "466095415615447864269417603852427781048383314979868134570808" + "915217919397946316940234061179348627230180807326753461268559" + "385959678786688421103134141790339174982532045466350837038525" + "183177847731101708972936115216192881538981857998354449098289" + "173408113131230974433096066603129145174088550345854388495636" + "765494379926460031453181542793269110787478232865475929357580" + "348192936196178107395850207543849907063319379969931169428718" + "329942347533981765560805872472322186708756306455763611238082" + "951450138207325773702247286660824416431038520521352370291078" + "718247251712503010649103184487159314175972977390771951004404" + "935285742659293676372796949610394059160197507860285966047861" + "411940542821283013449073170622058378826534472881876688512697" + "758815111198429044432164893190718808033606471387328883409622" + "920327667611981052185172613337770061634130425782297578896747" + "215274225504191258419704542303129850621901180024012018244583" + "859069664741628533451563101979900751568200425006085702090401" + "221537517047980048268055449980601076610965506150742174772246" + "118061736140257508229467892560527108358789784539076822640564" + "850851810352577863861819577512851607395927299014823941534626" + "348696657393457745078724366706324437838188311582720760585617" + "487635004508688532062666933131188059377591626964364639542322" + "054994079047698970924302742015839080613569097514938471468421" + "996493818271996291393146497945863918551953149000943761983830" + "636236545375480765488470416349046929644442714477859372568735" + "843708739015199069466751627920202433249482821065761826195203" + "859723026379941258427585166740391065737087970718105336581850" + "268003743156009120998264173899565279323585156937231413010764" + "716608523561569725709426913310091413578317885628039213932500" + "135284171861048461662744818955691362183779165069982032305970" + "876642081013358484182671863168168338174351197426412625098421" + "481239711997827391790388986589171883679226337788805245818923" + "874607498645601668109872286941958827402018143065273281785872" + "847384936953936746391717131732488209980499904305446724778559" + "203846472344227623989606643158012375642854007494547242775256" + "898117140062170585337487588594307260069257691479046720590527" + "237259474018798808190031749318500514291360716338072006978678" + "678209533184089369407377832511947183352849291708100854730341" + "450938156361786419525775154653957546143580362599388832564788" + "354103919236836698740026304968121883147777634511851850370958" + "884085902337976245656103068392811534994239396318567712305532" + "477169378421492493173704379367954605145484562415027095545060" + "831874739575572895083275461127704135960230120513850917554331" + "352277278650414100755269190224957237517573174092361876919730" + "465289835269438666544826003345857532325281423386809827947616" + "676425828491143428807224317894169834736598542769698312957949" + "605903203284128114992351808708487688511436903322773652124574" + "055471177142349271989998235771191022554548042468832219533624" + "049225313628185783780849179599378819912520555522211658107113" + "447678746843053930790961744210668515951907105384498734366645" + "249428031772015356705436411724477514133655840609854880392450" + "949605226182519804314027265530362531560532656953025288585499" + "182228921920121831359074541201044664224711170390199159133806" + "269332015718061873656943996928324527943031265119266878834003" + "362682519426029626295988425859770358488877080196120965282298" + "232237612230358616986168510604382051044429343285625121039569" + "326126486782398017268335279614177221030172599765237380415252" + "503716285229140380445599733136737846363243777324290551807506" + "541472429585746028822540006160866496164919640007935962267377" + "060789839526907505659662711614828949104249176417092401488510" + "615823548277477841813412329397443687705199567361868375111535" + "380877143498420444773617475831606309624504731127984157999557" + "818660940286424404275144312853627845343063342311866285268837" + "422960089441895882484245945054082617645214582938928610352277" + "410119555602965075325424443356593793852682899089314976629899" + "773835991388717888860719076570986705247088078593793511009142" + "474344996635349786568175384138024607561209403361748867467629" + "682257007702707626687955791367383934101209955804380644234879" + "805395123927491333463152240956446177043487579040223002287264" + "756843617701865806869707173187939918037456096349272671452872" + "922420893858994027251574788837911846161770227169407508741963" + "414729807676477574570702693444290823666440055726552795145348" + "219168459767427369197825367869095117877723957392541043867909" + "937470060997392012820142238132910823657536940367596076523833" + "377812701709657429614832107556695928504222183715979980013356" + "323996396963861087268039321030018015202061305161341454716371" + "377251261775727795597989586636757177645626856419109247702765" + "013583220037644023978372654055269485171726959848928885152966" + "097502777563956522973459672620583266843497935454194334506297" + "789118714656105011811810822332373521084368112861541360109122" + "200791235053695977711430654151451133236893607856092978814379" + "881439122150752237064864676736420913214731240701495311353237" + "983819572849112853697828591806699104099315306435617990388595" + "202795271374965360450205351235544991668088723423877385558163" + "617247959486687176509451394010328416791411019672026111081271" + "677642426015450739505038057545285042073081841299473107930734" + "353837688028012401932104019803872355878454440858434446609098" + "280206732652900093156204893287546907987495659518059539534709" + "328514027916546796559631836574970153581238433324096828364072" + "134400344200269161377205676209909802573933271591397018622517" + "645956348413413974664794017053790027535048049046885143930077" + "194991519470308057661102259067039984493186760977741752890345" + "473192220637893214146475540262942007429381634927003835133941" + "914676847385135317162915391223879714190592014303606413170523" + "042176230523286150385679951115593656516900591671184538913558" + "092816251191243853120415613844777512078954866614360029341206" + "576716710688850917256800353066853946058824831651339265256785" + "622460269729620332892007335442599404495662483134697945884683" + "759795006415186716458374920343394259217852886898131157533184" + "894159749247043678238750268753264909309649831534740397743600" + "139998210203084676369899478505461752324146318698089839450421" + "143076361782530689506566153604543149790375911800793483912288" + "188586309176946988353987684054352129570631591985578449323560" + "386626892598170269027020282959579435080091825791399174445592" + "2683343374046671669930219650268554687501e-4951", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x1p-16444, + -0x1p-16444, + -0x8p-16448, + -0x8p-16448, + false, + -0x1p-16444, + -0xcp-16448, + -0xcp-16448, + -0xcp-16448, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0xc.000000000004p-16448, + -0xcp-16448, + -0xcp-16448, + -0xcp-16448), + TEST ("5.4677992978237119037926089004291297245985762235403450155814" + "707305425575329500966052143410629387408077958710210208052966" + "529504784489330482549602621133847135082257338717668975178538" + "378957084503396349323438489751160934104796903302909028868611" + "999312592165232778075745690821530731336739429587895774023213" + "939331012985331912661021188896306095323395084578542200319963" + "179359407180003251440084380484161504585462684082946932782829" + "488183829817567452314437076943950532707791252404699268678810" + "198502871250235796855577909830559749628817599194837522029036" + "891995648803056846354520653635957919882905363521007017169741" + "463296044392266269433408052686419017699718627761948763856040" + "592690841721239300491445991666051031755802326720329666454066" + "568630314348735511753639418257984253319063825247065727664852" + "328745422305642626091617823968872438962470092440688372515677" + "832232712866924800106797113478024083516199991991274936894113" + "006233377518471389394984262004503058455485659100090665241525" + "454803628182902241401701783637353179296850056973639305945938" + "813428953287892593620291195986011128990061888798763718548789" + "025717537674780281005583347165047846045925077914824515331335" + "131286063574407181821236377907693209224423490663289916878620" + "725507793163931390372011875799729330162278748985052557432333" + "005334989519381566364065326138465761456173231416844807264090" + "741841972247545424908843928136253653308813487994328446248389" + "608261444391573619177442907290731163188581917588219420107047" + "265367485141413919810885909689112244064797106324295291545892" + "937991321479061743491490060940946128274533657682130125169586" + "930571899403551122506297763180795732325134340989331155893724" + "289358918212707392997768032299997207208451112971425779939507" + "837165263255764268971211819536322993221774123134726665579460" + "265871378186589562858761835613344584269098062275786969729830" + "545786485401407774313414954958161677096004701941411411592755" + "485864471870515173326244464631295701572087440183178339987662" + "926763241220698078822661709054601073523477544653542795020468" + "256078409306409100874886828781860529824879343987945751252081" + "314345990313550683792348814627862441324030155730592166581251" + "009922787324590431548734575328663628650380722603024383412564" + "651446272117561042207738413114131099731016728935023152239431" + "311619533848376583687509108453086730196255111695352464186678" + "221927564757730319825223049341618853631333478241227227268084" + "583396688436229936266854011427192767039363517491659523133852" + "472534104124441112346615696891097070121463652258681270378076" + "538381697594264658479637863087159293838880752928175545408262" + "813403793568695416998388572304528748824756265665683890518422" + "696169422338806137532304784682662448207928681740476188343739" + "117833525916386815135793034906806117413105008719197882837614" + "738262050320291539494104952056471606645482046176634075459021" + "552555959590354956262127809953013679512507451424271839221946" + "794056861055980558363033732905772356986051180966474116423192" + "194741572438649215204229781279620370445373851348786918527399" + "785630808242657122705381806661616271132182017797793661244078" + "445747547535623384548769818529655539279036503234072455810991" + "588075181817695975173110136482659854557506203058080551018873" + "203138260451109855100526720073566126209666125604482413705611" + "996796777927332827103568863352291499261312290355143742018042" + "254470707107847293593205234049774839191754781030496978091006" + "099559675240966730110167624903610656473267105556155633783594" + "089546261107653110531808279445757724399186120387548675148632" + "176049190701680305210224388072261974806791922636412897526952" + "793677946622674149577084803568051242934076450942927092705684" + "547042915490323112457971853658760725588190377666477106903106" + "693847278847646032201293023329503348730723947218797410452333" + "910847913892827195814551858335519518939031446093385329182820" + "714173657946661746005901866885589732922652604573972842197231" + "187365263381958925227970038358064987248233271706462687651143" + "350472018043321314534759819524203308490914358596886150053406" + "629512434788155355109100540319857813535695923273426256911552" + "977539394209918630668466632881929661971212772444625151371953" + "428875491139683919687008724010475217255347915698820960215217" + "257390308560235323463096946442080548018754166369706161589705" + "215873687166365628787796501470056870127729464714362172216802" + "441045276911597009443281135389729130222603185665646434661947" + "627628077723219376892727386120519287577405410510114936151502" + "752997122750262781911372625997223415283516995479265631485799" + "456782561734766648462849641064097181818204279498552827825384" + "186202065516999362573388136163077477126602169410435905014077" + "049808497409025369325795765272066650278004200357878990911374" + "982857977108488482528354406313893864211497105765030504600982" + "253488805474531798742143374465080240030582370086699167937651" + "038307909706139327119325418854546478285735654541635477790346" + "964782617354265050767878335230272194896680141986745074630225" + "893106573559558843545841186025169531604151588481389164948914" + "823593944287133336263680358191369540321930649824471425485137" + "777984823525402115151171093313613251350685343824859052220126" + "891551966018355920872775724807128769003243129486808733796350" + "497668255116485157191011858830643898323628223472099280243583" + "164434348347014910398004439821970508280440872759395827943270" + "985008769143562351938091476215083548164137333541883808870019" + "116234099013452929807950151652297436436006149684939775781234" + "660954156154478642694176038524277810483833149798681345708089" + "152179193979463169402340611793486272301808073267534612685593" + "859596787866884211031341417903391749825320454663508370385251" + "831778477311017089729361152161928815389818579983544490982891" + "734081131312309744330960666031291451740885503458543884956367" + "654943799264600314531815427932691107874782328654759293575803" + "481929361961781073958502075438499070633193799699311694287183" + "299423475339817655608058724723221867087563064557636112380829" + "514501382073257737022472866608244164310385205213523702910787" + "182472517125030106491031844871593141759729773907719510044049" + "352857426592936763727969496103940591601975078602859660478614" + "119405428212830134490731706220583788265344728818766885126977" + "588151111984290444321648931907188080336064713873288834096229" + "203276676119810521851726133377700616341304257822975788967472" + "152742255041912584197045423031298506219011800240120182445838" + "590696647416285334515631019799007515682004250060857020904012" + "215375170479800482680554499806010766109655061507421747722461" + "180617361402575082294678925605271083587897845390768226405648" + "508518103525778638618195775128516073959272990148239415346263" + "486966573934577450787243667063244378381883115827207605856174" + "876350045086885320626669331311880593775916269643646395423220" + "549940790476989709243027420158390806135690975149384714684219" + "964938182719962913931464979458639185519531490009437619838306" + "362365453754807654884704163490469296444427144778593725687358" + "437087390151990694667516279202024332494828210657618261952038" + "597230263799412584275851667403910657370879707181053365818502" + "680037431560091209982641738995652793235851569372314130107647" + "166085235615697257094269133100914135783178856280392139325001" + "352841718610484616627448189556913621837791650699820323059708" + "766420810133584841826718631681683381743511974264126250984214" + "812397119978273917903889865891718836792263377888052458189238" + "746074986456016681098722869419588274020181430652732817858728" + "473849369539367463917171317324882099804999043054467247785592" + "038464723442276239896066431580123756428540074945472427752568" + "981171400621705853374875885943072600692576914790467205905272" + "372594740187988081900317493185005142913607163380720069786786" + "782095331840893694073778325119471833528492917081008547303414" + "509381563617864195257751546539575461435803625993888325647883" + "541039192368366987400263049681218831477776345118518503709588" + "840859023379762456561030683928115349942393963185677123055324" + "771693784214924931737043793679546051454845624150270955450608" + "318747395755728950832754611277041359602301205138509175543313" + "522772786504141007552691902249572375175731740923618769197304" + "652898352694386665448260033458575323252814233868098279476166" + "764258284911434288072243178941698347365985427696983129579496" + "059032032841281149923518087084876885114369033227736521245740" + "554711771423492719899982357711910225545480424688322195336240" + "492253136281857837808491795993788199125205555222116581071134" + "476787468430539307909617442106685159519071053844987343666452" + "494280317720153567054364117244775141336558406098548803924509" + "496052261825198043140272655303625315605326569530252885854991" + "822289219201218313590745412010446642247111703901991591338062" + "693320157180618736569439969283245279430312651192668788340033" + "626825194260296262959884258597703584888770801961209652822982" + "322376122303586169861685106043820510444293432856251210395693" + "261264867823980172683352796141772210301725997652373804152525" + "037162852291403804455997331367378463632437773242905518075065" + "414724295857460288225400061608664961649196400079359622673770" + "607898395269075056596627116148289491042491764170924014885106" + "158235482774778418134123293974436877051995673618683751115353" + "808771434984204447736174758316063096245047311279841579995578" + "186609402864244042751443128536278453430633423118662852688374" + "229600894418958824842459450540826176452145829389286103522774" + "101195556029650753254244433565937938526828990893149766298997" + "738359913887178888607190765709867052470880785937935110091424" + "743449966353497865681753841380246075612094033617488674676296" + "822570077027076266879557913673839341012099558043806442348798" + "053951239274913334631522409564461770434875790402230022872647" + "568436177018658068697071731879399180374560963492726714528729" + "224208938589940272515747888379118461617702271694075087419634" + "147298076764775745707026934442908236664400557265527951453482" + "191684597674273691978253678690951178777239573925410438679099" + "374700609973920128201422381329108236575369403675960765238333" + "778127017096574296148321075566959285042221837159799800133563" + "239963969638610872680393210300180152020613051613414547163713" + "772512617757277955979895866367571776456268564191092477027650" + "135832200376440239783726540552694851717269598489288851529660" + "975027775639565229734596726205832668434979354541943345062977" + "891187146561050118118108223323735210843681128615413601091222" + "007912350536959777114306541514511332368936078560929788143798" + "814391221507522370648646767364209132147312407014953113532379" + "838195728491128536978285918066991040993153064356179903885952" + "027952713749653604502053512355449916680887234238773855581636" + "172479594866871765094513940103284167914110196720261110812716" + "776424260154507395050380575452850420730818412994731079307343" + "538376880280124019321040198038723558784544408584344466090982" + "802067326529000931562048932875469079874956595180595395347093" + "285140279165467965596318365749701535812384333240968283640721" + "344003442002691613772056762099098025739332715913970186225176" + "459563484134139746647940170537900275350480490468851439300771" + "949915194703080576611022590670399844931867609777417528903454" + "731922206378932141464755402629420074293816349270038351339419" + "146768473851353171629153912238797141905920143036064131705230" + "421762305232861503856799511155936565169005916711845389135580" + "928162511912438531204156138447775120789548666143600293412065" + "767167106888509172568003530668539460588248316513392652567856" + "224602697296203328920073354425994044956624831346979458846837" + "597950064151867164583749203433942592178528868981311575331848" + "941597492470436782387502687532649093096498315347403977436001" + "399982102030846763698994785054617523241463186980898394504211" + "430763617825306895065661536045431497903759118007934839122881" + "885863091769469883539876840543521295706315919855784493235603" + "866268925981702690270202829595794350800918257913991744455922" + "683343374046671669930219650268554687499e-4951", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x8p-16448, + 0x8p-16448, + 0x8p-16448, + 0x1p-16444, + false, + 0x8p-16448, + 0xcp-16448, + 0x8p-16448, + 0xcp-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0xb.fffffffffffcp-16448, + 0xcp-16448, + 0xb.fffffffffffcp-16448, + 0xcp-16448), + TEST ("5.4677992978237119037926089004291297245985762235403450155814" + "707305425575329500966052143410629387408077958710210208052966" + "529504784489330482549602621133847135082257338717668975178538" + "378957084503396349323438489751160934104796903302909028868611" + "999312592165232778075745690821530731336739429587895774023213" + "939331012985331912661021188896306095323395084578542200319963" + "179359407180003251440084380484161504585462684082946932782829" + "488183829817567452314437076943950532707791252404699268678810" + "198502871250235796855577909830559749628817599194837522029036" + "891995648803056846354520653635957919882905363521007017169741" + "463296044392266269433408052686419017699718627761948763856040" + "592690841721239300491445991666051031755802326720329666454066" + "568630314348735511753639418257984253319063825247065727664852" + "328745422305642626091617823968872438962470092440688372515677" + "832232712866924800106797113478024083516199991991274936894113" + "006233377518471389394984262004503058455485659100090665241525" + "454803628182902241401701783637353179296850056973639305945938" + "813428953287892593620291195986011128990061888798763718548789" + "025717537674780281005583347165047846045925077914824515331335" + "131286063574407181821236377907693209224423490663289916878620" + "725507793163931390372011875799729330162278748985052557432333" + "005334989519381566364065326138465761456173231416844807264090" + "741841972247545424908843928136253653308813487994328446248389" + "608261444391573619177442907290731163188581917588219420107047" + "265367485141413919810885909689112244064797106324295291545892" + "937991321479061743491490060940946128274533657682130125169586" + "930571899403551122506297763180795732325134340989331155893724" + "289358918212707392997768032299997207208451112971425779939507" + "837165263255764268971211819536322993221774123134726665579460" + "265871378186589562858761835613344584269098062275786969729830" + "545786485401407774313414954958161677096004701941411411592755" + "485864471870515173326244464631295701572087440183178339987662" + "926763241220698078822661709054601073523477544653542795020468" + "256078409306409100874886828781860529824879343987945751252081" + "314345990313550683792348814627862441324030155730592166581251" + "009922787324590431548734575328663628650380722603024383412564" + "651446272117561042207738413114131099731016728935023152239431" + "311619533848376583687509108453086730196255111695352464186678" + "221927564757730319825223049341618853631333478241227227268084" + "583396688436229936266854011427192767039363517491659523133852" + "472534104124441112346615696891097070121463652258681270378076" + "538381697594264658479637863087159293838880752928175545408262" + "813403793568695416998388572304528748824756265665683890518422" + "696169422338806137532304784682662448207928681740476188343739" + "117833525916386815135793034906806117413105008719197882837614" + "738262050320291539494104952056471606645482046176634075459021" + "552555959590354956262127809953013679512507451424271839221946" + "794056861055980558363033732905772356986051180966474116423192" + "194741572438649215204229781279620370445373851348786918527399" + "785630808242657122705381806661616271132182017797793661244078" + "445747547535623384548769818529655539279036503234072455810991" + "588075181817695975173110136482659854557506203058080551018873" + "203138260451109855100526720073566126209666125604482413705611" + "996796777927332827103568863352291499261312290355143742018042" + "254470707107847293593205234049774839191754781030496978091006" + "099559675240966730110167624903610656473267105556155633783594" + "089546261107653110531808279445757724399186120387548675148632" + "176049190701680305210224388072261974806791922636412897526952" + "793677946622674149577084803568051242934076450942927092705684" + "547042915490323112457971853658760725588190377666477106903106" + "693847278847646032201293023329503348730723947218797410452333" + "910847913892827195814551858335519518939031446093385329182820" + "714173657946661746005901866885589732922652604573972842197231" + "187365263381958925227970038358064987248233271706462687651143" + "350472018043321314534759819524203308490914358596886150053406" + "629512434788155355109100540319857813535695923273426256911552" + "977539394209918630668466632881929661971212772444625151371953" + "428875491139683919687008724010475217255347915698820960215217" + "257390308560235323463096946442080548018754166369706161589705" + "215873687166365628787796501470056870127729464714362172216802" + "441045276911597009443281135389729130222603185665646434661947" + "627628077723219376892727386120519287577405410510114936151502" + "752997122750262781911372625997223415283516995479265631485799" + "456782561734766648462849641064097181818204279498552827825384" + "186202065516999362573388136163077477126602169410435905014077" + "049808497409025369325795765272066650278004200357878990911374" + "982857977108488482528354406313893864211497105765030504600982" + "253488805474531798742143374465080240030582370086699167937651" + "038307909706139327119325418854546478285735654541635477790346" + "964782617354265050767878335230272194896680141986745074630225" + "893106573559558843545841186025169531604151588481389164948914" + "823593944287133336263680358191369540321930649824471425485137" + "777984823525402115151171093313613251350685343824859052220126" + "891551966018355920872775724807128769003243129486808733796350" + "497668255116485157191011858830643898323628223472099280243583" + "164434348347014910398004439821970508280440872759395827943270" + "985008769143562351938091476215083548164137333541883808870019" + "116234099013452929807950151652297436436006149684939775781234" + "660954156154478642694176038524277810483833149798681345708089" + "152179193979463169402340611793486272301808073267534612685593" + "859596787866884211031341417903391749825320454663508370385251" + "831778477311017089729361152161928815389818579983544490982891" + "734081131312309744330960666031291451740885503458543884956367" + "654943799264600314531815427932691107874782328654759293575803" + "481929361961781073958502075438499070633193799699311694287183" + "299423475339817655608058724723221867087563064557636112380829" + "514501382073257737022472866608244164310385205213523702910787" + "182472517125030106491031844871593141759729773907719510044049" + "352857426592936763727969496103940591601975078602859660478614" + "119405428212830134490731706220583788265344728818766885126977" + "588151111984290444321648931907188080336064713873288834096229" + "203276676119810521851726133377700616341304257822975788967472" + "152742255041912584197045423031298506219011800240120182445838" + "590696647416285334515631019799007515682004250060857020904012" + "215375170479800482680554499806010766109655061507421747722461" + "180617361402575082294678925605271083587897845390768226405648" + "508518103525778638618195775128516073959272990148239415346263" + "486966573934577450787243667063244378381883115827207605856174" + "876350045086885320626669331311880593775916269643646395423220" + "549940790476989709243027420158390806135690975149384714684219" + "964938182719962913931464979458639185519531490009437619838306" + "362365453754807654884704163490469296444427144778593725687358" + "437087390151990694667516279202024332494828210657618261952038" + "597230263799412584275851667403910657370879707181053365818502" + "680037431560091209982641738995652793235851569372314130107647" + "166085235615697257094269133100914135783178856280392139325001" + "352841718610484616627448189556913621837791650699820323059708" + "766420810133584841826718631681683381743511974264126250984214" + "812397119978273917903889865891718836792263377888052458189238" + "746074986456016681098722869419588274020181430652732817858728" + "473849369539367463917171317324882099804999043054467247785592" + "038464723442276239896066431580123756428540074945472427752568" + "981171400621705853374875885943072600692576914790467205905272" + "372594740187988081900317493185005142913607163380720069786786" + "782095331840893694073778325119471833528492917081008547303414" + "509381563617864195257751546539575461435803625993888325647883" + "541039192368366987400263049681218831477776345118518503709588" + "840859023379762456561030683928115349942393963185677123055324" + "771693784214924931737043793679546051454845624150270955450608" + "318747395755728950832754611277041359602301205138509175543313" + "522772786504141007552691902249572375175731740923618769197304" + "652898352694386665448260033458575323252814233868098279476166" + "764258284911434288072243178941698347365985427696983129579496" + "059032032841281149923518087084876885114369033227736521245740" + "554711771423492719899982357711910225545480424688322195336240" + "492253136281857837808491795993788199125205555222116581071134" + "476787468430539307909617442106685159519071053844987343666452" + "494280317720153567054364117244775141336558406098548803924509" + "496052261825198043140272655303625315605326569530252885854991" + "822289219201218313590745412010446642247111703901991591338062" + "693320157180618736569439969283245279430312651192668788340033" + "626825194260296262959884258597703584888770801961209652822982" + "322376122303586169861685106043820510444293432856251210395693" + "261264867823980172683352796141772210301725997652373804152525" + "037162852291403804455997331367378463632437773242905518075065" + "414724295857460288225400061608664961649196400079359622673770" + "607898395269075056596627116148289491042491764170924014885106" + "158235482774778418134123293974436877051995673618683751115353" + "808771434984204447736174758316063096245047311279841579995578" + "186609402864244042751443128536278453430633423118662852688374" + "229600894418958824842459450540826176452145829389286103522774" + "101195556029650753254244433565937938526828990893149766298997" + "738359913887178888607190765709867052470880785937935110091424" + "743449966353497865681753841380246075612094033617488674676296" + "822570077027076266879557913673839341012099558043806442348798" + "053951239274913334631522409564461770434875790402230022872647" + "568436177018658068697071731879399180374560963492726714528729" + "224208938589940272515747888379118461617702271694075087419634" + "147298076764775745707026934442908236664400557265527951453482" + "191684597674273691978253678690951178777239573925410438679099" + "374700609973920128201422381329108236575369403675960765238333" + "778127017096574296148321075566959285042221837159799800133563" + "239963969638610872680393210300180152020613051613414547163713" + "772512617757277955979895866367571776456268564191092477027650" + "135832200376440239783726540552694851717269598489288851529660" + "975027775639565229734596726205832668434979354541943345062977" + "891187146561050118118108223323735210843681128615413601091222" + "007912350536959777114306541514511332368936078560929788143798" + "814391221507522370648646767364209132147312407014953113532379" + "838195728491128536978285918066991040993153064356179903885952" + "027952713749653604502053512355449916680887234238773855581636" + "172479594866871765094513940103284167914110196720261110812716" + "776424260154507395050380575452850420730818412994731079307343" + "538376880280124019321040198038723558784544408584344466090982" + "802067326529000931562048932875469079874956595180595395347093" + "285140279165467965596318365749701535812384333240968283640721" + "344003442002691613772056762099098025739332715913970186225176" + "459563484134139746647940170537900275350480490468851439300771" + "949915194703080576611022590670399844931867609777417528903454" + "731922206378932141464755402629420074293816349270038351339419" + "146768473851353171629153912238797141905920143036064131705230" + "421762305232861503856799511155936565169005916711845389135580" + "928162511912438531204156138447775120789548666143600293412065" + "767167106888509172568003530668539460588248316513392652567856" + "224602697296203328920073354425994044956624831346979458846837" + "597950064151867164583749203433942592178528868981311575331848" + "941597492470436782387502687532649093096498315347403977436001" + "399982102030846763698994785054617523241463186980898394504211" + "430763617825306895065661536045431497903759118007934839122881" + "885863091769469883539876840543521295706315919855784493235603" + "866268925981702690270202829595794350800918257913991744455922" + "6833433740466716699302196502685546875e-4951", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x8p-16448, + 0x1p-16444, + 0x8p-16448, + 0x1p-16444, + true, + 0xcp-16448, + 0xcp-16448, + 0xcp-16448, + 0xcp-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + true, + 0xcp-16448, + 0xcp-16448, + 0xcp-16448, + 0xcp-16448), + TEST ("5.4677992978237119037926089004291297245985762235403450155814" + "707305425575329500966052143410629387408077958710210208052966" + "529504784489330482549602621133847135082257338717668975178538" + "378957084503396349323438489751160934104796903302909028868611" + "999312592165232778075745690821530731336739429587895774023213" + "939331012985331912661021188896306095323395084578542200319963" + "179359407180003251440084380484161504585462684082946932782829" + "488183829817567452314437076943950532707791252404699268678810" + "198502871250235796855577909830559749628817599194837522029036" + "891995648803056846354520653635957919882905363521007017169741" + "463296044392266269433408052686419017699718627761948763856040" + "592690841721239300491445991666051031755802326720329666454066" + "568630314348735511753639418257984253319063825247065727664852" + "328745422305642626091617823968872438962470092440688372515677" + "832232712866924800106797113478024083516199991991274936894113" + "006233377518471389394984262004503058455485659100090665241525" + "454803628182902241401701783637353179296850056973639305945938" + "813428953287892593620291195986011128990061888798763718548789" + "025717537674780281005583347165047846045925077914824515331335" + "131286063574407181821236377907693209224423490663289916878620" + "725507793163931390372011875799729330162278748985052557432333" + "005334989519381566364065326138465761456173231416844807264090" + "741841972247545424908843928136253653308813487994328446248389" + "608261444391573619177442907290731163188581917588219420107047" + "265367485141413919810885909689112244064797106324295291545892" + "937991321479061743491490060940946128274533657682130125169586" + "930571899403551122506297763180795732325134340989331155893724" + "289358918212707392997768032299997207208451112971425779939507" + "837165263255764268971211819536322993221774123134726665579460" + "265871378186589562858761835613344584269098062275786969729830" + "545786485401407774313414954958161677096004701941411411592755" + "485864471870515173326244464631295701572087440183178339987662" + "926763241220698078822661709054601073523477544653542795020468" + "256078409306409100874886828781860529824879343987945751252081" + "314345990313550683792348814627862441324030155730592166581251" + "009922787324590431548734575328663628650380722603024383412564" + "651446272117561042207738413114131099731016728935023152239431" + "311619533848376583687509108453086730196255111695352464186678" + "221927564757730319825223049341618853631333478241227227268084" + "583396688436229936266854011427192767039363517491659523133852" + "472534104124441112346615696891097070121463652258681270378076" + "538381697594264658479637863087159293838880752928175545408262" + "813403793568695416998388572304528748824756265665683890518422" + "696169422338806137532304784682662448207928681740476188343739" + "117833525916386815135793034906806117413105008719197882837614" + "738262050320291539494104952056471606645482046176634075459021" + "552555959590354956262127809953013679512507451424271839221946" + "794056861055980558363033732905772356986051180966474116423192" + "194741572438649215204229781279620370445373851348786918527399" + "785630808242657122705381806661616271132182017797793661244078" + "445747547535623384548769818529655539279036503234072455810991" + "588075181817695975173110136482659854557506203058080551018873" + "203138260451109855100526720073566126209666125604482413705611" + "996796777927332827103568863352291499261312290355143742018042" + "254470707107847293593205234049774839191754781030496978091006" + "099559675240966730110167624903610656473267105556155633783594" + "089546261107653110531808279445757724399186120387548675148632" + "176049190701680305210224388072261974806791922636412897526952" + "793677946622674149577084803568051242934076450942927092705684" + "547042915490323112457971853658760725588190377666477106903106" + "693847278847646032201293023329503348730723947218797410452333" + "910847913892827195814551858335519518939031446093385329182820" + "714173657946661746005901866885589732922652604573972842197231" + "187365263381958925227970038358064987248233271706462687651143" + "350472018043321314534759819524203308490914358596886150053406" + "629512434788155355109100540319857813535695923273426256911552" + "977539394209918630668466632881929661971212772444625151371953" + "428875491139683919687008724010475217255347915698820960215217" + "257390308560235323463096946442080548018754166369706161589705" + "215873687166365628787796501470056870127729464714362172216802" + "441045276911597009443281135389729130222603185665646434661947" + "627628077723219376892727386120519287577405410510114936151502" + "752997122750262781911372625997223415283516995479265631485799" + "456782561734766648462849641064097181818204279498552827825384" + "186202065516999362573388136163077477126602169410435905014077" + "049808497409025369325795765272066650278004200357878990911374" + "982857977108488482528354406313893864211497105765030504600982" + "253488805474531798742143374465080240030582370086699167937651" + "038307909706139327119325418854546478285735654541635477790346" + "964782617354265050767878335230272194896680141986745074630225" + "893106573559558843545841186025169531604151588481389164948914" + "823593944287133336263680358191369540321930649824471425485137" + "777984823525402115151171093313613251350685343824859052220126" + "891551966018355920872775724807128769003243129486808733796350" + "497668255116485157191011858830643898323628223472099280243583" + "164434348347014910398004439821970508280440872759395827943270" + "985008769143562351938091476215083548164137333541883808870019" + "116234099013452929807950151652297436436006149684939775781234" + "660954156154478642694176038524277810483833149798681345708089" + "152179193979463169402340611793486272301808073267534612685593" + "859596787866884211031341417903391749825320454663508370385251" + "831778477311017089729361152161928815389818579983544490982891" + "734081131312309744330960666031291451740885503458543884956367" + "654943799264600314531815427932691107874782328654759293575803" + "481929361961781073958502075438499070633193799699311694287183" + "299423475339817655608058724723221867087563064557636112380829" + "514501382073257737022472866608244164310385205213523702910787" + "182472517125030106491031844871593141759729773907719510044049" + "352857426592936763727969496103940591601975078602859660478614" + "119405428212830134490731706220583788265344728818766885126977" + "588151111984290444321648931907188080336064713873288834096229" + "203276676119810521851726133377700616341304257822975788967472" + "152742255041912584197045423031298506219011800240120182445838" + "590696647416285334515631019799007515682004250060857020904012" + "215375170479800482680554499806010766109655061507421747722461" + "180617361402575082294678925605271083587897845390768226405648" + "508518103525778638618195775128516073959272990148239415346263" + "486966573934577450787243667063244378381883115827207605856174" + "876350045086885320626669331311880593775916269643646395423220" + "549940790476989709243027420158390806135690975149384714684219" + "964938182719962913931464979458639185519531490009437619838306" + "362365453754807654884704163490469296444427144778593725687358" + "437087390151990694667516279202024332494828210657618261952038" + "597230263799412584275851667403910657370879707181053365818502" + "680037431560091209982641738995652793235851569372314130107647" + "166085235615697257094269133100914135783178856280392139325001" + "352841718610484616627448189556913621837791650699820323059708" + "766420810133584841826718631681683381743511974264126250984214" + "812397119978273917903889865891718836792263377888052458189238" + "746074986456016681098722869419588274020181430652732817858728" + "473849369539367463917171317324882099804999043054467247785592" + "038464723442276239896066431580123756428540074945472427752568" + "981171400621705853374875885943072600692576914790467205905272" + "372594740187988081900317493185005142913607163380720069786786" + "782095331840893694073778325119471833528492917081008547303414" + "509381563617864195257751546539575461435803625993888325647883" + "541039192368366987400263049681218831477776345118518503709588" + "840859023379762456561030683928115349942393963185677123055324" + "771693784214924931737043793679546051454845624150270955450608" + "318747395755728950832754611277041359602301205138509175543313" + "522772786504141007552691902249572375175731740923618769197304" + "652898352694386665448260033458575323252814233868098279476166" + "764258284911434288072243178941698347365985427696983129579496" + "059032032841281149923518087084876885114369033227736521245740" + "554711771423492719899982357711910225545480424688322195336240" + "492253136281857837808491795993788199125205555222116581071134" + "476787468430539307909617442106685159519071053844987343666452" + "494280317720153567054364117244775141336558406098548803924509" + "496052261825198043140272655303625315605326569530252885854991" + "822289219201218313590745412010446642247111703901991591338062" + "693320157180618736569439969283245279430312651192668788340033" + "626825194260296262959884258597703584888770801961209652822982" + "322376122303586169861685106043820510444293432856251210395693" + "261264867823980172683352796141772210301725997652373804152525" + "037162852291403804455997331367378463632437773242905518075065" + "414724295857460288225400061608664961649196400079359622673770" + "607898395269075056596627116148289491042491764170924014885106" + "158235482774778418134123293974436877051995673618683751115353" + "808771434984204447736174758316063096245047311279841579995578" + "186609402864244042751443128536278453430633423118662852688374" + "229600894418958824842459450540826176452145829389286103522774" + "101195556029650753254244433565937938526828990893149766298997" + "738359913887178888607190765709867052470880785937935110091424" + "743449966353497865681753841380246075612094033617488674676296" + "822570077027076266879557913673839341012099558043806442348798" + "053951239274913334631522409564461770434875790402230022872647" + "568436177018658068697071731879399180374560963492726714528729" + "224208938589940272515747888379118461617702271694075087419634" + "147298076764775745707026934442908236664400557265527951453482" + "191684597674273691978253678690951178777239573925410438679099" + "374700609973920128201422381329108236575369403675960765238333" + "778127017096574296148321075566959285042221837159799800133563" + "239963969638610872680393210300180152020613051613414547163713" + "772512617757277955979895866367571776456268564191092477027650" + "135832200376440239783726540552694851717269598489288851529660" + "975027775639565229734596726205832668434979354541943345062977" + "891187146561050118118108223323735210843681128615413601091222" + "007912350536959777114306541514511332368936078560929788143798" + "814391221507522370648646767364209132147312407014953113532379" + "838195728491128536978285918066991040993153064356179903885952" + "027952713749653604502053512355449916680887234238773855581636" + "172479594866871765094513940103284167914110196720261110812716" + "776424260154507395050380575452850420730818412994731079307343" + "538376880280124019321040198038723558784544408584344466090982" + "802067326529000931562048932875469079874956595180595395347093" + "285140279165467965596318365749701535812384333240968283640721" + "344003442002691613772056762099098025739332715913970186225176" + "459563484134139746647940170537900275350480490468851439300771" + "949915194703080576611022590670399844931867609777417528903454" + "731922206378932141464755402629420074293816349270038351339419" + "146768473851353171629153912238797141905920143036064131705230" + "421762305232861503856799511155936565169005916711845389135580" + "928162511912438531204156138447775120789548666143600293412065" + "767167106888509172568003530668539460588248316513392652567856" + "224602697296203328920073354425994044956624831346979458846837" + "597950064151867164583749203433942592178528868981311575331848" + "941597492470436782387502687532649093096498315347403977436001" + "399982102030846763698994785054617523241463186980898394504211" + "430763617825306895065661536045431497903759118007934839122881" + "885863091769469883539876840543521295706315919855784493235603" + "866268925981702690270202829595794350800918257913991744455922" + "683343374046671669930219650268554687501e-4951", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x8p-16448, + 0x1p-16444, + 0x8p-16448, + 0x1p-16444, + false, + 0xcp-16448, + 0xcp-16448, + 0xcp-16448, + 0x1p-16444, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0xcp-16448, + 0xcp-16448, + 0xcp-16448, + 0xc.000000000004p-16448), + TEST ("-5.467799297823711903792608900429129724598576223540345015581" + "470730542557532950096605214341062938740807795871021020805296" + "652950478448933048254960262113384713508225733871766897517853" + "837895708450339634932343848975116093410479690330290902886861" + "199931259216523277807574569082153073133673942958789577402321" + "393933101298533191266102118889630609532339508457854220031996" + "317935940718000325144008438048416150458546268408294693278282" + "948818382981756745231443707694395053270779125240469926867881" + "019850287125023579685557790983055974962881759919483752202903" + "689199564880305684635452065363595791988290536352100701716974" + "146329604439226626943340805268641901769971862776194876385604" + "059269084172123930049144599166605103175580232672032966645406" + "656863031434873551175363941825798425331906382524706572766485" + "232874542230564262609161782396887243896247009244068837251567" + "783223271286692480010679711347802408351619999199127493689411" + "300623337751847138939498426200450305845548565910009066524152" + "545480362818290224140170178363735317929685005697363930594593" + "881342895328789259362029119598601112899006188879876371854878" + "902571753767478028100558334716504784604592507791482451533133" + "513128606357440718182123637790769320922442349066328991687862" + "072550779316393139037201187579972933016227874898505255743233" + "300533498951938156636406532613846576145617323141684480726409" + "074184197224754542490884392813625365330881348799432844624838" + "960826144439157361917744290729073116318858191758821942010704" + "726536748514141391981088590968911224406479710632429529154589" + "293799132147906174349149006094094612827453365768213012516958" + "693057189940355112250629776318079573232513434098933115589372" + "428935891821270739299776803229999720720845111297142577993950" + "783716526325576426897121181953632299322177412313472666557946" + "026587137818658956285876183561334458426909806227578696972983" + "054578648540140777431341495495816167709600470194141141159275" + "548586447187051517332624446463129570157208744018317833998766" + "292676324122069807882266170905460107352347754465354279502046" + "825607840930640910087488682878186052982487934398794575125208" + "131434599031355068379234881462786244132403015573059216658125" + "100992278732459043154873457532866362865038072260302438341256" + "465144627211756104220773841311413109973101672893502315223943" + "131161953384837658368750910845308673019625511169535246418667" + "822192756475773031982522304934161885363133347824122722726808" + "458339668843622993626685401142719276703936351749165952313385" + "247253410412444111234661569689109707012146365225868127037807" + "653838169759426465847963786308715929383888075292817554540826" + "281340379356869541699838857230452874882475626566568389051842" + "269616942233880613753230478468266244820792868174047618834373" + "911783352591638681513579303490680611741310500871919788283761" + "473826205032029153949410495205647160664548204617663407545902" + "155255595959035495626212780995301367951250745142427183922194" + "679405686105598055836303373290577235698605118096647411642319" + "219474157243864921520422978127962037044537385134878691852739" + "978563080824265712270538180666161627113218201779779366124407" + "844574754753562338454876981852965553927903650323407245581099" + "158807518181769597517311013648265985455750620305808055101887" + "320313826045110985510052672007356612620966612560448241370561" + "199679677792733282710356886335229149926131229035514374201804" + "225447070710784729359320523404977483919175478103049697809100" + "609955967524096673011016762490361065647326710555615563378359" + "408954626110765311053180827944575772439918612038754867514863" + "217604919070168030521022438807226197480679192263641289752695" + "279367794662267414957708480356805124293407645094292709270568" + "454704291549032311245797185365876072558819037766647710690310" + "669384727884764603220129302332950334873072394721879741045233" + "391084791389282719581455185833551951893903144609338532918282" + "071417365794666174600590186688558973292265260457397284219723" + "118736526338195892522797003835806498724823327170646268765114" + "335047201804332131453475981952420330849091435859688615005340" + "662951243478815535510910054031985781353569592327342625691155" + "297753939420991863066846663288192966197121277244462515137195" + "342887549113968391968700872401047521725534791569882096021521" + "725739030856023532346309694644208054801875416636970616158970" + "521587368716636562878779650147005687012772946471436217221680" + "244104527691159700944328113538972913022260318566564643466194" + "762762807772321937689272738612051928757740541051011493615150" + "275299712275026278191137262599722341528351699547926563148579" + "945678256173476664846284964106409718181820427949855282782538" + "418620206551699936257338813616307747712660216941043590501407" + "704980849740902536932579576527206665027800420035787899091137" + "498285797710848848252835440631389386421149710576503050460098" + "225348880547453179874214337446508024003058237008669916793765" + "103830790970613932711932541885454647828573565454163547779034" + "696478261735426505076787833523027219489668014198674507463022" + "589310657355955884354584118602516953160415158848138916494891" + "482359394428713333626368035819136954032193064982447142548513" + "777798482352540211515117109331361325135068534382485905222012" + "689155196601835592087277572480712876900324312948680873379635" + "049766825511648515719101185883064389832362822347209928024358" + "316443434834701491039800443982197050828044087275939582794327" + "098500876914356235193809147621508354816413733354188380887001" + "911623409901345292980795015165229743643600614968493977578123" + "466095415615447864269417603852427781048383314979868134570808" + "915217919397946316940234061179348627230180807326753461268559" + "385959678786688421103134141790339174982532045466350837038525" + "183177847731101708972936115216192881538981857998354449098289" + "173408113131230974433096066603129145174088550345854388495636" + "765494379926460031453181542793269110787478232865475929357580" + "348192936196178107395850207543849907063319379969931169428718" + "329942347533981765560805872472322186708756306455763611238082" + "951450138207325773702247286660824416431038520521352370291078" + "718247251712503010649103184487159314175972977390771951004404" + "935285742659293676372796949610394059160197507860285966047861" + "411940542821283013449073170622058378826534472881876688512697" + "758815111198429044432164893190718808033606471387328883409622" + "920327667611981052185172613337770061634130425782297578896747" + "215274225504191258419704542303129850621901180024012018244583" + "859069664741628533451563101979900751568200425006085702090401" + "221537517047980048268055449980601076610965506150742174772246" + "118061736140257508229467892560527108358789784539076822640564" + "850851810352577863861819577512851607395927299014823941534626" + "348696657393457745078724366706324437838188311582720760585617" + "487635004508688532062666933131188059377591626964364639542322" + "054994079047698970924302742015839080613569097514938471468421" + "996493818271996291393146497945863918551953149000943761983830" + "636236545375480765488470416349046929644442714477859372568735" + "843708739015199069466751627920202433249482821065761826195203" + "859723026379941258427585166740391065737087970718105336581850" + "268003743156009120998264173899565279323585156937231413010764" + "716608523561569725709426913310091413578317885628039213932500" + "135284171861048461662744818955691362183779165069982032305970" + "876642081013358484182671863168168338174351197426412625098421" + "481239711997827391790388986589171883679226337788805245818923" + "874607498645601668109872286941958827402018143065273281785872" + "847384936953936746391717131732488209980499904305446724778559" + "203846472344227623989606643158012375642854007494547242775256" + "898117140062170585337487588594307260069257691479046720590527" + "237259474018798808190031749318500514291360716338072006978678" + "678209533184089369407377832511947183352849291708100854730341" + "450938156361786419525775154653957546143580362599388832564788" + "354103919236836698740026304968121883147777634511851850370958" + "884085902337976245656103068392811534994239396318567712305532" + "477169378421492493173704379367954605145484562415027095545060" + "831874739575572895083275461127704135960230120513850917554331" + "352277278650414100755269190224957237517573174092361876919730" + "465289835269438666544826003345857532325281423386809827947616" + "676425828491143428807224317894169834736598542769698312957949" + "605903203284128114992351808708487688511436903322773652124574" + "055471177142349271989998235771191022554548042468832219533624" + "049225313628185783780849179599378819912520555522211658107113" + "447678746843053930790961744210668515951907105384498734366645" + "249428031772015356705436411724477514133655840609854880392450" + "949605226182519804314027265530362531560532656953025288585499" + "182228921920121831359074541201044664224711170390199159133806" + "269332015718061873656943996928324527943031265119266878834003" + "362682519426029626295988425859770358488877080196120965282298" + "232237612230358616986168510604382051044429343285625121039569" + "326126486782398017268335279614177221030172599765237380415252" + "503716285229140380445599733136737846363243777324290551807506" + "541472429585746028822540006160866496164919640007935962267377" + "060789839526907505659662711614828949104249176417092401488510" + "615823548277477841813412329397443687705199567361868375111535" + "380877143498420444773617475831606309624504731127984157999557" + "818660940286424404275144312853627845343063342311866285268837" + "422960089441895882484245945054082617645214582938928610352277" + "410119555602965075325424443356593793852682899089314976629899" + "773835991388717888860719076570986705247088078593793511009142" + "474344996635349786568175384138024607561209403361748867467629" + "682257007702707626687955791367383934101209955804380644234879" + "805395123927491333463152240956446177043487579040223002287264" + "756843617701865806869707173187939918037456096349272671452872" + "922420893858994027251574788837911846161770227169407508741963" + "414729807676477574570702693444290823666440055726552795145348" + "219168459767427369197825367869095117877723957392541043867909" + "937470060997392012820142238132910823657536940367596076523833" + "377812701709657429614832107556695928504222183715979980013356" + "323996396963861087268039321030018015202061305161341454716371" + "377251261775727795597989586636757177645626856419109247702765" + "013583220037644023978372654055269485171726959848928885152966" + "097502777563956522973459672620583266843497935454194334506297" + "789118714656105011811810822332373521084368112861541360109122" + "200791235053695977711430654151451133236893607856092978814379" + "881439122150752237064864676736420913214731240701495311353237" + "983819572849112853697828591806699104099315306435617990388595" + "202795271374965360450205351235544991668088723423877385558163" + "617247959486687176509451394010328416791411019672026111081271" + "677642426015450739505038057545285042073081841299473107930734" + "353837688028012401932104019803872355878454440858434446609098" + "280206732652900093156204893287546907987495659518059539534709" + "328514027916546796559631836574970153581238433324096828364072" + "134400344200269161377205676209909802573933271591397018622517" + "645956348413413974664794017053790027535048049046885143930077" + "194991519470308057661102259067039984493186760977741752890345" + "473192220637893214146475540262942007429381634927003835133941" + "914676847385135317162915391223879714190592014303606413170523" + "042176230523286150385679951115593656516900591671184538913558" + "092816251191243853120415613844777512078954866614360029341206" + "576716710688850917256800353066853946058824831651339265256785" + "622460269729620332892007335442599404495662483134697945884683" + "759795006415186716458374920343394259217852886898131157533184" + "894159749247043678238750268753264909309649831534740397743600" + "139998210203084676369899478505461752324146318698089839450421" + "143076361782530689506566153604543149790375911800793483912288" + "188586309176946988353987684054352129570631591985578449323560" + "386626892598170269027020282959579435080091825791399174445592" + "2683343374046671669930219650268554687499e-4951", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x1p-16444, + -0x8p-16448, + -0x8p-16448, + -0x8p-16448, + false, + -0xcp-16448, + -0xcp-16448, + -0x8p-16448, + -0x8p-16448, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0xcp-16448, + -0xcp-16448, + -0xb.fffffffffffcp-16448, + -0xb.fffffffffffcp-16448), + TEST ("-5.467799297823711903792608900429129724598576223540345015581" + "470730542557532950096605214341062938740807795871021020805296" + "652950478448933048254960262113384713508225733871766897517853" + "837895708450339634932343848975116093410479690330290902886861" + "199931259216523277807574569082153073133673942958789577402321" + "393933101298533191266102118889630609532339508457854220031996" + "317935940718000325144008438048416150458546268408294693278282" + "948818382981756745231443707694395053270779125240469926867881" + "019850287125023579685557790983055974962881759919483752202903" + "689199564880305684635452065363595791988290536352100701716974" + "146329604439226626943340805268641901769971862776194876385604" + "059269084172123930049144599166605103175580232672032966645406" + "656863031434873551175363941825798425331906382524706572766485" + "232874542230564262609161782396887243896247009244068837251567" + "783223271286692480010679711347802408351619999199127493689411" + "300623337751847138939498426200450305845548565910009066524152" + "545480362818290224140170178363735317929685005697363930594593" + "881342895328789259362029119598601112899006188879876371854878" + "902571753767478028100558334716504784604592507791482451533133" + "513128606357440718182123637790769320922442349066328991687862" + "072550779316393139037201187579972933016227874898505255743233" + "300533498951938156636406532613846576145617323141684480726409" + "074184197224754542490884392813625365330881348799432844624838" + "960826144439157361917744290729073116318858191758821942010704" + "726536748514141391981088590968911224406479710632429529154589" + "293799132147906174349149006094094612827453365768213012516958" + "693057189940355112250629776318079573232513434098933115589372" + "428935891821270739299776803229999720720845111297142577993950" + "783716526325576426897121181953632299322177412313472666557946" + "026587137818658956285876183561334458426909806227578696972983" + "054578648540140777431341495495816167709600470194141141159275" + "548586447187051517332624446463129570157208744018317833998766" + "292676324122069807882266170905460107352347754465354279502046" + "825607840930640910087488682878186052982487934398794575125208" + "131434599031355068379234881462786244132403015573059216658125" + "100992278732459043154873457532866362865038072260302438341256" + "465144627211756104220773841311413109973101672893502315223943" + "131161953384837658368750910845308673019625511169535246418667" + "822192756475773031982522304934161885363133347824122722726808" + "458339668843622993626685401142719276703936351749165952313385" + "247253410412444111234661569689109707012146365225868127037807" + "653838169759426465847963786308715929383888075292817554540826" + "281340379356869541699838857230452874882475626566568389051842" + "269616942233880613753230478468266244820792868174047618834373" + "911783352591638681513579303490680611741310500871919788283761" + "473826205032029153949410495205647160664548204617663407545902" + "155255595959035495626212780995301367951250745142427183922194" + "679405686105598055836303373290577235698605118096647411642319" + "219474157243864921520422978127962037044537385134878691852739" + "978563080824265712270538180666161627113218201779779366124407" + "844574754753562338454876981852965553927903650323407245581099" + "158807518181769597517311013648265985455750620305808055101887" + "320313826045110985510052672007356612620966612560448241370561" + "199679677792733282710356886335229149926131229035514374201804" + "225447070710784729359320523404977483919175478103049697809100" + "609955967524096673011016762490361065647326710555615563378359" + "408954626110765311053180827944575772439918612038754867514863" + "217604919070168030521022438807226197480679192263641289752695" + "279367794662267414957708480356805124293407645094292709270568" + "454704291549032311245797185365876072558819037766647710690310" + "669384727884764603220129302332950334873072394721879741045233" + "391084791389282719581455185833551951893903144609338532918282" + "071417365794666174600590186688558973292265260457397284219723" + "118736526338195892522797003835806498724823327170646268765114" + "335047201804332131453475981952420330849091435859688615005340" + "662951243478815535510910054031985781353569592327342625691155" + "297753939420991863066846663288192966197121277244462515137195" + "342887549113968391968700872401047521725534791569882096021521" + "725739030856023532346309694644208054801875416636970616158970" + "521587368716636562878779650147005687012772946471436217221680" + "244104527691159700944328113538972913022260318566564643466194" + "762762807772321937689272738612051928757740541051011493615150" + "275299712275026278191137262599722341528351699547926563148579" + "945678256173476664846284964106409718181820427949855282782538" + "418620206551699936257338813616307747712660216941043590501407" + "704980849740902536932579576527206665027800420035787899091137" + "498285797710848848252835440631389386421149710576503050460098" + "225348880547453179874214337446508024003058237008669916793765" + "103830790970613932711932541885454647828573565454163547779034" + "696478261735426505076787833523027219489668014198674507463022" + "589310657355955884354584118602516953160415158848138916494891" + "482359394428713333626368035819136954032193064982447142548513" + "777798482352540211515117109331361325135068534382485905222012" + "689155196601835592087277572480712876900324312948680873379635" + "049766825511648515719101185883064389832362822347209928024358" + "316443434834701491039800443982197050828044087275939582794327" + "098500876914356235193809147621508354816413733354188380887001" + "911623409901345292980795015165229743643600614968493977578123" + "466095415615447864269417603852427781048383314979868134570808" + "915217919397946316940234061179348627230180807326753461268559" + "385959678786688421103134141790339174982532045466350837038525" + "183177847731101708972936115216192881538981857998354449098289" + "173408113131230974433096066603129145174088550345854388495636" + "765494379926460031453181542793269110787478232865475929357580" + "348192936196178107395850207543849907063319379969931169428718" + "329942347533981765560805872472322186708756306455763611238082" + "951450138207325773702247286660824416431038520521352370291078" + "718247251712503010649103184487159314175972977390771951004404" + "935285742659293676372796949610394059160197507860285966047861" + "411940542821283013449073170622058378826534472881876688512697" + "758815111198429044432164893190718808033606471387328883409622" + "920327667611981052185172613337770061634130425782297578896747" + "215274225504191258419704542303129850621901180024012018244583" + "859069664741628533451563101979900751568200425006085702090401" + "221537517047980048268055449980601076610965506150742174772246" + "118061736140257508229467892560527108358789784539076822640564" + "850851810352577863861819577512851607395927299014823941534626" + "348696657393457745078724366706324437838188311582720760585617" + "487635004508688532062666933131188059377591626964364639542322" + "054994079047698970924302742015839080613569097514938471468421" + "996493818271996291393146497945863918551953149000943761983830" + "636236545375480765488470416349046929644442714477859372568735" + "843708739015199069466751627920202433249482821065761826195203" + "859723026379941258427585166740391065737087970718105336581850" + "268003743156009120998264173899565279323585156937231413010764" + "716608523561569725709426913310091413578317885628039213932500" + "135284171861048461662744818955691362183779165069982032305970" + "876642081013358484182671863168168338174351197426412625098421" + "481239711997827391790388986589171883679226337788805245818923" + "874607498645601668109872286941958827402018143065273281785872" + "847384936953936746391717131732488209980499904305446724778559" + "203846472344227623989606643158012375642854007494547242775256" + "898117140062170585337487588594307260069257691479046720590527" + "237259474018798808190031749318500514291360716338072006978678" + "678209533184089369407377832511947183352849291708100854730341" + "450938156361786419525775154653957546143580362599388832564788" + "354103919236836698740026304968121883147777634511851850370958" + "884085902337976245656103068392811534994239396318567712305532" + "477169378421492493173704379367954605145484562415027095545060" + "831874739575572895083275461127704135960230120513850917554331" + "352277278650414100755269190224957237517573174092361876919730" + "465289835269438666544826003345857532325281423386809827947616" + "676425828491143428807224317894169834736598542769698312957949" + "605903203284128114992351808708487688511436903322773652124574" + "055471177142349271989998235771191022554548042468832219533624" + "049225313628185783780849179599378819912520555522211658107113" + "447678746843053930790961744210668515951907105384498734366645" + "249428031772015356705436411724477514133655840609854880392450" + "949605226182519804314027265530362531560532656953025288585499" + "182228921920121831359074541201044664224711170390199159133806" + "269332015718061873656943996928324527943031265119266878834003" + "362682519426029626295988425859770358488877080196120965282298" + "232237612230358616986168510604382051044429343285625121039569" + "326126486782398017268335279614177221030172599765237380415252" + "503716285229140380445599733136737846363243777324290551807506" + "541472429585746028822540006160866496164919640007935962267377" + "060789839526907505659662711614828949104249176417092401488510" + "615823548277477841813412329397443687705199567361868375111535" + "380877143498420444773617475831606309624504731127984157999557" + "818660940286424404275144312853627845343063342311866285268837" + "422960089441895882484245945054082617645214582938928610352277" + "410119555602965075325424443356593793852682899089314976629899" + "773835991388717888860719076570986705247088078593793511009142" + "474344996635349786568175384138024607561209403361748867467629" + "682257007702707626687955791367383934101209955804380644234879" + "805395123927491333463152240956446177043487579040223002287264" + "756843617701865806869707173187939918037456096349272671452872" + "922420893858994027251574788837911846161770227169407508741963" + "414729807676477574570702693444290823666440055726552795145348" + "219168459767427369197825367869095117877723957392541043867909" + "937470060997392012820142238132910823657536940367596076523833" + "377812701709657429614832107556695928504222183715979980013356" + "323996396963861087268039321030018015202061305161341454716371" + "377251261775727795597989586636757177645626856419109247702765" + "013583220037644023978372654055269485171726959848928885152966" + "097502777563956522973459672620583266843497935454194334506297" + "789118714656105011811810822332373521084368112861541360109122" + "200791235053695977711430654151451133236893607856092978814379" + "881439122150752237064864676736420913214731240701495311353237" + "983819572849112853697828591806699104099315306435617990388595" + "202795271374965360450205351235544991668088723423877385558163" + "617247959486687176509451394010328416791411019672026111081271" + "677642426015450739505038057545285042073081841299473107930734" + "353837688028012401932104019803872355878454440858434446609098" + "280206732652900093156204893287546907987495659518059539534709" + "328514027916546796559631836574970153581238433324096828364072" + "134400344200269161377205676209909802573933271591397018622517" + "645956348413413974664794017053790027535048049046885143930077" + "194991519470308057661102259067039984493186760977741752890345" + "473192220637893214146475540262942007429381634927003835133941" + "914676847385135317162915391223879714190592014303606413170523" + "042176230523286150385679951115593656516900591671184538913558" + "092816251191243853120415613844777512078954866614360029341206" + "576716710688850917256800353066853946058824831651339265256785" + "622460269729620332892007335442599404495662483134697945884683" + "759795006415186716458374920343394259217852886898131157533184" + "894159749247043678238750268753264909309649831534740397743600" + "139998210203084676369899478505461752324146318698089839450421" + "143076361782530689506566153604543149790375911800793483912288" + "188586309176946988353987684054352129570631591985578449323560" + "386626892598170269027020282959579435080091825791399174445592" + "26833433740466716699302196502685546875e-4951", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x1p-16444, + -0x1p-16444, + -0x8p-16448, + -0x8p-16448, + true, + -0xcp-16448, + -0xcp-16448, + -0xcp-16448, + -0xcp-16448, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0xcp-16448, + -0xcp-16448, + -0xcp-16448, + -0xcp-16448), + TEST ("-5.467799297823711903792608900429129724598576223540345015581" + "470730542557532950096605214341062938740807795871021020805296" + "652950478448933048254960262113384713508225733871766897517853" + "837895708450339634932343848975116093410479690330290902886861" + "199931259216523277807574569082153073133673942958789577402321" + "393933101298533191266102118889630609532339508457854220031996" + "317935940718000325144008438048416150458546268408294693278282" + "948818382981756745231443707694395053270779125240469926867881" + "019850287125023579685557790983055974962881759919483752202903" + "689199564880305684635452065363595791988290536352100701716974" + "146329604439226626943340805268641901769971862776194876385604" + "059269084172123930049144599166605103175580232672032966645406" + "656863031434873551175363941825798425331906382524706572766485" + "232874542230564262609161782396887243896247009244068837251567" + "783223271286692480010679711347802408351619999199127493689411" + "300623337751847138939498426200450305845548565910009066524152" + "545480362818290224140170178363735317929685005697363930594593" + "881342895328789259362029119598601112899006188879876371854878" + "902571753767478028100558334716504784604592507791482451533133" + "513128606357440718182123637790769320922442349066328991687862" + "072550779316393139037201187579972933016227874898505255743233" + "300533498951938156636406532613846576145617323141684480726409" + "074184197224754542490884392813625365330881348799432844624838" + "960826144439157361917744290729073116318858191758821942010704" + "726536748514141391981088590968911224406479710632429529154589" + "293799132147906174349149006094094612827453365768213012516958" + "693057189940355112250629776318079573232513434098933115589372" + "428935891821270739299776803229999720720845111297142577993950" + "783716526325576426897121181953632299322177412313472666557946" + "026587137818658956285876183561334458426909806227578696972983" + "054578648540140777431341495495816167709600470194141141159275" + "548586447187051517332624446463129570157208744018317833998766" + "292676324122069807882266170905460107352347754465354279502046" + "825607840930640910087488682878186052982487934398794575125208" + "131434599031355068379234881462786244132403015573059216658125" + "100992278732459043154873457532866362865038072260302438341256" + "465144627211756104220773841311413109973101672893502315223943" + "131161953384837658368750910845308673019625511169535246418667" + "822192756475773031982522304934161885363133347824122722726808" + "458339668843622993626685401142719276703936351749165952313385" + "247253410412444111234661569689109707012146365225868127037807" + "653838169759426465847963786308715929383888075292817554540826" + "281340379356869541699838857230452874882475626566568389051842" + "269616942233880613753230478468266244820792868174047618834373" + "911783352591638681513579303490680611741310500871919788283761" + "473826205032029153949410495205647160664548204617663407545902" + "155255595959035495626212780995301367951250745142427183922194" + "679405686105598055836303373290577235698605118096647411642319" + "219474157243864921520422978127962037044537385134878691852739" + "978563080824265712270538180666161627113218201779779366124407" + "844574754753562338454876981852965553927903650323407245581099" + "158807518181769597517311013648265985455750620305808055101887" + "320313826045110985510052672007356612620966612560448241370561" + "199679677792733282710356886335229149926131229035514374201804" + "225447070710784729359320523404977483919175478103049697809100" + "609955967524096673011016762490361065647326710555615563378359" + "408954626110765311053180827944575772439918612038754867514863" + "217604919070168030521022438807226197480679192263641289752695" + "279367794662267414957708480356805124293407645094292709270568" + "454704291549032311245797185365876072558819037766647710690310" + "669384727884764603220129302332950334873072394721879741045233" + "391084791389282719581455185833551951893903144609338532918282" + "071417365794666174600590186688558973292265260457397284219723" + "118736526338195892522797003835806498724823327170646268765114" + "335047201804332131453475981952420330849091435859688615005340" + "662951243478815535510910054031985781353569592327342625691155" + "297753939420991863066846663288192966197121277244462515137195" + "342887549113968391968700872401047521725534791569882096021521" + "725739030856023532346309694644208054801875416636970616158970" + "521587368716636562878779650147005687012772946471436217221680" + "244104527691159700944328113538972913022260318566564643466194" + "762762807772321937689272738612051928757740541051011493615150" + "275299712275026278191137262599722341528351699547926563148579" + "945678256173476664846284964106409718181820427949855282782538" + "418620206551699936257338813616307747712660216941043590501407" + "704980849740902536932579576527206665027800420035787899091137" + "498285797710848848252835440631389386421149710576503050460098" + "225348880547453179874214337446508024003058237008669916793765" + "103830790970613932711932541885454647828573565454163547779034" + "696478261735426505076787833523027219489668014198674507463022" + "589310657355955884354584118602516953160415158848138916494891" + "482359394428713333626368035819136954032193064982447142548513" + "777798482352540211515117109331361325135068534382485905222012" + "689155196601835592087277572480712876900324312948680873379635" + "049766825511648515719101185883064389832362822347209928024358" + "316443434834701491039800443982197050828044087275939582794327" + "098500876914356235193809147621508354816413733354188380887001" + "911623409901345292980795015165229743643600614968493977578123" + "466095415615447864269417603852427781048383314979868134570808" + "915217919397946316940234061179348627230180807326753461268559" + "385959678786688421103134141790339174982532045466350837038525" + "183177847731101708972936115216192881538981857998354449098289" + "173408113131230974433096066603129145174088550345854388495636" + "765494379926460031453181542793269110787478232865475929357580" + "348192936196178107395850207543849907063319379969931169428718" + "329942347533981765560805872472322186708756306455763611238082" + "951450138207325773702247286660824416431038520521352370291078" + "718247251712503010649103184487159314175972977390771951004404" + "935285742659293676372796949610394059160197507860285966047861" + "411940542821283013449073170622058378826534472881876688512697" + "758815111198429044432164893190718808033606471387328883409622" + "920327667611981052185172613337770061634130425782297578896747" + "215274225504191258419704542303129850621901180024012018244583" + "859069664741628533451563101979900751568200425006085702090401" + "221537517047980048268055449980601076610965506150742174772246" + "118061736140257508229467892560527108358789784539076822640564" + "850851810352577863861819577512851607395927299014823941534626" + "348696657393457745078724366706324437838188311582720760585617" + "487635004508688532062666933131188059377591626964364639542322" + "054994079047698970924302742015839080613569097514938471468421" + "996493818271996291393146497945863918551953149000943761983830" + "636236545375480765488470416349046929644442714477859372568735" + "843708739015199069466751627920202433249482821065761826195203" + "859723026379941258427585166740391065737087970718105336581850" + "268003743156009120998264173899565279323585156937231413010764" + "716608523561569725709426913310091413578317885628039213932500" + "135284171861048461662744818955691362183779165069982032305970" + "876642081013358484182671863168168338174351197426412625098421" + "481239711997827391790388986589171883679226337788805245818923" + "874607498645601668109872286941958827402018143065273281785872" + "847384936953936746391717131732488209980499904305446724778559" + "203846472344227623989606643158012375642854007494547242775256" + "898117140062170585337487588594307260069257691479046720590527" + "237259474018798808190031749318500514291360716338072006978678" + "678209533184089369407377832511947183352849291708100854730341" + "450938156361786419525775154653957546143580362599388832564788" + "354103919236836698740026304968121883147777634511851850370958" + "884085902337976245656103068392811534994239396318567712305532" + "477169378421492493173704379367954605145484562415027095545060" + "831874739575572895083275461127704135960230120513850917554331" + "352277278650414100755269190224957237517573174092361876919730" + "465289835269438666544826003345857532325281423386809827947616" + "676425828491143428807224317894169834736598542769698312957949" + "605903203284128114992351808708487688511436903322773652124574" + "055471177142349271989998235771191022554548042468832219533624" + "049225313628185783780849179599378819912520555522211658107113" + "447678746843053930790961744210668515951907105384498734366645" + "249428031772015356705436411724477514133655840609854880392450" + "949605226182519804314027265530362531560532656953025288585499" + "182228921920121831359074541201044664224711170390199159133806" + "269332015718061873656943996928324527943031265119266878834003" + "362682519426029626295988425859770358488877080196120965282298" + "232237612230358616986168510604382051044429343285625121039569" + "326126486782398017268335279614177221030172599765237380415252" + "503716285229140380445599733136737846363243777324290551807506" + "541472429585746028822540006160866496164919640007935962267377" + "060789839526907505659662711614828949104249176417092401488510" + "615823548277477841813412329397443687705199567361868375111535" + "380877143498420444773617475831606309624504731127984157999557" + "818660940286424404275144312853627845343063342311866285268837" + "422960089441895882484245945054082617645214582938928610352277" + "410119555602965075325424443356593793852682899089314976629899" + "773835991388717888860719076570986705247088078593793511009142" + "474344996635349786568175384138024607561209403361748867467629" + "682257007702707626687955791367383934101209955804380644234879" + "805395123927491333463152240956446177043487579040223002287264" + "756843617701865806869707173187939918037456096349272671452872" + "922420893858994027251574788837911846161770227169407508741963" + "414729807676477574570702693444290823666440055726552795145348" + "219168459767427369197825367869095117877723957392541043867909" + "937470060997392012820142238132910823657536940367596076523833" + "377812701709657429614832107556695928504222183715979980013356" + "323996396963861087268039321030018015202061305161341454716371" + "377251261775727795597989586636757177645626856419109247702765" + "013583220037644023978372654055269485171726959848928885152966" + "097502777563956522973459672620583266843497935454194334506297" + "789118714656105011811810822332373521084368112861541360109122" + "200791235053695977711430654151451133236893607856092978814379" + "881439122150752237064864676736420913214731240701495311353237" + "983819572849112853697828591806699104099315306435617990388595" + "202795271374965360450205351235544991668088723423877385558163" + "617247959486687176509451394010328416791411019672026111081271" + "677642426015450739505038057545285042073081841299473107930734" + "353837688028012401932104019803872355878454440858434446609098" + "280206732652900093156204893287546907987495659518059539534709" + "328514027916546796559631836574970153581238433324096828364072" + "134400344200269161377205676209909802573933271591397018622517" + "645956348413413974664794017053790027535048049046885143930077" + "194991519470308057661102259067039984493186760977741752890345" + "473192220637893214146475540262942007429381634927003835133941" + "914676847385135317162915391223879714190592014303606413170523" + "042176230523286150385679951115593656516900591671184538913558" + "092816251191243853120415613844777512078954866614360029341206" + "576716710688850917256800353066853946058824831651339265256785" + "622460269729620332892007335442599404495662483134697945884683" + "759795006415186716458374920343394259217852886898131157533184" + "894159749247043678238750268753264909309649831534740397743600" + "139998210203084676369899478505461752324146318698089839450421" + "143076361782530689506566153604543149790375911800793483912288" + "188586309176946988353987684054352129570631591985578449323560" + "386626892598170269027020282959579435080091825791399174445592" + "2683343374046671669930219650268554687501e-4951", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x1p-16444, + -0x1p-16444, + -0x8p-16448, + -0x8p-16448, + false, + -0x1p-16444, + -0xcp-16448, + -0xcp-16448, + -0xcp-16448, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0xc.000000000004p-16448, + -0xcp-16448, + -0xcp-16448, + -0xcp-16448), + TEST ("-0x0.7p-149", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0x3.8p-152, + -0x3.8p-152, + -0x3.8p-152, + -0x3.8p-152, + true, + -0x3.8p-152, + -0x3.8p-152, + -0x3.8p-152, + -0x3.8p-152, + true, + -0x3.8p-152, + -0x3.8p-152, + -0x3.8p-152, + -0x3.8p-152, + true, + -0x3.8p-152, + -0x3.8p-152, + -0x3.8p-152, + -0x3.8p-152, + true, + -0x3.8p-152, + -0x3.8p-152, + -0x3.8p-152, + -0x3.8p-152), + TEST ("-0x0.7p-1074", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0x1.cp-1076, + -0x1.cp-1076, + -0x1.cp-1076, + -0x1.cp-1076, + true, + -0x1.cp-1076, + -0x1.cp-1076, + -0x1.cp-1076, + -0x1.cp-1076, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0x1.cp-1076, + -0x1.cp-1076, + -0x1.cp-1076, + -0x1.cp-1076), + TEST ("-0x0.7p-16445", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x8p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-16448, + -0x4p-16448, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0x3.8p-16448, + -0x3.8p-16448, + -0x3.8p-16448, + -0x3.8p-16448), + TEST ("-0x0.7p-16494", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x8p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-16496, + -0x0p+0, + -0x0p+0, + -0x0p+0), + TEST ("0x1p-150", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + true, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4p-152, + true, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4p-152, + true, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4p-152, + true, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4p-152, + true, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4p-152), + TEST ("0x1p-1075", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + true, + 0x2p-1076, + 0x2p-1076, + 0x2p-1076, + 0x2p-1076, + true, + 0x2p-1076, + 0x2p-1076, + 0x2p-1076, + 0x2p-1076, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + true, + 0x2p-1076, + 0x2p-1076, + 0x2p-1076, + 0x2p-1076), + TEST ("0x1p-16446", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-16448, + true, + 0x4p-16448, + 0x4p-16448, + 0x4p-16448, + 0x4p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + true, + 0x4p-16448, + 0x4p-16448, + 0x4p-16448, + 0x4p-16448), + TEST ("0x1p-16495", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-16496), + TEST ("-0x1p-150", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0x4p-152, + -0x4p-152, + -0x4p-152, + -0x4p-152, + true, + -0x4p-152, + -0x4p-152, + -0x4p-152, + -0x4p-152, + true, + -0x4p-152, + -0x4p-152, + -0x4p-152, + -0x4p-152, + true, + -0x4p-152, + -0x4p-152, + -0x4p-152, + -0x4p-152, + true, + -0x4p-152, + -0x4p-152, + -0x4p-152, + -0x4p-152), + TEST ("-0x1p-1075", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0x2p-1076, + -0x2p-1076, + -0x2p-1076, + -0x2p-1076, + true, + -0x2p-1076, + -0x2p-1076, + -0x2p-1076, + -0x2p-1076, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0x2p-1076, + -0x2p-1076, + -0x2p-1076, + -0x2p-1076), + TEST ("-0x1p-16446", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x8p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0x4p-16448, + -0x4p-16448, + -0x4p-16448, + -0x4p-16448, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0x4p-16448, + -0x4p-16448, + -0x4p-16448, + -0x4p-16448), + TEST ("-0x1p-16495", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x8p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-16496, + -0x0p+0, + -0x0p+0, + -0x0p+0), + TEST (".70064923216240853546186479164495807e-45", + false, + 0x0p+0, + 0x8p-152, + 0x0p+0, + 0x8p-152, + false, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4.0000000000004p-152, + false, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4.0000000000000008p-152, + false, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4.0000000000000008p-152, + false, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4.00000000000000000000000002p-152, + false, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4.0000000000000000000000000004p-152), + TEST ("7.0064923216240853546186479164495806564013097093825788587853" + "4141944895541342930300743319094181060791015624e-46", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x3.ffffffffffffep-152, + 0x4p-152, + 0x3.ffffffffffffep-152, + 0x4p-152, + false, + 0x3.fffffffffffffffcp-152, + 0x4p-152, + 0x3.fffffffffffffffcp-152, + 0x4p-152, + false, + 0x3.fffffffffffffffcp-152, + 0x4p-152, + 0x3.fffffffffffffffcp-152, + 0x4p-152, + false, + 0x3.ffffffffffffffffffffffffffp-152, + 0x4p-152, + 0x3.ffffffffffffffffffffffffffp-152, + 0x4p-152, + false, + 0x3.fffffffffffffffffffffffffffep-152, + 0x4p-152, + 0x3.fffffffffffffffffffffffffffep-152, + 0x4p-152), + TEST ("7.0064923216240853546186479164495806564013097093825788587853" + "4141944895541342930300743319094181060791015625e-46", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + true, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4p-152, + true, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4p-152, + true, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4p-152, + true, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4p-152, + true, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4p-152), + TEST ("7.0064923216240853546186479164495806564013097093825788587853" + "4141944895541342930300743319094181060791015626e-46", + false, + 0x0p+0, + 0x8p-152, + 0x0p+0, + 0x8p-152, + false, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4.0000000000004p-152, + false, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4.0000000000000008p-152, + false, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4.0000000000000008p-152, + false, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4.00000000000000000000000002p-152, + false, + 0x4p-152, + 0x4p-152, + 0x4p-152, + 0x4.0000000000000000000000000004p-152), + TEST ("-7.006492321624085354618647916449580656401309709382578858785" + "34141944895541342930300743319094181060791015624e-46", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-152, + -0x4p-152, + -0x3.ffffffffffffep-152, + -0x3.ffffffffffffep-152, + false, + -0x4p-152, + -0x4p-152, + -0x3.fffffffffffffffcp-152, + -0x3.fffffffffffffffcp-152, + false, + -0x4p-152, + -0x4p-152, + -0x3.fffffffffffffffcp-152, + -0x3.fffffffffffffffcp-152, + false, + -0x4p-152, + -0x4p-152, + -0x3.ffffffffffffffffffffffffffp-152, + -0x3.ffffffffffffffffffffffffffp-152, + false, + -0x4p-152, + -0x4p-152, + -0x3.fffffffffffffffffffffffffffep-152, + -0x3.fffffffffffffffffffffffffffep-152), + TEST ("-7.006492321624085354618647916449580656401309709382578858785" + "34141944895541342930300743319094181060791015625e-46", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0x4p-152, + -0x4p-152, + -0x4p-152, + -0x4p-152, + true, + -0x4p-152, + -0x4p-152, + -0x4p-152, + -0x4p-152, + true, + -0x4p-152, + -0x4p-152, + -0x4p-152, + -0x4p-152, + true, + -0x4p-152, + -0x4p-152, + -0x4p-152, + -0x4p-152, + true, + -0x4p-152, + -0x4p-152, + -0x4p-152, + -0x4p-152), + TEST ("-7.006492321624085354618647916449580656401309709382578858785" + "34141944895541342930300743319094181060791015626e-46", + false, + -0x8p-152, + -0x8p-152, + -0x0p+0, + -0x0p+0, + false, + -0x4.0000000000004p-152, + -0x4p-152, + -0x4p-152, + -0x4p-152, + false, + -0x4.0000000000000008p-152, + -0x4p-152, + -0x4p-152, + -0x4p-152, + false, + -0x4.0000000000000008p-152, + -0x4p-152, + -0x4p-152, + -0x4p-152, + false, + -0x4.00000000000000000000000002p-152, + -0x4p-152, + -0x4p-152, + -0x4p-152, + false, + -0x4.0000000000000000000000000004p-152, + -0x4p-152, + -0x4p-152, + -0x4p-152), + TEST ("2.4703282292062327208828439643411068618252990130716238221279" + "284125033775363510437593264991818081799618989828234772285886" + "546332835517796989819938739800539093906315035659515570226392" + "290858392449105184435931802849936536152500319370457678249219" + "365623669863658480757001585769269903706311928279558551332927" + "834338409351978015531246597263579574622766465272827220056374" + "006485499977096599470454020828166226237857393450736339007967" + "761930577506740176324673600968951340535537458516661134223766" + "678604162159680461914467291840300530057530849048765391711386" + "591646239524912623653881879636239373280423891018672348497668" + "235089863388587925628302755995657524455507255189313690836254" + "779186948667994968324049705821028513185451396213837722826145" + "437693412532098591327667236328124e-324", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x1.fffffffffffffffep-1076, + 0x2p-1076, + 0x1.fffffffffffffffep-1076, + 0x2p-1076, + false, + 0x1.fffffffffffffffep-1076, + 0x2p-1076, + 0x1.fffffffffffffffep-1076, + 0x2p-1076, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x1.ffffffffffffffffffffffffffffp-1076, + 0x2p-1076, + 0x1.ffffffffffffffffffffffffffffp-1076, + 0x2p-1076), + TEST ("2.4703282292062327208828439643411068618252990130716238221279" + "284125033775363510437593264991818081799618989828234772285886" + "546332835517796989819938739800539093906315035659515570226392" + "290858392449105184435931802849936536152500319370457678249219" + "365623669863658480757001585769269903706311928279558551332927" + "834338409351978015531246597263579574622766465272827220056374" + "006485499977096599470454020828166226237857393450736339007967" + "761930577506740176324673600968951340535537458516661134223766" + "678604162159680461914467291840300530057530849048765391711386" + "591646239524912623653881879636239373280423891018672348497668" + "235089863388587925628302755995657524455507255189313690836254" + "779186948667994968324049705821028513185451396213837722826145" + "437693412532098591327667236328125e-324", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + true, + 0x2p-1076, + 0x2p-1076, + 0x2p-1076, + 0x2p-1076, + true, + 0x2p-1076, + 0x2p-1076, + 0x2p-1076, + 0x2p-1076, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + true, + 0x2p-1076, + 0x2p-1076, + 0x2p-1076, + 0x2p-1076), + TEST ("2.4703282292062327208828439643411068618252990130716238221279" + "284125033775363510437593264991818081799618989828234772285886" + "546332835517796989819938739800539093906315035659515570226392" + "290858392449105184435931802849936536152500319370457678249219" + "365623669863658480757001585769269903706311928279558551332927" + "834338409351978015531246597263579574622766465272827220056374" + "006485499977096599470454020828166226237857393450736339007967" + "761930577506740176324673600968951340535537458516661134223766" + "678604162159680461914467291840300530057530849048765391711386" + "591646239524912623653881879636239373280423891018672348497668" + "235089863388587925628302755995657524455507255189313690836254" + "779186948667994968324049705821028513185451396213837722826145" + "437693412532098591327667236328126e-324", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x4p-1076, + 0x0p+0, + 0x4p-1076, + false, + 0x2p-1076, + 0x2p-1076, + 0x2p-1076, + 0x2.0000000000000004p-1076, + false, + 0x2p-1076, + 0x2p-1076, + 0x2p-1076, + 0x2.0000000000000004p-1076, + false, + 0x0p+0, + 0x4p-1076, + 0x0p+0, + 0x4p-1076, + false, + 0x2p-1076, + 0x2p-1076, + 0x2p-1076, + 0x2.0000000000000000000000000002p-1076), + TEST ("-2.470328229206232720882843964341106861825299013071623822127" + "928412503377536351043759326499181808179961898982823477228588" + "654633283551779698981993873980053909390631503565951557022639" + "229085839244910518443593180284993653615250031937045767824921" + "936562366986365848075700158576926990370631192827955855133292" + "783433840935197801553124659726357957462276646527282722005637" + "400648549997709659947045402082816622623785739345073633900796" + "776193057750674017632467360096895134053553745851666113422376" + "667860416215968046191446729184030053005753084904876539171138" + "659164623952491262365388187963623937328042389101867234849766" + "823508986338858792562830275599565752445550725518931369083625" + "477918694866799496832404970582102851318545139621383772282614" + "5437693412532098591327667236328124e-324", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x2p-1076, + -0x2p-1076, + -0x1.fffffffffffffffep-1076, + -0x1.fffffffffffffffep-1076, + false, + -0x2p-1076, + -0x2p-1076, + -0x1.fffffffffffffffep-1076, + -0x1.fffffffffffffffep-1076, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x2p-1076, + -0x2p-1076, + -0x1.ffffffffffffffffffffffffffffp-1076, + -0x1.ffffffffffffffffffffffffffffp-1076), + TEST ("-2.470328229206232720882843964341106861825299013071623822127" + "928412503377536351043759326499181808179961898982823477228588" + "654633283551779698981993873980053909390631503565951557022639" + "229085839244910518443593180284993653615250031937045767824921" + "936562366986365848075700158576926990370631192827955855133292" + "783433840935197801553124659726357957462276646527282722005637" + "400648549997709659947045402082816622623785739345073633900796" + "776193057750674017632467360096895134053553745851666113422376" + "667860416215968046191446729184030053005753084904876539171138" + "659164623952491262365388187963623937328042389101867234849766" + "823508986338858792562830275599565752445550725518931369083625" + "477918694866799496832404970582102851318545139621383772282614" + "5437693412532098591327667236328125e-324", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0x2p-1076, + -0x2p-1076, + -0x2p-1076, + -0x2p-1076, + true, + -0x2p-1076, + -0x2p-1076, + -0x2p-1076, + -0x2p-1076, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0x2p-1076, + -0x2p-1076, + -0x2p-1076, + -0x2p-1076), + TEST ("-2.470328229206232720882843964341106861825299013071623822127" + "928412503377536351043759326499181808179961898982823477228588" + "654633283551779698981993873980053909390631503565951557022639" + "229085839244910518443593180284993653615250031937045767824921" + "936562366986365848075700158576926990370631192827955855133292" + "783433840935197801553124659726357957462276646527282722005637" + "400648549997709659947045402082816622623785739345073633900796" + "776193057750674017632467360096895134053553745851666113422376" + "667860416215968046191446729184030053005753084904876539171138" + "659164623952491262365388187963623937328042389101867234849766" + "823508986338858792562830275599565752445550725518931369083625" + "477918694866799496832404970582102851318545139621383772282614" + "5437693412532098591327667236328126e-324", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + false, + -0x2.0000000000000004p-1076, + -0x2p-1076, + -0x2p-1076, + -0x2p-1076, + false, + -0x2.0000000000000004p-1076, + -0x2p-1076, + -0x2p-1076, + -0x2p-1076, + false, + -0x4p-1076, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + false, + -0x2.0000000000000000000000000002p-1076, + -0x2p-1076, + -0x2p-1076, + -0x2p-1076), + TEST ("1.8225997659412373012642029668097099081995254078467816718604" + "902435141858443166988684047803543129136025986236736736017655" + "509834928163110160849867540377949045027419112905889658392846" + "126319028167798783107812829917053644701598967767636342956203" + "999770864055077592691915230273843577112246476529298591341071" + "313110337661777304220340396298768698441131694859514066773321" + "059786469060001083813361460161387168195154228027648977594276" + "496061276605855817438145692314650177569263750801566422892936" + "732834290416745265618525969943519916542939199731612507343012" + "297331882934352282118173551211985973294301787840335672389913" + "821098681464088756477802684228806339233239542587316254618680" + "197563613907079766830481997222017010585267442240109888818022" + "189543438116245170584546472752661417773021275082355242554950" + "776248474101880875363872607989624146320823364146896124171892" + "610744237622308266702265704492674694505399997330424978964704" + "335411125839490463131661420668167686151828553033363555080508" + "484934542727634080467233927879117726432283352324546435315312" + "937809651095964197873430398662003709663353962932921239516263" + "008572512558260093668527782388349282015308359304941505110445" + "043762021191469060607078792635897736408141163554429972292873" + "575169264387977130124003958599909776720759582995017519144111" + "001778329839793855454688442046155253818724410472281602421363" + "580613990749181808302947976045417884436271162664776148749463" + "202753814797191206392480969096910387729527305862739806702349" + "088455828380471306603628636563037414688265702108098430515297" + "645997107159687247830496686980315376091511219227376708389862" + "310190633134517040835432587726931910775044780329777051964574" + "763119639404235797665922677433332402402817037657141926646502" + "612388421085254756323737273178774331073924707711575555193153" + "421957126062196520952920611871114861423032687425262323243276" + "848595495133802591437804984986053892365334900647137137197585" + "161954823956838391108748154877098567190695813394392779995887" + "642254413740232692940887236351533691174492514884514265006822" + "752026136435469700291628942927286843274959781329315250417360" + "438115330104516894597449604875954147108010051910197388860417" + "003307595774863477182911525109554542883460240867674794470854" + "883815424039187014069246137704710366577005576311674384079810" + "437206511282792194562503036151028910065418370565117488062226" + "073975854919243439941741016447206284543777826080409075756028" + "194465562812076645422284670475730922346454505830553174377950" + "824178034708147037448871898963699023373821217419560423459358" + "846127232531421552826545954362386431279626917642725181802754" + "271134597856231805666129524101509582941585421888561296839474" + "232056474112935379177434928227554149402642893913492062781246" + "372611175305462271711931011635602039137701669573065960945871" + "579420683440097179831368317352157202215160682058878025153007" + "184185319863451652087375936651004559837502483808090613073982" + "264685620351993519454344577635257452328683726988824705474397" + "398247190812883071734743260426540123481791283782928972842466" + "595210269414219040901793935553872090377394005932597887081359" + "481915849178541128182923272843218513093012167744690818603663" + "862691727272565325057703378827553284852502067686026850339624" + "401046086817036618366842240024522042069888708534827471235203" + "998932259309110942367856287784097166420437430118381247339347" + "418156902369282431197735078016591613063918260343498992697002" + "033186558413655576703389208301203552157755701852051877927864" + "696515420369217703510602759815252574799728706795849558382877" + "392016396900560101736741462690753991602263974212137632508984" + "264559315540891383192361601189350414311358816980975697568561" + "515680971830107704152657284552920241862730125888825702301035" + "564615759615882010733764341109834449576907982406265803484111" + "303615971297609065271517286111839839646343815364461776394273" + "571391219315553915335300622295196577640884201524657614065743" + "729121754460652975075990012786021662416077757235487562550381" + "116824006014440438178253273174734436163638119532295383351135" + "543170811596051785036366846773285937845231974424475418970517" + "659179798069972876889488877627309887323737590814875050457317" + "809625163713227973229002908003491739085115971899606986738405" + "752463436186745107821032315480693516006251388789902053863235" + "071957895722121876262598833823352290042576488238120724072267" + "480348425637199003147760378463243043407534395221882144887315" + "875876025907739792297575795373506429192468470170038312050500" + "917665707583420927303790875332407805094505665159755210495266" + "485594187244922216154283213688032393939401426499517609275128" + "062067355172333120857796045387692492375534056470145301671359" + "016602832469675123108598588424022216759334733452626330303791" + "660952659036162827509451468771297954737165701921676834866994" + "084496268491510599580714458155026746676860790028899722645883" + "679435969902046442373108472951515492761911884847211825930115" + "654927539118088350255959445076757398298893380662248358210075" + "297702191186519614515280395341723177201383862827129721649638" + "274531314762377778754560119397123180107310216608157141828379" + "259328274508467371717057031104537750450228447941619684073375" + "630517322006118640290925241602376256334414376495602911265450" + "165889418372161719063670619610214632774542741157366426747861" + "054811449449004970132668146607323502760146957586465275981090" + "328336256381187450646030492071694516054712444513961269623339" + "705411366337817643269316717217432478812002049894979925260411" + "553651385384826214231392012841425936827944383266227115236029" + "717393064659821056467446870597828757433936024422511537561864" + "619865595955628070343780472634463916608440151554502790128417" + "277259492437005696576453717387309605129939526661181496994297" + "244693710437436581443653555343763817246961834486181294985455" + "884981266421533438177271809310897035958260776218253097858601" + "160643120653927024652834025146166356877731266566437231429061" + "099807825113272551869352908241073955695854354852545370793609" + "838167127357752579007490955536081388103461735071174567636929" + "060824172375010035497010614957197713919909924635906503348016" + "450952475530978921242656498701313530533991692867619886826204" + "706468476070943378163577235406861262755114909606255628375659" + "196050370661430148107216310635729360112021571291096278032076" + "401092225373270173950575377792566872113768085940991929655824" + "050914085013970861399015141010432835406337266746706727481946" + "196898882472095111505210339933002505227334750020285673634670" + "738458390159933494226851499935336922036551687169140582574153" + "726872453800858360764892975201757027862632615130256075468549" + "502839367841926212872731925042838691319757663382746471782087" + "828988857978192483595747889021081459460627705275735868618724" + "958783348362295106875556443770626864591972089881215465141073" + "516646930158996569747675806719463602045230325049794904894739" + "988312727573320971310488326486213061839843830003145873279435" + "454121817918269218294901387830156432148142381592864575229119" + "479029130050663564889172093067341444164942736885872753984012" + "865743421266470861425283889134636885790293235727017788606167" + "560012477186697069994213912998550931078617189790771376702549" + "055361745205232419031423044366971378594392952093464046441667" + "117613906203494872209149396518971207279263883566606774353236" + "255473603377861613942239543893894460581170658088042083661404" + "937465706659424639301296621963906278930754459296017486063079" + "582024995485338893699574289806529424673393810217577605952909" + "491283123179789154639057105774960699934999681018155749261864" + "012821574480758746632022143860041252142846691648490809250856" + "327057133540568617791625295314357533564192304930155735301757" + "457531580062662693966772497728335047637869054460240023262262" + "260698443946964564691259441706490611176164305693669515767804" + "836460521205954731752583848846525153811934541997962775215961" + "180346397456122329133421016560406277159258781706172834569862" + "946953007793254152187010227976038449980797987728559041018441" + "590564594738308310579014597893182017151615208050090318483536" + "106249131918576316944251537092347119867433735046169725181104" + "507590928834713669184230634083190791725243913641206256399101" + "550966117564795555149420011152858441084271411289366093158722" + "254752761637144762690747726313899449121995142565661043193165" + "353010677613760383307839362361625628371456344409245507081913" + "518237257141164239966660785903970075181826808229440731778746" + "830751045427285945936163931997929399708401851740705527023711" + "492262489476846435969872480702228386506357017948329114555484" + "164760105906717855684788039081591713778852802032849601308169" + "832017420608399347713424218434541771868442189843417628618330" + "607429739733739437863581804003482214082370567967330530446020" + "897773385726872912189813323094415093143437550397556262780011" + "208941731420098754319961419532567861629590267320403217607660" + "774125374101195389953895035347940170148097810952083736798564" + "420421622607993390894450932047257403433908665884124601384175" + "012387617430467934818665777122459487877479257747635172691688" + "471574765285820096075133353869554987216398800026453207557923" + "535966131756358352198875705382763163680830588056974671628368" + "719411827591592806044707764658145625683998557872894583705117" + "936257144994734815912058252772021032081682437093280526665192" + "728869800954748014250481042845426151143544474372887617562791" + "409866964806319608280819816846942058817381943129762034507591" + "367065185343216917751414811188645979508942996964383255432999" + "246119971295726296202396921903289017490293595312645036697141" + "581149988784499288560584613793415358537364677872496224892098" + "940856692342358755626519304557946447004033186014602147449599" + "351317079758304444877174136521487256811625263467410007624215" + "856145392339552689565690577293133060124853654497575571509576" + "408069646196646757505249296126372820539234090564691695806544" + "715766025588258581902342311480969412221466852421842650484494" + "063894865891424563992751226230317059592413191308470146226366" + "458233536657973376067140793776369412191789801225320255079444" + "592709005698858098716107025188986428347407279053266600044521" + "079987989879536957560131070100060050673537683871138182387904" + "590837539252425985326631955455857258818756188063697492342550" + "045277400125480079927908846850898283905756532829762950509886" + "991675925213188409911532242068610889478326451513981115020992" + "630395715520350039372702741107911736947893709538471200363740" + "669304116845653259038102180504837110789645359520309929381266" + "271463740502507456882882255788069710715770802338317704510793" + "279398576163709512326095306022330346997717688118726634628650" + "675984237916551201500684504118483305560295744746257951860545" + "390826531622290588364837980034428055971370065573420370270905" + "592141420051502465016793525150950140243606137664910359769114" + "512792293426708006440346732679574519594848136194781488696994" + "267355775509666977187349644291823026624985531726865131782364" + "428380093055155988532106121916567178604128111080322761213573" + "781334480667563871257352254033032675246444238637990062075058" + "819854494711379915549313390179300091783493496822950479766923" + "983305064901026858870340863556799948310622536592472509634484" + "910640735459644047154918467543140024764605449756679450446473" + "048922824617117723876384637412932380635306714345354710568410" + "140587435077620501285599837051978855056335305570615129711860" + "309387503970812843734718712815925040263182888714533431137355" + "255722368962836390856001176889513153529416105504464217522618" + "741534232432067776306691118141998014985541610448993152948945" + "865983354717289054861249734477980864059509622993770525110616" + "313865830823478927462500895844216364365499438449134659145333" + "799994034010282254566331595018205841080487728993632798168070" + "476921205941768965021887178681810499301253039335978279707627" + "295287697256489961179958946847840431902105306618594831078534" + "622089641993900896756734276531931450266972752637997248151974" + "2277811246822238899767398834228515624e-4951", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-16448, + false, + 0x0p+0, + 0x4p-16448, + 0x0p+0, + 0x4p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x3.fffffffffffcp-16448, + 0x4p-16448, + 0x3.fffffffffffcp-16448, + 0x4p-16448), + TEST ("1.8225997659412373012642029668097099081995254078467816718604" + "902435141858443166988684047803543129136025986236736736017655" + "509834928163110160849867540377949045027419112905889658392846" + "126319028167798783107812829917053644701598967767636342956203" + "999770864055077592691915230273843577112246476529298591341071" + "313110337661777304220340396298768698441131694859514066773321" + "059786469060001083813361460161387168195154228027648977594276" + "496061276605855817438145692314650177569263750801566422892936" + "732834290416745265618525969943519916542939199731612507343012" + "297331882934352282118173551211985973294301787840335672389913" + "821098681464088756477802684228806339233239542587316254618680" + "197563613907079766830481997222017010585267442240109888818022" + "189543438116245170584546472752661417773021275082355242554950" + "776248474101880875363872607989624146320823364146896124171892" + "610744237622308266702265704492674694505399997330424978964704" + "335411125839490463131661420668167686151828553033363555080508" + "484934542727634080467233927879117726432283352324546435315312" + "937809651095964197873430398662003709663353962932921239516263" + "008572512558260093668527782388349282015308359304941505110445" + "043762021191469060607078792635897736408141163554429972292873" + "575169264387977130124003958599909776720759582995017519144111" + "001778329839793855454688442046155253818724410472281602421363" + "580613990749181808302947976045417884436271162664776148749463" + "202753814797191206392480969096910387729527305862739806702349" + "088455828380471306603628636563037414688265702108098430515297" + "645997107159687247830496686980315376091511219227376708389862" + "310190633134517040835432587726931910775044780329777051964574" + "763119639404235797665922677433332402402817037657141926646502" + "612388421085254756323737273178774331073924707711575555193153" + "421957126062196520952920611871114861423032687425262323243276" + "848595495133802591437804984986053892365334900647137137197585" + "161954823956838391108748154877098567190695813394392779995887" + "642254413740232692940887236351533691174492514884514265006822" + "752026136435469700291628942927286843274959781329315250417360" + "438115330104516894597449604875954147108010051910197388860417" + "003307595774863477182911525109554542883460240867674794470854" + "883815424039187014069246137704710366577005576311674384079810" + "437206511282792194562503036151028910065418370565117488062226" + "073975854919243439941741016447206284543777826080409075756028" + "194465562812076645422284670475730922346454505830553174377950" + "824178034708147037448871898963699023373821217419560423459358" + "846127232531421552826545954362386431279626917642725181802754" + "271134597856231805666129524101509582941585421888561296839474" + "232056474112935379177434928227554149402642893913492062781246" + "372611175305462271711931011635602039137701669573065960945871" + "579420683440097179831368317352157202215160682058878025153007" + "184185319863451652087375936651004559837502483808090613073982" + "264685620351993519454344577635257452328683726988824705474397" + "398247190812883071734743260426540123481791283782928972842466" + "595210269414219040901793935553872090377394005932597887081359" + "481915849178541128182923272843218513093012167744690818603663" + "862691727272565325057703378827553284852502067686026850339624" + "401046086817036618366842240024522042069888708534827471235203" + "998932259309110942367856287784097166420437430118381247339347" + "418156902369282431197735078016591613063918260343498992697002" + "033186558413655576703389208301203552157755701852051877927864" + "696515420369217703510602759815252574799728706795849558382877" + "392016396900560101736741462690753991602263974212137632508984" + "264559315540891383192361601189350414311358816980975697568561" + "515680971830107704152657284552920241862730125888825702301035" + "564615759615882010733764341109834449576907982406265803484111" + "303615971297609065271517286111839839646343815364461776394273" + "571391219315553915335300622295196577640884201524657614065743" + "729121754460652975075990012786021662416077757235487562550381" + "116824006014440438178253273174734436163638119532295383351135" + "543170811596051785036366846773285937845231974424475418970517" + "659179798069972876889488877627309887323737590814875050457317" + "809625163713227973229002908003491739085115971899606986738405" + "752463436186745107821032315480693516006251388789902053863235" + "071957895722121876262598833823352290042576488238120724072267" + "480348425637199003147760378463243043407534395221882144887315" + "875876025907739792297575795373506429192468470170038312050500" + "917665707583420927303790875332407805094505665159755210495266" + "485594187244922216154283213688032393939401426499517609275128" + "062067355172333120857796045387692492375534056470145301671359" + "016602832469675123108598588424022216759334733452626330303791" + "660952659036162827509451468771297954737165701921676834866994" + "084496268491510599580714458155026746676860790028899722645883" + "679435969902046442373108472951515492761911884847211825930115" + "654927539118088350255959445076757398298893380662248358210075" + "297702191186519614515280395341723177201383862827129721649638" + "274531314762377778754560119397123180107310216608157141828379" + "259328274508467371717057031104537750450228447941619684073375" + "630517322006118640290925241602376256334414376495602911265450" + "165889418372161719063670619610214632774542741157366426747861" + "054811449449004970132668146607323502760146957586465275981090" + "328336256381187450646030492071694516054712444513961269623339" + "705411366337817643269316717217432478812002049894979925260411" + "553651385384826214231392012841425936827944383266227115236029" + "717393064659821056467446870597828757433936024422511537561864" + "619865595955628070343780472634463916608440151554502790128417" + "277259492437005696576453717387309605129939526661181496994297" + "244693710437436581443653555343763817246961834486181294985455" + "884981266421533438177271809310897035958260776218253097858601" + "160643120653927024652834025146166356877731266566437231429061" + "099807825113272551869352908241073955695854354852545370793609" + "838167127357752579007490955536081388103461735071174567636929" + "060824172375010035497010614957197713919909924635906503348016" + "450952475530978921242656498701313530533991692867619886826204" + "706468476070943378163577235406861262755114909606255628375659" + "196050370661430148107216310635729360112021571291096278032076" + "401092225373270173950575377792566872113768085940991929655824" + "050914085013970861399015141010432835406337266746706727481946" + "196898882472095111505210339933002505227334750020285673634670" + "738458390159933494226851499935336922036551687169140582574153" + "726872453800858360764892975201757027862632615130256075468549" + "502839367841926212872731925042838691319757663382746471782087" + "828988857978192483595747889021081459460627705275735868618724" + "958783348362295106875556443770626864591972089881215465141073" + "516646930158996569747675806719463602045230325049794904894739" + "988312727573320971310488326486213061839843830003145873279435" + "454121817918269218294901387830156432148142381592864575229119" + "479029130050663564889172093067341444164942736885872753984012" + "865743421266470861425283889134636885790293235727017788606167" + "560012477186697069994213912998550931078617189790771376702549" + "055361745205232419031423044366971378594392952093464046441667" + "117613906203494872209149396518971207279263883566606774353236" + "255473603377861613942239543893894460581170658088042083661404" + "937465706659424639301296621963906278930754459296017486063079" + "582024995485338893699574289806529424673393810217577605952909" + "491283123179789154639057105774960699934999681018155749261864" + "012821574480758746632022143860041252142846691648490809250856" + "327057133540568617791625295314357533564192304930155735301757" + "457531580062662693966772497728335047637869054460240023262262" + "260698443946964564691259441706490611176164305693669515767804" + "836460521205954731752583848846525153811934541997962775215961" + "180346397456122329133421016560406277159258781706172834569862" + "946953007793254152187010227976038449980797987728559041018441" + "590564594738308310579014597893182017151615208050090318483536" + "106249131918576316944251537092347119867433735046169725181104" + "507590928834713669184230634083190791725243913641206256399101" + "550966117564795555149420011152858441084271411289366093158722" + "254752761637144762690747726313899449121995142565661043193165" + "353010677613760383307839362361625628371456344409245507081913" + "518237257141164239966660785903970075181826808229440731778746" + "830751045427285945936163931997929399708401851740705527023711" + "492262489476846435969872480702228386506357017948329114555484" + "164760105906717855684788039081591713778852802032849601308169" + "832017420608399347713424218434541771868442189843417628618330" + "607429739733739437863581804003482214082370567967330530446020" + "897773385726872912189813323094415093143437550397556262780011" + "208941731420098754319961419532567861629590267320403217607660" + "774125374101195389953895035347940170148097810952083736798564" + "420421622607993390894450932047257403433908665884124601384175" + "012387617430467934818665777122459487877479257747635172691688" + "471574765285820096075133353869554987216398800026453207557923" + "535966131756358352198875705382763163680830588056974671628368" + "719411827591592806044707764658145625683998557872894583705117" + "936257144994734815912058252772021032081682437093280526665192" + "728869800954748014250481042845426151143544474372887617562791" + "409866964806319608280819816846942058817381943129762034507591" + "367065185343216917751414811188645979508942996964383255432999" + "246119971295726296202396921903289017490293595312645036697141" + "581149988784499288560584613793415358537364677872496224892098" + "940856692342358755626519304557946447004033186014602147449599" + "351317079758304444877174136521487256811625263467410007624215" + "856145392339552689565690577293133060124853654497575571509576" + "408069646196646757505249296126372820539234090564691695806544" + "715766025588258581902342311480969412221466852421842650484494" + "063894865891424563992751226230317059592413191308470146226366" + "458233536657973376067140793776369412191789801225320255079444" + "592709005698858098716107025188986428347407279053266600044521" + "079987989879536957560131070100060050673537683871138182387904" + "590837539252425985326631955455857258818756188063697492342550" + "045277400125480079927908846850898283905756532829762950509886" + "991675925213188409911532242068610889478326451513981115020992" + "630395715520350039372702741107911736947893709538471200363740" + "669304116845653259038102180504837110789645359520309929381266" + "271463740502507456882882255788069710715770802338317704510793" + "279398576163709512326095306022330346997717688118726634628650" + "675984237916551201500684504118483305560295744746257951860545" + "390826531622290588364837980034428055971370065573420370270905" + "592141420051502465016793525150950140243606137664910359769114" + "512792293426708006440346732679574519594848136194781488696994" + "267355775509666977187349644291823026624985531726865131782364" + "428380093055155988532106121916567178604128111080322761213573" + "781334480667563871257352254033032675246444238637990062075058" + "819854494711379915549313390179300091783493496822950479766923" + "983305064901026858870340863556799948310622536592472509634484" + "910640735459644047154918467543140024764605449756679450446473" + "048922824617117723876384637412932380635306714345354710568410" + "140587435077620501285599837051978855056335305570615129711860" + "309387503970812843734718712815925040263182888714533431137355" + "255722368962836390856001176889513153529416105504464217522618" + "741534232432067776306691118141998014985541610448993152948945" + "865983354717289054861249734477980864059509622993770525110616" + "313865830823478927462500895844216364365499438449134659145333" + "799994034010282254566331595018205841080487728993632798168070" + "476921205941768965021887178681810499301253039335978279707627" + "295287697256489961179958946847840431902105306618594831078534" + "622089641993900896756734276531931450266972752637997248151974" + "2277811246822238899767398834228515625e-4951", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-16448, + true, + 0x4p-16448, + 0x4p-16448, + 0x4p-16448, + 0x4p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + true, + 0x4p-16448, + 0x4p-16448, + 0x4p-16448, + 0x4p-16448), + TEST ("1.8225997659412373012642029668097099081995254078467816718604" + "902435141858443166988684047803543129136025986236736736017655" + "509834928163110160849867540377949045027419112905889658392846" + "126319028167798783107812829917053644701598967767636342956203" + "999770864055077592691915230273843577112246476529298591341071" + "313110337661777304220340396298768698441131694859514066773321" + "059786469060001083813361460161387168195154228027648977594276" + "496061276605855817438145692314650177569263750801566422892936" + "732834290416745265618525969943519916542939199731612507343012" + "297331882934352282118173551211985973294301787840335672389913" + "821098681464088756477802684228806339233239542587316254618680" + "197563613907079766830481997222017010585267442240109888818022" + "189543438116245170584546472752661417773021275082355242554950" + "776248474101880875363872607989624146320823364146896124171892" + "610744237622308266702265704492674694505399997330424978964704" + "335411125839490463131661420668167686151828553033363555080508" + "484934542727634080467233927879117726432283352324546435315312" + "937809651095964197873430398662003709663353962932921239516263" + "008572512558260093668527782388349282015308359304941505110445" + "043762021191469060607078792635897736408141163554429972292873" + "575169264387977130124003958599909776720759582995017519144111" + "001778329839793855454688442046155253818724410472281602421363" + "580613990749181808302947976045417884436271162664776148749463" + "202753814797191206392480969096910387729527305862739806702349" + "088455828380471306603628636563037414688265702108098430515297" + "645997107159687247830496686980315376091511219227376708389862" + "310190633134517040835432587726931910775044780329777051964574" + "763119639404235797665922677433332402402817037657141926646502" + "612388421085254756323737273178774331073924707711575555193153" + "421957126062196520952920611871114861423032687425262323243276" + "848595495133802591437804984986053892365334900647137137197585" + "161954823956838391108748154877098567190695813394392779995887" + "642254413740232692940887236351533691174492514884514265006822" + "752026136435469700291628942927286843274959781329315250417360" + "438115330104516894597449604875954147108010051910197388860417" + "003307595774863477182911525109554542883460240867674794470854" + "883815424039187014069246137704710366577005576311674384079810" + "437206511282792194562503036151028910065418370565117488062226" + "073975854919243439941741016447206284543777826080409075756028" + "194465562812076645422284670475730922346454505830553174377950" + "824178034708147037448871898963699023373821217419560423459358" + "846127232531421552826545954362386431279626917642725181802754" + "271134597856231805666129524101509582941585421888561296839474" + "232056474112935379177434928227554149402642893913492062781246" + "372611175305462271711931011635602039137701669573065960945871" + "579420683440097179831368317352157202215160682058878025153007" + "184185319863451652087375936651004559837502483808090613073982" + "264685620351993519454344577635257452328683726988824705474397" + "398247190812883071734743260426540123481791283782928972842466" + "595210269414219040901793935553872090377394005932597887081359" + "481915849178541128182923272843218513093012167744690818603663" + "862691727272565325057703378827553284852502067686026850339624" + "401046086817036618366842240024522042069888708534827471235203" + "998932259309110942367856287784097166420437430118381247339347" + "418156902369282431197735078016591613063918260343498992697002" + "033186558413655576703389208301203552157755701852051877927864" + "696515420369217703510602759815252574799728706795849558382877" + "392016396900560101736741462690753991602263974212137632508984" + "264559315540891383192361601189350414311358816980975697568561" + "515680971830107704152657284552920241862730125888825702301035" + "564615759615882010733764341109834449576907982406265803484111" + "303615971297609065271517286111839839646343815364461776394273" + "571391219315553915335300622295196577640884201524657614065743" + "729121754460652975075990012786021662416077757235487562550381" + "116824006014440438178253273174734436163638119532295383351135" + "543170811596051785036366846773285937845231974424475418970517" + "659179798069972876889488877627309887323737590814875050457317" + "809625163713227973229002908003491739085115971899606986738405" + "752463436186745107821032315480693516006251388789902053863235" + "071957895722121876262598833823352290042576488238120724072267" + "480348425637199003147760378463243043407534395221882144887315" + "875876025907739792297575795373506429192468470170038312050500" + "917665707583420927303790875332407805094505665159755210495266" + "485594187244922216154283213688032393939401426499517609275128" + "062067355172333120857796045387692492375534056470145301671359" + "016602832469675123108598588424022216759334733452626330303791" + "660952659036162827509451468771297954737165701921676834866994" + "084496268491510599580714458155026746676860790028899722645883" + "679435969902046442373108472951515492761911884847211825930115" + "654927539118088350255959445076757398298893380662248358210075" + "297702191186519614515280395341723177201383862827129721649638" + "274531314762377778754560119397123180107310216608157141828379" + "259328274508467371717057031104537750450228447941619684073375" + "630517322006118640290925241602376256334414376495602911265450" + "165889418372161719063670619610214632774542741157366426747861" + "054811449449004970132668146607323502760146957586465275981090" + "328336256381187450646030492071694516054712444513961269623339" + "705411366337817643269316717217432478812002049894979925260411" + "553651385384826214231392012841425936827944383266227115236029" + "717393064659821056467446870597828757433936024422511537561864" + "619865595955628070343780472634463916608440151554502790128417" + "277259492437005696576453717387309605129939526661181496994297" + "244693710437436581443653555343763817246961834486181294985455" + "884981266421533438177271809310897035958260776218253097858601" + "160643120653927024652834025146166356877731266566437231429061" + "099807825113272551869352908241073955695854354852545370793609" + "838167127357752579007490955536081388103461735071174567636929" + "060824172375010035497010614957197713919909924635906503348016" + "450952475530978921242656498701313530533991692867619886826204" + "706468476070943378163577235406861262755114909606255628375659" + "196050370661430148107216310635729360112021571291096278032076" + "401092225373270173950575377792566872113768085940991929655824" + "050914085013970861399015141010432835406337266746706727481946" + "196898882472095111505210339933002505227334750020285673634670" + "738458390159933494226851499935336922036551687169140582574153" + "726872453800858360764892975201757027862632615130256075468549" + "502839367841926212872731925042838691319757663382746471782087" + "828988857978192483595747889021081459460627705275735868618724" + "958783348362295106875556443770626864591972089881215465141073" + "516646930158996569747675806719463602045230325049794904894739" + "988312727573320971310488326486213061839843830003145873279435" + "454121817918269218294901387830156432148142381592864575229119" + "479029130050663564889172093067341444164942736885872753984012" + "865743421266470861425283889134636885790293235727017788606167" + "560012477186697069994213912998550931078617189790771376702549" + "055361745205232419031423044366971378594392952093464046441667" + "117613906203494872209149396518971207279263883566606774353236" + "255473603377861613942239543893894460581170658088042083661404" + "937465706659424639301296621963906278930754459296017486063079" + "582024995485338893699574289806529424673393810217577605952909" + "491283123179789154639057105774960699934999681018155749261864" + "012821574480758746632022143860041252142846691648490809250856" + "327057133540568617791625295314357533564192304930155735301757" + "457531580062662693966772497728335047637869054460240023262262" + "260698443946964564691259441706490611176164305693669515767804" + "836460521205954731752583848846525153811934541997962775215961" + "180346397456122329133421016560406277159258781706172834569862" + "946953007793254152187010227976038449980797987728559041018441" + "590564594738308310579014597893182017151615208050090318483536" + "106249131918576316944251537092347119867433735046169725181104" + "507590928834713669184230634083190791725243913641206256399101" + "550966117564795555149420011152858441084271411289366093158722" + "254752761637144762690747726313899449121995142565661043193165" + "353010677613760383307839362361625628371456344409245507081913" + "518237257141164239966660785903970075181826808229440731778746" + "830751045427285945936163931997929399708401851740705527023711" + "492262489476846435969872480702228386506357017948329114555484" + "164760105906717855684788039081591713778852802032849601308169" + "832017420608399347713424218434541771868442189843417628618330" + "607429739733739437863581804003482214082370567967330530446020" + "897773385726872912189813323094415093143437550397556262780011" + "208941731420098754319961419532567861629590267320403217607660" + "774125374101195389953895035347940170148097810952083736798564" + "420421622607993390894450932047257403433908665884124601384175" + "012387617430467934818665777122459487877479257747635172691688" + "471574765285820096075133353869554987216398800026453207557923" + "535966131756358352198875705382763163680830588056974671628368" + "719411827591592806044707764658145625683998557872894583705117" + "936257144994734815912058252772021032081682437093280526665192" + "728869800954748014250481042845426151143544474372887617562791" + "409866964806319608280819816846942058817381943129762034507591" + "367065185343216917751414811188645979508942996964383255432999" + "246119971295726296202396921903289017490293595312645036697141" + "581149988784499288560584613793415358537364677872496224892098" + "940856692342358755626519304557946447004033186014602147449599" + "351317079758304444877174136521487256811625263467410007624215" + "856145392339552689565690577293133060124853654497575571509576" + "408069646196646757505249296126372820539234090564691695806544" + "715766025588258581902342311480969412221466852421842650484494" + "063894865891424563992751226230317059592413191308470146226366" + "458233536657973376067140793776369412191789801225320255079444" + "592709005698858098716107025188986428347407279053266600044521" + "079987989879536957560131070100060050673537683871138182387904" + "590837539252425985326631955455857258818756188063697492342550" + "045277400125480079927908846850898283905756532829762950509886" + "991675925213188409911532242068610889478326451513981115020992" + "630395715520350039372702741107911736947893709538471200363740" + "669304116845653259038102180504837110789645359520309929381266" + "271463740502507456882882255788069710715770802338317704510793" + "279398576163709512326095306022330346997717688118726634628650" + "675984237916551201500684504118483305560295744746257951860545" + "390826531622290588364837980034428055971370065573420370270905" + "592141420051502465016793525150950140243606137664910359769114" + "512792293426708006440346732679574519594848136194781488696994" + "267355775509666977187349644291823026624985531726865131782364" + "428380093055155988532106121916567178604128111080322761213573" + "781334480667563871257352254033032675246444238637990062075058" + "819854494711379915549313390179300091783493496822950479766923" + "983305064901026858870340863556799948310622536592472509634484" + "910640735459644047154918467543140024764605449756679450446473" + "048922824617117723876384637412932380635306714345354710568410" + "140587435077620501285599837051978855056335305570615129711860" + "309387503970812843734718712815925040263182888714533431137355" + "255722368962836390856001176889513153529416105504464217522618" + "741534232432067776306691118141998014985541610448993152948945" + "865983354717289054861249734477980864059509622993770525110616" + "313865830823478927462500895844216364365499438449134659145333" + "799994034010282254566331595018205841080487728993632798168070" + "476921205941768965021887178681810499301253039335978279707627" + "295287697256489961179958946847840431902105306618594831078534" + "622089641993900896756734276531931450266972752637997248151974" + "2277811246822238899767398834228515626e-4951", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x0p+0, + 0x8p-16448, + 0x0p+0, + 0x8p-16448, + false, + 0x4p-16448, + 0x4p-16448, + 0x4p-16448, + 0x8p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x4p-16448, + 0x4p-16448, + 0x4p-16448, + 0x4.000000000004p-16448), + TEST ("-1.822599765941237301264202966809709908199525407846781671860" + "490243514185844316698868404780354312913602598623673673601765" + "550983492816311016084986754037794904502741911290588965839284" + "612631902816779878310781282991705364470159896776763634295620" + "399977086405507759269191523027384357711224647652929859134107" + "131311033766177730422034039629876869844113169485951406677332" + "105978646906000108381336146016138716819515422802764897759427" + "649606127660585581743814569231465017756926375080156642289293" + "673283429041674526561852596994351991654293919973161250734301" + "229733188293435228211817355121198597329430178784033567238991" + "382109868146408875647780268422880633923323954258731625461868" + "019756361390707976683048199722201701058526744224010988881802" + "218954343811624517058454647275266141777302127508235524255495" + "077624847410188087536387260798962414632082336414689612417189" + "261074423762230826670226570449267469450539999733042497896470" + "433541112583949046313166142066816768615182855303336355508050" + "848493454272763408046723392787911772643228335232454643531531" + "293780965109596419787343039866200370966335396293292123951626" + "300857251255826009366852778238834928201530835930494150511044" + "504376202119146906060707879263589773640814116355442997229287" + "357516926438797713012400395859990977672075958299501751914411" + "100177832983979385545468844204615525381872441047228160242136" + "358061399074918180830294797604541788443627116266477614874946" + "320275381479719120639248096909691038772952730586273980670234" + "908845582838047130660362863656303741468826570210809843051529" + "764599710715968724783049668698031537609151121922737670838986" + "231019063313451704083543258772693191077504478032977705196457" + "476311963940423579766592267743333240240281703765714192664650" + "261238842108525475632373727317877433107392470771157555519315" + "342195712606219652095292061187111486142303268742526232324327" + "684859549513380259143780498498605389236533490064713713719758" + "516195482395683839110874815487709856719069581339439277999588" + "764225441374023269294088723635153369117449251488451426500682" + "275202613643546970029162894292728684327495978132931525041736" + "043811533010451689459744960487595414710801005191019738886041" + "700330759577486347718291152510955454288346024086767479447085" + "488381542403918701406924613770471036657700557631167438407981" + "043720651128279219456250303615102891006541837056511748806222" + "607397585491924343994174101644720628454377782608040907575602" + "819446556281207664542228467047573092234645450583055317437795" + "082417803470814703744887189896369902337382121741956042345935" + "884612723253142155282654595436238643127962691764272518180275" + "427113459785623180566612952410150958294158542188856129683947" + "423205647411293537917743492822755414940264289391349206278124" + "637261117530546227171193101163560203913770166957306596094587" + "157942068344009717983136831735215720221516068205887802515300" + "718418531986345165208737593665100455983750248380809061307398" + "226468562035199351945434457763525745232868372698882470547439" + "739824719081288307173474326042654012348179128378292897284246" + "659521026941421904090179393555387209037739400593259788708135" + "948191584917854112818292327284321851309301216774469081860366" + "386269172727256532505770337882755328485250206768602685033962" + "440104608681703661836684224002452204206988870853482747123520" + "399893225930911094236785628778409716642043743011838124733934" + "741815690236928243119773507801659161306391826034349899269700" + "203318655841365557670338920830120355215775570185205187792786" + "469651542036921770351060275981525257479972870679584955838287" + "739201639690056010173674146269075399160226397421213763250898" + "426455931554089138319236160118935041431135881698097569756856" + "151568097183010770415265728455292024186273012588882570230103" + "556461575961588201073376434110983444957690798240626580348411" + "130361597129760906527151728611183983964634381536446177639427" + "357139121931555391533530062229519657764088420152465761406574" + "372912175446065297507599001278602166241607775723548756255038" + "111682400601444043817825327317473443616363811953229538335113" + "554317081159605178503636684677328593784523197442447541897051" + "765917979806997287688948887762730988732373759081487505045731" + "780962516371322797322900290800349173908511597189960698673840" + "575246343618674510782103231548069351600625138878990205386323" + "507195789572212187626259883382335229004257648823812072407226" + "748034842563719900314776037846324304340753439522188214488731" + "587587602590773979229757579537350642919246847017003831205050" + "091766570758342092730379087533240780509450566515975521049526" + "648559418724492221615428321368803239393940142649951760927512" + "806206735517233312085779604538769249237553405647014530167135" + "901660283246967512310859858842402221675933473345262633030379" + "166095265903616282750945146877129795473716570192167683486699" + "408449626849151059958071445815502674667686079002889972264588" + "367943596990204644237310847295151549276191188484721182593011" + "565492753911808835025595944507675739829889338066224835821007" + "529770219118651961451528039534172317720138386282712972164963" + "827453131476237777875456011939712318010731021660815714182837" + "925932827450846737171705703110453775045022844794161968407337" + "563051732200611864029092524160237625633441437649560291126545" + "016588941837216171906367061961021463277454274115736642674786" + "105481144944900497013266814660732350276014695758646527598109" + "032833625638118745064603049207169451605471244451396126962333" + "970541136633781764326931671721743247881200204989497992526041" + "155365138538482621423139201284142593682794438326622711523602" + "971739306465982105646744687059782875743393602442251153756186" + "461986559595562807034378047263446391660844015155450279012841" + "727725949243700569657645371738730960512993952666118149699429" + "724469371043743658144365355534376381724696183448618129498545" + "588498126642153343817727180931089703595826077621825309785860" + "116064312065392702465283402514616635687773126656643723142906" + "109980782511327255186935290824107395569585435485254537079360" + "983816712735775257900749095553608138810346173507117456763692" + "906082417237501003549701061495719771391990992463590650334801" + "645095247553097892124265649870131353053399169286761988682620" + "470646847607094337816357723540686126275511490960625562837565" + "919605037066143014810721631063572936011202157129109627803207" + "640109222537327017395057537779256687211376808594099192965582" + "405091408501397086139901514101043283540633726674670672748194" + "619689888247209511150521033993300250522733475002028567363467" + "073845839015993349422685149993533692203655168716914058257415" + "372687245380085836076489297520175702786263261513025607546854" + "950283936784192621287273192504283869131975766338274647178208" + "782898885797819248359574788902108145946062770527573586861872" + "495878334836229510687555644377062686459197208988121546514107" + "351664693015899656974767580671946360204523032504979490489473" + "998831272757332097131048832648621306183984383000314587327943" + "545412181791826921829490138783015643214814238159286457522911" + "947902913005066356488917209306734144416494273688587275398401" + "286574342126647086142528388913463688579029323572701778860616" + "756001247718669706999421391299855093107861718979077137670254" + "905536174520523241903142304436697137859439295209346404644166" + "711761390620349487220914939651897120727926388356660677435323" + "625547360337786161394223954389389446058117065808804208366140" + "493746570665942463930129662196390627893075445929601748606307" + "958202499548533889369957428980652942467339381021757760595290" + "949128312317978915463905710577496069993499968101815574926186" + "401282157448075874663202214386004125214284669164849080925085" + "632705713354056861779162529531435753356419230493015573530175" + "745753158006266269396677249772833504763786905446024002326226" + "226069844394696456469125944170649061117616430569366951576780" + "483646052120595473175258384884652515381193454199796277521596" + "118034639745612232913342101656040627715925878170617283456986" + "294695300779325415218701022797603844998079798772855904101844" + "159056459473830831057901459789318201715161520805009031848353" + "610624913191857631694425153709234711986743373504616972518110" + "450759092883471366918423063408319079172524391364120625639910" + "155096611756479555514942001115285844108427141128936609315872" + "225475276163714476269074772631389944912199514256566104319316" + "535301067761376038330783936236162562837145634440924550708191" + "351823725714116423996666078590397007518182680822944073177874" + "683075104542728594593616393199792939970840185174070552702371" + "149226248947684643596987248070222838650635701794832911455548" + "416476010590671785568478803908159171377885280203284960130816" + "983201742060839934771342421843454177186844218984341762861833" + "060742973973373943786358180400348221408237056796733053044602" + "089777338572687291218981332309441509314343755039755626278001" + "120894173142009875431996141953256786162959026732040321760766" + "077412537410119538995389503534794017014809781095208373679856" + "442042162260799339089445093204725740343390866588412460138417" + "501238761743046793481866577712245948787747925774763517269168" + "847157476528582009607513335386955498721639880002645320755792" + "353596613175635835219887570538276316368083058805697467162836" + "871941182759159280604470776465814562568399855787289458370511" + "793625714499473481591205825277202103208168243709328052666519" + "272886980095474801425048104284542615114354447437288761756279" + "140986696480631960828081981684694205881738194312976203450759" + "136706518534321691775141481118864597950894299696438325543299" + "924611997129572629620239692190328901749029359531264503669714" + "158114998878449928856058461379341535853736467787249622489209" + "894085669234235875562651930455794644700403318601460214744959" + "935131707975830444487717413652148725681162526346741000762421" + "585614539233955268956569057729313306012485365449757557150957" + "640806964619664675750524929612637282053923409056469169580654" + "471576602558825858190234231148096941222146685242184265048449" + "406389486589142456399275122623031705959241319130847014622636" + "645823353665797337606714079377636941219178980122532025507944" + "459270900569885809871610702518898642834740727905326660004452" + "107998798987953695756013107010006005067353768387113818238790" + "459083753925242598532663195545585725881875618806369749234255" + "004527740012548007992790884685089828390575653282976295050988" + "699167592521318840991153224206861088947832645151398111502099" + "263039571552035003937270274110791173694789370953847120036374" + "066930411684565325903810218050483711078964535952030992938126" + "627146374050250745688288225578806971071577080233831770451079" + "327939857616370951232609530602233034699771768811872663462865" + "067598423791655120150068450411848330556029574474625795186054" + "539082653162229058836483798003442805597137006557342037027090" + "559214142005150246501679352515095014024360613766491035976911" + "451279229342670800644034673267957451959484813619478148869699" + "426735577550966697718734964429182302662498553172686513178236" + "442838009305515598853210612191656717860412811108032276121357" + "378133448066756387125735225403303267524644423863799006207505" + "881985449471137991554931339017930009178349349682295047976692" + "398330506490102685887034086355679994831062253659247250963448" + "491064073545964404715491846754314002476460544975667945044647" + "304892282461711772387638463741293238063530671434535471056841" + "014058743507762050128559983705197885505633530557061512971186" + "030938750397081284373471871281592504026318288871453343113735" + "525572236896283639085600117688951315352941610550446421752261" + "874153423243206777630669111814199801498554161044899315294894" + "586598335471728905486124973447798086405950962299377052511061" + "631386583082347892746250089584421636436549943844913465914533" + "379999403401028225456633159501820584108048772899363279816807" + "047692120594176896502188717868181049930125303933597827970762" + "729528769725648996117995894684784043190210530661859483107853" + "462208964199390089675673427653193145026697275263799724815197" + "42277811246822238899767398834228515624e-4951", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x8p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-16448, + -0x4p-16448, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-16448, + -0x4p-16448, + -0x3.fffffffffffcp-16448, + -0x3.fffffffffffcp-16448), + TEST ("-1.822599765941237301264202966809709908199525407846781671860" + "490243514185844316698868404780354312913602598623673673601765" + "550983492816311016084986754037794904502741911290588965839284" + "612631902816779878310781282991705364470159896776763634295620" + "399977086405507759269191523027384357711224647652929859134107" + "131311033766177730422034039629876869844113169485951406677332" + "105978646906000108381336146016138716819515422802764897759427" + "649606127660585581743814569231465017756926375080156642289293" + "673283429041674526561852596994351991654293919973161250734301" + "229733188293435228211817355121198597329430178784033567238991" + "382109868146408875647780268422880633923323954258731625461868" + "019756361390707976683048199722201701058526744224010988881802" + "218954343811624517058454647275266141777302127508235524255495" + "077624847410188087536387260798962414632082336414689612417189" + "261074423762230826670226570449267469450539999733042497896470" + "433541112583949046313166142066816768615182855303336355508050" + "848493454272763408046723392787911772643228335232454643531531" + "293780965109596419787343039866200370966335396293292123951626" + "300857251255826009366852778238834928201530835930494150511044" + "504376202119146906060707879263589773640814116355442997229287" + "357516926438797713012400395859990977672075958299501751914411" + "100177832983979385545468844204615525381872441047228160242136" + "358061399074918180830294797604541788443627116266477614874946" + "320275381479719120639248096909691038772952730586273980670234" + "908845582838047130660362863656303741468826570210809843051529" + "764599710715968724783049668698031537609151121922737670838986" + "231019063313451704083543258772693191077504478032977705196457" + "476311963940423579766592267743333240240281703765714192664650" + "261238842108525475632373727317877433107392470771157555519315" + "342195712606219652095292061187111486142303268742526232324327" + "684859549513380259143780498498605389236533490064713713719758" + "516195482395683839110874815487709856719069581339439277999588" + "764225441374023269294088723635153369117449251488451426500682" + "275202613643546970029162894292728684327495978132931525041736" + "043811533010451689459744960487595414710801005191019738886041" + "700330759577486347718291152510955454288346024086767479447085" + "488381542403918701406924613770471036657700557631167438407981" + "043720651128279219456250303615102891006541837056511748806222" + "607397585491924343994174101644720628454377782608040907575602" + "819446556281207664542228467047573092234645450583055317437795" + "082417803470814703744887189896369902337382121741956042345935" + "884612723253142155282654595436238643127962691764272518180275" + "427113459785623180566612952410150958294158542188856129683947" + "423205647411293537917743492822755414940264289391349206278124" + "637261117530546227171193101163560203913770166957306596094587" + "157942068344009717983136831735215720221516068205887802515300" + "718418531986345165208737593665100455983750248380809061307398" + "226468562035199351945434457763525745232868372698882470547439" + "739824719081288307173474326042654012348179128378292897284246" + "659521026941421904090179393555387209037739400593259788708135" + "948191584917854112818292327284321851309301216774469081860366" + "386269172727256532505770337882755328485250206768602685033962" + "440104608681703661836684224002452204206988870853482747123520" + "399893225930911094236785628778409716642043743011838124733934" + "741815690236928243119773507801659161306391826034349899269700" + "203318655841365557670338920830120355215775570185205187792786" + "469651542036921770351060275981525257479972870679584955838287" + "739201639690056010173674146269075399160226397421213763250898" + "426455931554089138319236160118935041431135881698097569756856" + "151568097183010770415265728455292024186273012588882570230103" + "556461575961588201073376434110983444957690798240626580348411" + "130361597129760906527151728611183983964634381536446177639427" + "357139121931555391533530062229519657764088420152465761406574" + "372912175446065297507599001278602166241607775723548756255038" + "111682400601444043817825327317473443616363811953229538335113" + "554317081159605178503636684677328593784523197442447541897051" + "765917979806997287688948887762730988732373759081487505045731" + "780962516371322797322900290800349173908511597189960698673840" + "575246343618674510782103231548069351600625138878990205386323" + "507195789572212187626259883382335229004257648823812072407226" + "748034842563719900314776037846324304340753439522188214488731" + "587587602590773979229757579537350642919246847017003831205050" + "091766570758342092730379087533240780509450566515975521049526" + "648559418724492221615428321368803239393940142649951760927512" + "806206735517233312085779604538769249237553405647014530167135" + "901660283246967512310859858842402221675933473345262633030379" + "166095265903616282750945146877129795473716570192167683486699" + "408449626849151059958071445815502674667686079002889972264588" + "367943596990204644237310847295151549276191188484721182593011" + "565492753911808835025595944507675739829889338066224835821007" + "529770219118651961451528039534172317720138386282712972164963" + "827453131476237777875456011939712318010731021660815714182837" + "925932827450846737171705703110453775045022844794161968407337" + "563051732200611864029092524160237625633441437649560291126545" + "016588941837216171906367061961021463277454274115736642674786" + "105481144944900497013266814660732350276014695758646527598109" + "032833625638118745064603049207169451605471244451396126962333" + "970541136633781764326931671721743247881200204989497992526041" + "155365138538482621423139201284142593682794438326622711523602" + "971739306465982105646744687059782875743393602442251153756186" + "461986559595562807034378047263446391660844015155450279012841" + "727725949243700569657645371738730960512993952666118149699429" + "724469371043743658144365355534376381724696183448618129498545" + "588498126642153343817727180931089703595826077621825309785860" + "116064312065392702465283402514616635687773126656643723142906" + "109980782511327255186935290824107395569585435485254537079360" + "983816712735775257900749095553608138810346173507117456763692" + "906082417237501003549701061495719771391990992463590650334801" + "645095247553097892124265649870131353053399169286761988682620" + "470646847607094337816357723540686126275511490960625562837565" + "919605037066143014810721631063572936011202157129109627803207" + "640109222537327017395057537779256687211376808594099192965582" + "405091408501397086139901514101043283540633726674670672748194" + "619689888247209511150521033993300250522733475002028567363467" + "073845839015993349422685149993533692203655168716914058257415" + "372687245380085836076489297520175702786263261513025607546854" + "950283936784192621287273192504283869131975766338274647178208" + "782898885797819248359574788902108145946062770527573586861872" + "495878334836229510687555644377062686459197208988121546514107" + "351664693015899656974767580671946360204523032504979490489473" + "998831272757332097131048832648621306183984383000314587327943" + "545412181791826921829490138783015643214814238159286457522911" + "947902913005066356488917209306734144416494273688587275398401" + "286574342126647086142528388913463688579029323572701778860616" + "756001247718669706999421391299855093107861718979077137670254" + "905536174520523241903142304436697137859439295209346404644166" + "711761390620349487220914939651897120727926388356660677435323" + "625547360337786161394223954389389446058117065808804208366140" + "493746570665942463930129662196390627893075445929601748606307" + "958202499548533889369957428980652942467339381021757760595290" + "949128312317978915463905710577496069993499968101815574926186" + "401282157448075874663202214386004125214284669164849080925085" + "632705713354056861779162529531435753356419230493015573530175" + "745753158006266269396677249772833504763786905446024002326226" + "226069844394696456469125944170649061117616430569366951576780" + "483646052120595473175258384884652515381193454199796277521596" + "118034639745612232913342101656040627715925878170617283456986" + "294695300779325415218701022797603844998079798772855904101844" + "159056459473830831057901459789318201715161520805009031848353" + "610624913191857631694425153709234711986743373504616972518110" + "450759092883471366918423063408319079172524391364120625639910" + "155096611756479555514942001115285844108427141128936609315872" + "225475276163714476269074772631389944912199514256566104319316" + "535301067761376038330783936236162562837145634440924550708191" + "351823725714116423996666078590397007518182680822944073177874" + "683075104542728594593616393199792939970840185174070552702371" + "149226248947684643596987248070222838650635701794832911455548" + "416476010590671785568478803908159171377885280203284960130816" + "983201742060839934771342421843454177186844218984341762861833" + "060742973973373943786358180400348221408237056796733053044602" + "089777338572687291218981332309441509314343755039755626278001" + "120894173142009875431996141953256786162959026732040321760766" + "077412537410119538995389503534794017014809781095208373679856" + "442042162260799339089445093204725740343390866588412460138417" + "501238761743046793481866577712245948787747925774763517269168" + "847157476528582009607513335386955498721639880002645320755792" + "353596613175635835219887570538276316368083058805697467162836" + "871941182759159280604470776465814562568399855787289458370511" + "793625714499473481591205825277202103208168243709328052666519" + "272886980095474801425048104284542615114354447437288761756279" + "140986696480631960828081981684694205881738194312976203450759" + "136706518534321691775141481118864597950894299696438325543299" + "924611997129572629620239692190328901749029359531264503669714" + "158114998878449928856058461379341535853736467787249622489209" + "894085669234235875562651930455794644700403318601460214744959" + "935131707975830444487717413652148725681162526346741000762421" + "585614539233955268956569057729313306012485365449757557150957" + "640806964619664675750524929612637282053923409056469169580654" + "471576602558825858190234231148096941222146685242184265048449" + "406389486589142456399275122623031705959241319130847014622636" + "645823353665797337606714079377636941219178980122532025507944" + "459270900569885809871610702518898642834740727905326660004452" + "107998798987953695756013107010006005067353768387113818238790" + "459083753925242598532663195545585725881875618806369749234255" + "004527740012548007992790884685089828390575653282976295050988" + "699167592521318840991153224206861088947832645151398111502099" + "263039571552035003937270274110791173694789370953847120036374" + "066930411684565325903810218050483711078964535952030992938126" + "627146374050250745688288225578806971071577080233831770451079" + "327939857616370951232609530602233034699771768811872663462865" + "067598423791655120150068450411848330556029574474625795186054" + "539082653162229058836483798003442805597137006557342037027090" + "559214142005150246501679352515095014024360613766491035976911" + "451279229342670800644034673267957451959484813619478148869699" + "426735577550966697718734964429182302662498553172686513178236" + "442838009305515598853210612191656717860412811108032276121357" + "378133448066756387125735225403303267524644423863799006207505" + "881985449471137991554931339017930009178349349682295047976692" + "398330506490102685887034086355679994831062253659247250963448" + "491064073545964404715491846754314002476460544975667945044647" + "304892282461711772387638463741293238063530671434535471056841" + "014058743507762050128559983705197885505633530557061512971186" + "030938750397081284373471871281592504026318288871453343113735" + "525572236896283639085600117688951315352941610550446421752261" + "874153423243206777630669111814199801498554161044899315294894" + "586598335471728905486124973447798086405950962299377052511061" + "631386583082347892746250089584421636436549943844913465914533" + "379999403401028225456633159501820584108048772899363279816807" + "047692120594176896502188717868181049930125303933597827970762" + "729528769725648996117995894684784043190210530661859483107853" + "462208964199390089675673427653193145026697275263799724815197" + "42277811246822238899767398834228515625e-4951", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x8p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0x4p-16448, + -0x4p-16448, + -0x4p-16448, + -0x4p-16448, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0x4p-16448, + -0x4p-16448, + -0x4p-16448, + -0x4p-16448), + TEST ("-1.822599765941237301264202966809709908199525407846781671860" + "490243514185844316698868404780354312913602598623673673601765" + "550983492816311016084986754037794904502741911290588965839284" + "612631902816779878310781282991705364470159896776763634295620" + "399977086405507759269191523027384357711224647652929859134107" + "131311033766177730422034039629876869844113169485951406677332" + "105978646906000108381336146016138716819515422802764897759427" + "649606127660585581743814569231465017756926375080156642289293" + "673283429041674526561852596994351991654293919973161250734301" + "229733188293435228211817355121198597329430178784033567238991" + "382109868146408875647780268422880633923323954258731625461868" + "019756361390707976683048199722201701058526744224010988881802" + "218954343811624517058454647275266141777302127508235524255495" + "077624847410188087536387260798962414632082336414689612417189" + "261074423762230826670226570449267469450539999733042497896470" + "433541112583949046313166142066816768615182855303336355508050" + "848493454272763408046723392787911772643228335232454643531531" + "293780965109596419787343039866200370966335396293292123951626" + "300857251255826009366852778238834928201530835930494150511044" + "504376202119146906060707879263589773640814116355442997229287" + "357516926438797713012400395859990977672075958299501751914411" + "100177832983979385545468844204615525381872441047228160242136" + "358061399074918180830294797604541788443627116266477614874946" + "320275381479719120639248096909691038772952730586273980670234" + "908845582838047130660362863656303741468826570210809843051529" + "764599710715968724783049668698031537609151121922737670838986" + "231019063313451704083543258772693191077504478032977705196457" + "476311963940423579766592267743333240240281703765714192664650" + "261238842108525475632373727317877433107392470771157555519315" + "342195712606219652095292061187111486142303268742526232324327" + "684859549513380259143780498498605389236533490064713713719758" + "516195482395683839110874815487709856719069581339439277999588" + "764225441374023269294088723635153369117449251488451426500682" + "275202613643546970029162894292728684327495978132931525041736" + "043811533010451689459744960487595414710801005191019738886041" + "700330759577486347718291152510955454288346024086767479447085" + "488381542403918701406924613770471036657700557631167438407981" + "043720651128279219456250303615102891006541837056511748806222" + "607397585491924343994174101644720628454377782608040907575602" + "819446556281207664542228467047573092234645450583055317437795" + "082417803470814703744887189896369902337382121741956042345935" + "884612723253142155282654595436238643127962691764272518180275" + "427113459785623180566612952410150958294158542188856129683947" + "423205647411293537917743492822755414940264289391349206278124" + "637261117530546227171193101163560203913770166957306596094587" + "157942068344009717983136831735215720221516068205887802515300" + "718418531986345165208737593665100455983750248380809061307398" + "226468562035199351945434457763525745232868372698882470547439" + "739824719081288307173474326042654012348179128378292897284246" + "659521026941421904090179393555387209037739400593259788708135" + "948191584917854112818292327284321851309301216774469081860366" + "386269172727256532505770337882755328485250206768602685033962" + "440104608681703661836684224002452204206988870853482747123520" + "399893225930911094236785628778409716642043743011838124733934" + "741815690236928243119773507801659161306391826034349899269700" + "203318655841365557670338920830120355215775570185205187792786" + "469651542036921770351060275981525257479972870679584955838287" + "739201639690056010173674146269075399160226397421213763250898" + "426455931554089138319236160118935041431135881698097569756856" + "151568097183010770415265728455292024186273012588882570230103" + "556461575961588201073376434110983444957690798240626580348411" + "130361597129760906527151728611183983964634381536446177639427" + "357139121931555391533530062229519657764088420152465761406574" + "372912175446065297507599001278602166241607775723548756255038" + "111682400601444043817825327317473443616363811953229538335113" + "554317081159605178503636684677328593784523197442447541897051" + "765917979806997287688948887762730988732373759081487505045731" + "780962516371322797322900290800349173908511597189960698673840" + "575246343618674510782103231548069351600625138878990205386323" + "507195789572212187626259883382335229004257648823812072407226" + "748034842563719900314776037846324304340753439522188214488731" + "587587602590773979229757579537350642919246847017003831205050" + "091766570758342092730379087533240780509450566515975521049526" + "648559418724492221615428321368803239393940142649951760927512" + "806206735517233312085779604538769249237553405647014530167135" + "901660283246967512310859858842402221675933473345262633030379" + "166095265903616282750945146877129795473716570192167683486699" + "408449626849151059958071445815502674667686079002889972264588" + "367943596990204644237310847295151549276191188484721182593011" + "565492753911808835025595944507675739829889338066224835821007" + "529770219118651961451528039534172317720138386282712972164963" + "827453131476237777875456011939712318010731021660815714182837" + "925932827450846737171705703110453775045022844794161968407337" + "563051732200611864029092524160237625633441437649560291126545" + "016588941837216171906367061961021463277454274115736642674786" + "105481144944900497013266814660732350276014695758646527598109" + "032833625638118745064603049207169451605471244451396126962333" + "970541136633781764326931671721743247881200204989497992526041" + "155365138538482621423139201284142593682794438326622711523602" + "971739306465982105646744687059782875743393602442251153756186" + "461986559595562807034378047263446391660844015155450279012841" + "727725949243700569657645371738730960512993952666118149699429" + "724469371043743658144365355534376381724696183448618129498545" + "588498126642153343817727180931089703595826077621825309785860" + "116064312065392702465283402514616635687773126656643723142906" + "109980782511327255186935290824107395569585435485254537079360" + "983816712735775257900749095553608138810346173507117456763692" + "906082417237501003549701061495719771391990992463590650334801" + "645095247553097892124265649870131353053399169286761988682620" + "470646847607094337816357723540686126275511490960625562837565" + "919605037066143014810721631063572936011202157129109627803207" + "640109222537327017395057537779256687211376808594099192965582" + "405091408501397086139901514101043283540633726674670672748194" + "619689888247209511150521033993300250522733475002028567363467" + "073845839015993349422685149993533692203655168716914058257415" + "372687245380085836076489297520175702786263261513025607546854" + "950283936784192621287273192504283869131975766338274647178208" + "782898885797819248359574788902108145946062770527573586861872" + "495878334836229510687555644377062686459197208988121546514107" + "351664693015899656974767580671946360204523032504979490489473" + "998831272757332097131048832648621306183984383000314587327943" + "545412181791826921829490138783015643214814238159286457522911" + "947902913005066356488917209306734144416494273688587275398401" + "286574342126647086142528388913463688579029323572701778860616" + "756001247718669706999421391299855093107861718979077137670254" + "905536174520523241903142304436697137859439295209346404644166" + "711761390620349487220914939651897120727926388356660677435323" + "625547360337786161394223954389389446058117065808804208366140" + "493746570665942463930129662196390627893075445929601748606307" + "958202499548533889369957428980652942467339381021757760595290" + "949128312317978915463905710577496069993499968101815574926186" + "401282157448075874663202214386004125214284669164849080925085" + "632705713354056861779162529531435753356419230493015573530175" + "745753158006266269396677249772833504763786905446024002326226" + "226069844394696456469125944170649061117616430569366951576780" + "483646052120595473175258384884652515381193454199796277521596" + "118034639745612232913342101656040627715925878170617283456986" + "294695300779325415218701022797603844998079798772855904101844" + "159056459473830831057901459789318201715161520805009031848353" + "610624913191857631694425153709234711986743373504616972518110" + "450759092883471366918423063408319079172524391364120625639910" + "155096611756479555514942001115285844108427141128936609315872" + "225475276163714476269074772631389944912199514256566104319316" + "535301067761376038330783936236162562837145634440924550708191" + "351823725714116423996666078590397007518182680822944073177874" + "683075104542728594593616393199792939970840185174070552702371" + "149226248947684643596987248070222838650635701794832911455548" + "416476010590671785568478803908159171377885280203284960130816" + "983201742060839934771342421843454177186844218984341762861833" + "060742973973373943786358180400348221408237056796733053044602" + "089777338572687291218981332309441509314343755039755626278001" + "120894173142009875431996141953256786162959026732040321760766" + "077412537410119538995389503534794017014809781095208373679856" + "442042162260799339089445093204725740343390866588412460138417" + "501238761743046793481866577712245948787747925774763517269168" + "847157476528582009607513335386955498721639880002645320755792" + "353596613175635835219887570538276316368083058805697467162836" + "871941182759159280604470776465814562568399855787289458370511" + "793625714499473481591205825277202103208168243709328052666519" + "272886980095474801425048104284542615114354447437288761756279" + "140986696480631960828081981684694205881738194312976203450759" + "136706518534321691775141481118864597950894299696438325543299" + "924611997129572629620239692190328901749029359531264503669714" + "158114998878449928856058461379341535853736467787249622489209" + "894085669234235875562651930455794644700403318601460214744959" + "935131707975830444487717413652148725681162526346741000762421" + "585614539233955268956569057729313306012485365449757557150957" + "640806964619664675750524929612637282053923409056469169580654" + "471576602558825858190234231148096941222146685242184265048449" + "406389486589142456399275122623031705959241319130847014622636" + "645823353665797337606714079377636941219178980122532025507944" + "459270900569885809871610702518898642834740727905326660004452" + "107998798987953695756013107010006005067353768387113818238790" + "459083753925242598532663195545585725881875618806369749234255" + "004527740012548007992790884685089828390575653282976295050988" + "699167592521318840991153224206861088947832645151398111502099" + "263039571552035003937270274110791173694789370953847120036374" + "066930411684565325903810218050483711078964535952030992938126" + "627146374050250745688288225578806971071577080233831770451079" + "327939857616370951232609530602233034699771768811872663462865" + "067598423791655120150068450411848330556029574474625795186054" + "539082653162229058836483798003442805597137006557342037027090" + "559214142005150246501679352515095014024360613766491035976911" + "451279229342670800644034673267957451959484813619478148869699" + "426735577550966697718734964429182302662498553172686513178236" + "442838009305515598853210612191656717860412811108032276121357" + "378133448066756387125735225403303267524644423863799006207505" + "881985449471137991554931339017930009178349349682295047976692" + "398330506490102685887034086355679994831062253659247250963448" + "491064073545964404715491846754314002476460544975667945044647" + "304892282461711772387638463741293238063530671434535471056841" + "014058743507762050128559983705197885505633530557061512971186" + "030938750397081284373471871281592504026318288871453343113735" + "525572236896283639085600117688951315352941610550446421752261" + "874153423243206777630669111814199801498554161044899315294894" + "586598335471728905486124973447798086405950962299377052511061" + "631386583082347892746250089584421636436549943844913465914533" + "379999403401028225456633159501820584108048772899363279816807" + "047692120594176896502188717868181049930125303933597827970762" + "729528769725648996117995894684784043190210530661859483107853" + "462208964199390089675673427653193145026697275263799724815197" + "42277811246822238899767398834228515626e-4951", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x8p-16448, + -0x8p-16448, + -0x0p+0, + -0x0p+0, + false, + -0x8p-16448, + -0x4p-16448, + -0x4p-16448, + -0x4p-16448, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4.000000000004p-16448, + -0x4p-16448, + -0x4p-16448, + -0x4p-16448), + TEST ("9.1129988297061865063210148340485495409976270392339083593024" + "512175709292215834943420239017715645680129931183683680088277" + "549174640815550804249337701889745225137095564529448291964230" + "631595140838993915539064149585268223507994838838181714781019" + "998854320275387963459576151369217885561232382646492956705356" + "565551688308886521101701981493843492205658474297570333866605" + "298932345300005419066807300806935840975771140138244887971382" + "480306383029279087190728461573250887846318754007832114464683" + "664171452083726328092629849717599582714695998658062536715061" + "486659414671761410590867756059929866471508939201678361949569" + "105493407320443782389013421144031696166197712936581273093400" + "987818069535398834152409986110085052926337211200549444090110" + "947717190581225852922732363763307088865106375411776212774753" + "881242370509404376819363039948120731604116820734480620859463" + "053721188111541333511328522463373472526999986652124894823521" + "677055629197452315658307103340838430759142765166817775402542" + "424672713638170402336169639395588632161416761622732176576564" + "689048255479820989367151993310018548316769814664606197581315" + "042862562791300468342638911941746410076541796524707525552225" + "218810105957345303035393963179488682040705817772149861464367" + "875846321939885650620019792999548883603797914975087595720555" + "008891649198969277273442210230776269093622052361408012106817" + "903069953745909041514739880227089422181355813323880743747316" + "013769073985956031962404845484551938647636529313699033511745" + "442279141902356533018143182815187073441328510540492152576488" + "229985535798436239152483434901576880457556096136883541949311" + "550953165672585204177162938634659553875223901648885259822873" + "815598197021178988329613387166662012014085188285709633232513" + "061942105426273781618686365893871655369623538557877775965767" + "109785630310982604764603059355574307115163437126311616216384" + "242977475669012957189024924930269461826674503235685685987925" + "809774119784191955543740774385492835953479066971963899979438" + "211272068701163464704436181757668455872462574422571325034113" + "760130682177348501458144714636434216374798906646576252086802" + "190576650522584472987248024379770735540050259550986944302085" + "016537978874317385914557625547772714417301204338373972354274" + "419077120195935070346230688523551832885027881558371920399052" + "186032556413960972812515180755144550327091852825587440311130" + "369879274596217199708705082236031422718889130402045378780140" + "972327814060383227111423352378654611732272529152765871889754" + "120890173540735187244359494818495116869106087097802117296794" + "230636162657107764132729771811932156398134588213625909013771" + "355672989281159028330647620507547914707927109442806484197371" + "160282370564676895887174641137770747013214469567460313906231" + "863055876527311358559655058178010195688508347865329804729357" + "897103417200485899156841586760786011075803410294390125765035" + "920926599317258260436879683255022799187512419040453065369911" + "323428101759967597271722888176287261643418634944123527371986" + "991235954064415358673716302132700617408956418914644864212332" + "976051347071095204508969677769360451886970029662989435406797" + "409579245892705640914616364216092565465060838723454093018319" + "313458636362826625288516894137766424262510338430134251698122" + "005230434085183091834211200122610210349443542674137356176019" + "994661296545554711839281438920485832102187150591906236696737" + "090784511846412155988675390082958065319591301717494963485010" + "165932792068277883516946041506017760788778509260259389639323" + "482577101846088517553013799076262873998643533979247791914386" + "960081984502800508683707313453769958011319871060688162544921" + "322796577704456915961808005946752071556794084904878487842807" + "578404859150538520763286422764601209313650629444128511505177" + "823078798079410053668821705549172247884539912031329017420556" + "518079856488045326357586430559199198231719076822308881971367" + "856956096577769576676503111475982888204421007623288070328718" + "645608772303264875379950063930108312080388786177437812751905" + "584120030072202190891266365873672180818190597661476916755677" + "715854057980258925181834233866429689226159872122377094852588" + "295898990349864384447444388136549436618687954074375252286589" + "048125818566139866145014540017458695425579859498034933692028" + "762317180933725539105161577403467580031256943949510269316175" + "359789478610609381312994169116761450212882441190603620361337" + "401742128185995015738801892316215217037671976109410724436579" + "379380129538698961487878976867532145962342350850191560252504" + "588328537917104636518954376662039025472528325798776052476332" + "427970936224611080771416068440161969697007132497588046375640" + "310336775861665604288980226938462461877670282350726508356795" + "083014162348375615542992942120111083796673667263131651518958" + "304763295180814137547257343856489773685828509608384174334970" + "422481342457552997903572290775133733384303950144498613229418" + "397179849510232211865542364757577463809559424236059129650578" + "274637695590441751279797225383786991494466903311241791050376" + "488510955932598072576401976708615886006919314135648608248191" + "372656573811888893772800596985615900536551083040785709141896" + "296641372542336858585285155522688752251142239708098420366878" + "152586610030593201454626208011881281672071882478014556327250" + "829447091860808595318353098051073163872713705786832133739305" + "274057247245024850663340733036617513800734787932326379905451" + "641681281905937253230152460358472580273562222569806348116698" + "527056831689088216346583586087162394060010249474899626302057" + "768256926924131071156960064207129684139721916331135576180148" + "586965323299105282337234352989143787169680122112557687809323" + "099327979778140351718902363172319583042200757772513950642086" + "386297462185028482882268586936548025649697633305907484971486" + "223468552187182907218267776718819086234809172430906474927279" + "424906332107667190886359046554485179791303881091265489293005" + "803215603269635123264170125730831784388656332832186157145305" + "499039125566362759346764541205369778479271774262726853968049" + "190835636788762895037454777680406940517308675355872838184645" + "304120861875050177485053074785988569599549623179532516740082" + "254762377654894606213282493506567652669958464338099434131023" + "532342380354716890817886177034306313775574548031278141878295" + "980251853307150740536081553178646800560107856455481390160382" + "005461126866350869752876888962834360568840429704959648279120" + "254570425069854306995075705052164177031686333733533637409730" + "984494412360475557526051699665012526136673750101428368173353" + "692291950799667471134257499676684610182758435845702912870768" + "634362269004291803824464876008785139313163075651280377342747" + "514196839209631064363659625214193456598788316913732358910439" + "144944289890962417978739445105407297303138526378679343093624" + "793916741811475534377782218853134322959860449406077325705367" + "583234650794982848738379033597318010226151625248974524473699" + "941563637866604856552441632431065309199219150015729366397177" + "270609089591346091474506939150782160740711907964322876145597" + "395145650253317824445860465336707220824713684429363769920064" + "328717106332354307126419445673184428951466178635088943030837" + "800062385933485349971069564992754655393085948953856883512745" + "276808726026162095157115221834856892971964760467320232208335" + "588069531017474361045746982594856036396319417833033871766181" + "277368016889308069711197719469472302905853290440210418307024" + "687328533297123196506483109819531394653772296480087430315397" + "910124977426694468497871449032647123366969051087888029764547" + "456415615898945773195285528874803499674998405090778746309320" + "064107872403793733160110719300206260714233458242454046254281" + "635285667702843088958126476571787667820961524650778676508787" + "287657900313313469833862488641675238189345272301200116311311" + "303492219734822823456297208532453055880821528468347578839024" + "182302606029773658762919244232625769059672709989813876079805" + "901731987280611645667105082802031385796293908530864172849314" + "734765038966270760935051139880192249903989938642795205092207" + "952822973691541552895072989465910085758076040250451592417680" + "531245659592881584721257685461735599337168675230848625905522" + "537954644173568345921153170415953958626219568206031281995507" + "754830587823977775747100055764292205421357056446830465793611" + "273763808185723813453738631569497245609975712828305215965826" + "765053388068801916539196811808128141857281722046227535409567" + "591186285705821199833303929519850375909134041147203658893734" + "153755227136429729680819659989646998542009258703527635118557" + "461312447384232179849362403511141932531785089741645572777420" + "823800529533589278423940195407958568894264010164248006540849" + "160087103041996738567121092172708859342210949217088143091653" + "037148698668697189317909020017411070411852839836652652230104" + "488866928634364560949066615472075465717187751987781313900056" + "044708657100493771599807097662839308147951336602016088038303" + "870626870505976949769475176739700850740489054760418683992822" + "102108113039966954472254660236287017169543329420623006920875" + "061938087152339674093328885612297439387396288738175863458442" + "357873826429100480375666769347774936081994000132266037789617" + "679830658781791760994378526913815818404152940284873358141843" + "597059137957964030223538823290728128419992789364472918525589" + "681285724973674079560291263860105160408412185466402633325963" + "644349004773740071252405214227130755717722371864438087813957" + "049334824031598041404099084234710294086909715648810172537956" + "835325926716084588757074055943229897544714984821916277164996" + "230599856478631481011984609516445087451467976563225183485707" + "905749943922496442802923068967076792686823389362481124460494" + "704283461711793778132596522789732235020165930073010737247996" + "756585398791522224385870682607436284058126317337050038121079" + "280726961697763447828452886465665300624268272487877857547882" + "040348230983233787526246480631864102696170452823458479032723" + "578830127941292909511711557404847061107334262109213252422470" + "319474329457122819963756131151585297962065956542350731131832" + "291167683289866880335703968881847060958949006126601275397222" + "963545028494290493580535125944932141737036395266333000222605" + "399939949397684787800655350500300253367688419355690911939522" + "954187696262129926633159777279286294093780940318487461712750" + "226387000627400399639544234254491419528782664148814752549434" + "958379626065942049557661210343054447391632257569905575104963" + "151978577601750196863513705539558684739468547692356001818703" + "346520584228266295190510902524185553948226797601549646906331" + "357318702512537284414411278940348553578854011691588522553966" + "396992880818547561630476530111651734988588440593633173143253" + "379921189582756007503422520592416527801478723731289759302726" + "954132658111452941824189900172140279856850327867101851354527" + "960707100257512325083967625754750701218030688324551798845572" + "563961467133540032201733663397872597974240680973907443484971" + "336778877548334885936748221459115133124927658634325658911822" + "141900465275779942660530609582835893020640555401613806067868" + "906672403337819356286761270165163376232221193189950310375294" + "099272473556899577746566950896500458917467484114752398834619" + "916525324505134294351704317783999741553112682962362548172424" + "553203677298220235774592337715700123823027248783397252232365" + "244614123085588619381923187064661903176533571726773552842050" + "702937175388102506427999185259894275281676527853075648559301" + "546937519854064218673593564079625201315914443572667155686776" + "278611844814181954280005884447565767647080527522321087613093" + "707671162160338881533455590709990074927708052244965764744729" + "329916773586445274306248672389904320297548114968852625553081" + "569329154117394637312504479221081821827497192245673295726668" + "999970170051411272831657975091029205402438644968163990840352" + "384606029708844825109435893409052496506265196679891398538136" + "476438486282449805899794734239202159510526533092974155392673" + "110448209969504483783671382659657251334863763189986240759871" + "1389056234111194498836994171142578124e-4952", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x1.fffffffffffcp-16448, + 0x2p-16448, + 0x1.fffffffffffcp-16448, + 0x2p-16448), + TEST ("9.1129988297061865063210148340485495409976270392339083593024" + "512175709292215834943420239017715645680129931183683680088277" + "549174640815550804249337701889745225137095564529448291964230" + "631595140838993915539064149585268223507994838838181714781019" + "998854320275387963459576151369217885561232382646492956705356" + "565551688308886521101701981493843492205658474297570333866605" + "298932345300005419066807300806935840975771140138244887971382" + "480306383029279087190728461573250887846318754007832114464683" + "664171452083726328092629849717599582714695998658062536715061" + "486659414671761410590867756059929866471508939201678361949569" + "105493407320443782389013421144031696166197712936581273093400" + "987818069535398834152409986110085052926337211200549444090110" + "947717190581225852922732363763307088865106375411776212774753" + "881242370509404376819363039948120731604116820734480620859463" + "053721188111541333511328522463373472526999986652124894823521" + "677055629197452315658307103340838430759142765166817775402542" + "424672713638170402336169639395588632161416761622732176576564" + "689048255479820989367151993310018548316769814664606197581315" + "042862562791300468342638911941746410076541796524707525552225" + "218810105957345303035393963179488682040705817772149861464367" + "875846321939885650620019792999548883603797914975087595720555" + "008891649198969277273442210230776269093622052361408012106817" + "903069953745909041514739880227089422181355813323880743747316" + "013769073985956031962404845484551938647636529313699033511745" + "442279141902356533018143182815187073441328510540492152576488" + "229985535798436239152483434901576880457556096136883541949311" + "550953165672585204177162938634659553875223901648885259822873" + "815598197021178988329613387166662012014085188285709633232513" + "061942105426273781618686365893871655369623538557877775965767" + "109785630310982604764603059355574307115163437126311616216384" + "242977475669012957189024924930269461826674503235685685987925" + "809774119784191955543740774385492835953479066971963899979438" + "211272068701163464704436181757668455872462574422571325034113" + "760130682177348501458144714636434216374798906646576252086802" + "190576650522584472987248024379770735540050259550986944302085" + "016537978874317385914557625547772714417301204338373972354274" + "419077120195935070346230688523551832885027881558371920399052" + "186032556413960972812515180755144550327091852825587440311130" + "369879274596217199708705082236031422718889130402045378780140" + "972327814060383227111423352378654611732272529152765871889754" + "120890173540735187244359494818495116869106087097802117296794" + "230636162657107764132729771811932156398134588213625909013771" + "355672989281159028330647620507547914707927109442806484197371" + "160282370564676895887174641137770747013214469567460313906231" + "863055876527311358559655058178010195688508347865329804729357" + "897103417200485899156841586760786011075803410294390125765035" + "920926599317258260436879683255022799187512419040453065369911" + "323428101759967597271722888176287261643418634944123527371986" + "991235954064415358673716302132700617408956418914644864212332" + "976051347071095204508969677769360451886970029662989435406797" + "409579245892705640914616364216092565465060838723454093018319" + "313458636362826625288516894137766424262510338430134251698122" + "005230434085183091834211200122610210349443542674137356176019" + "994661296545554711839281438920485832102187150591906236696737" + "090784511846412155988675390082958065319591301717494963485010" + "165932792068277883516946041506017760788778509260259389639323" + "482577101846088517553013799076262873998643533979247791914386" + "960081984502800508683707313453769958011319871060688162544921" + "322796577704456915961808005946752071556794084904878487842807" + "578404859150538520763286422764601209313650629444128511505177" + "823078798079410053668821705549172247884539912031329017420556" + "518079856488045326357586430559199198231719076822308881971367" + "856956096577769576676503111475982888204421007623288070328718" + "645608772303264875379950063930108312080388786177437812751905" + "584120030072202190891266365873672180818190597661476916755677" + "715854057980258925181834233866429689226159872122377094852588" + "295898990349864384447444388136549436618687954074375252286589" + "048125818566139866145014540017458695425579859498034933692028" + "762317180933725539105161577403467580031256943949510269316175" + "359789478610609381312994169116761450212882441190603620361337" + "401742128185995015738801892316215217037671976109410724436579" + "379380129538698961487878976867532145962342350850191560252504" + "588328537917104636518954376662039025472528325798776052476332" + "427970936224611080771416068440161969697007132497588046375640" + "310336775861665604288980226938462461877670282350726508356795" + "083014162348375615542992942120111083796673667263131651518958" + "304763295180814137547257343856489773685828509608384174334970" + "422481342457552997903572290775133733384303950144498613229418" + "397179849510232211865542364757577463809559424236059129650578" + "274637695590441751279797225383786991494466903311241791050376" + "488510955932598072576401976708615886006919314135648608248191" + "372656573811888893772800596985615900536551083040785709141896" + "296641372542336858585285155522688752251142239708098420366878" + "152586610030593201454626208011881281672071882478014556327250" + "829447091860808595318353098051073163872713705786832133739305" + "274057247245024850663340733036617513800734787932326379905451" + "641681281905937253230152460358472580273562222569806348116698" + "527056831689088216346583586087162394060010249474899626302057" + "768256926924131071156960064207129684139721916331135576180148" + "586965323299105282337234352989143787169680122112557687809323" + "099327979778140351718902363172319583042200757772513950642086" + "386297462185028482882268586936548025649697633305907484971486" + "223468552187182907218267776718819086234809172430906474927279" + "424906332107667190886359046554485179791303881091265489293005" + "803215603269635123264170125730831784388656332832186157145305" + "499039125566362759346764541205369778479271774262726853968049" + "190835636788762895037454777680406940517308675355872838184645" + "304120861875050177485053074785988569599549623179532516740082" + "254762377654894606213282493506567652669958464338099434131023" + "532342380354716890817886177034306313775574548031278141878295" + "980251853307150740536081553178646800560107856455481390160382" + "005461126866350869752876888962834360568840429704959648279120" + "254570425069854306995075705052164177031686333733533637409730" + "984494412360475557526051699665012526136673750101428368173353" + "692291950799667471134257499676684610182758435845702912870768" + "634362269004291803824464876008785139313163075651280377342747" + "514196839209631064363659625214193456598788316913732358910439" + "144944289890962417978739445105407297303138526378679343093624" + "793916741811475534377782218853134322959860449406077325705367" + "583234650794982848738379033597318010226151625248974524473699" + "941563637866604856552441632431065309199219150015729366397177" + "270609089591346091474506939150782160740711907964322876145597" + "395145650253317824445860465336707220824713684429363769920064" + "328717106332354307126419445673184428951466178635088943030837" + "800062385933485349971069564992754655393085948953856883512745" + "276808726026162095157115221834856892971964760467320232208335" + "588069531017474361045746982594856036396319417833033871766181" + "277368016889308069711197719469472302905853290440210418307024" + "687328533297123196506483109819531394653772296480087430315397" + "910124977426694468497871449032647123366969051087888029764547" + "456415615898945773195285528874803499674998405090778746309320" + "064107872403793733160110719300206260714233458242454046254281" + "635285667702843088958126476571787667820961524650778676508787" + "287657900313313469833862488641675238189345272301200116311311" + "303492219734822823456297208532453055880821528468347578839024" + "182302606029773658762919244232625769059672709989813876079805" + "901731987280611645667105082802031385796293908530864172849314" + "734765038966270760935051139880192249903989938642795205092207" + "952822973691541552895072989465910085758076040250451592417680" + "531245659592881584721257685461735599337168675230848625905522" + "537954644173568345921153170415953958626219568206031281995507" + "754830587823977775747100055764292205421357056446830465793611" + "273763808185723813453738631569497245609975712828305215965826" + "765053388068801916539196811808128141857281722046227535409567" + "591186285705821199833303929519850375909134041147203658893734" + "153755227136429729680819659989646998542009258703527635118557" + "461312447384232179849362403511141932531785089741645572777420" + "823800529533589278423940195407958568894264010164248006540849" + "160087103041996738567121092172708859342210949217088143091653" + "037148698668697189317909020017411070411852839836652652230104" + "488866928634364560949066615472075465717187751987781313900056" + "044708657100493771599807097662839308147951336602016088038303" + "870626870505976949769475176739700850740489054760418683992822" + "102108113039966954472254660236287017169543329420623006920875" + "061938087152339674093328885612297439387396288738175863458442" + "357873826429100480375666769347774936081994000132266037789617" + "679830658781791760994378526913815818404152940284873358141843" + "597059137957964030223538823290728128419992789364472918525589" + "681285724973674079560291263860105160408412185466402633325963" + "644349004773740071252405214227130755717722371864438087813957" + "049334824031598041404099084234710294086909715648810172537956" + "835325926716084588757074055943229897544714984821916277164996" + "230599856478631481011984609516445087451467976563225183485707" + "905749943922496442802923068967076792686823389362481124460494" + "704283461711793778132596522789732235020165930073010737247996" + "756585398791522224385870682607436284058126317337050038121079" + "280726961697763447828452886465665300624268272487877857547882" + "040348230983233787526246480631864102696170452823458479032723" + "578830127941292909511711557404847061107334262109213252422470" + "319474329457122819963756131151585297962065956542350731131832" + "291167683289866880335703968881847060958949006126601275397222" + "963545028494290493580535125944932141737036395266333000222605" + "399939949397684787800655350500300253367688419355690911939522" + "954187696262129926633159777279286294093780940318487461712750" + "226387000627400399639544234254491419528782664148814752549434" + "958379626065942049557661210343054447391632257569905575104963" + "151978577601750196863513705539558684739468547692356001818703" + "346520584228266295190510902524185553948226797601549646906331" + "357318702512537284414411278940348553578854011691588522553966" + "396992880818547561630476530111651734988588440593633173143253" + "379921189582756007503422520592416527801478723731289759302726" + "954132658111452941824189900172140279856850327867101851354527" + "960707100257512325083967625754750701218030688324551798845572" + "563961467133540032201733663397872597974240680973907443484971" + "336778877548334885936748221459115133124927658634325658911822" + "141900465275779942660530609582835893020640555401613806067868" + "906672403337819356286761270165163376232221193189950310375294" + "099272473556899577746566950896500458917467484114752398834619" + "916525324505134294351704317783999741553112682962362548172424" + "553203677298220235774592337715700123823027248783397252232365" + "244614123085588619381923187064661903176533571726773552842050" + "702937175388102506427999185259894275281676527853075648559301" + "546937519854064218673593564079625201315914443572667155686776" + "278611844814181954280005884447565767647080527522321087613093" + "707671162160338881533455590709990074927708052244965764744729" + "329916773586445274306248672389904320297548114968852625553081" + "569329154117394637312504479221081821827497192245673295726668" + "999970170051411272831657975091029205402438644968163990840352" + "384606029708844825109435893409052496506265196679891398538136" + "476438486282449805899794734239202159510526533092974155392673" + "110448209969504483783671382659657251334863763189986240759871" + "1389056234111194498836994171142578125e-4952", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + true, + 0x2p-16448, + 0x2p-16448, + 0x2p-16448, + 0x2p-16448), + TEST ("9.1129988297061865063210148340485495409976270392339083593024" + "512175709292215834943420239017715645680129931183683680088277" + "549174640815550804249337701889745225137095564529448291964230" + "631595140838993915539064149585268223507994838838181714781019" + "998854320275387963459576151369217885561232382646492956705356" + "565551688308886521101701981493843492205658474297570333866605" + "298932345300005419066807300806935840975771140138244887971382" + "480306383029279087190728461573250887846318754007832114464683" + "664171452083726328092629849717599582714695998658062536715061" + "486659414671761410590867756059929866471508939201678361949569" + "105493407320443782389013421144031696166197712936581273093400" + "987818069535398834152409986110085052926337211200549444090110" + "947717190581225852922732363763307088865106375411776212774753" + "881242370509404376819363039948120731604116820734480620859463" + "053721188111541333511328522463373472526999986652124894823521" + "677055629197452315658307103340838430759142765166817775402542" + "424672713638170402336169639395588632161416761622732176576564" + "689048255479820989367151993310018548316769814664606197581315" + "042862562791300468342638911941746410076541796524707525552225" + "218810105957345303035393963179488682040705817772149861464367" + "875846321939885650620019792999548883603797914975087595720555" + "008891649198969277273442210230776269093622052361408012106817" + "903069953745909041514739880227089422181355813323880743747316" + "013769073985956031962404845484551938647636529313699033511745" + "442279141902356533018143182815187073441328510540492152576488" + "229985535798436239152483434901576880457556096136883541949311" + "550953165672585204177162938634659553875223901648885259822873" + "815598197021178988329613387166662012014085188285709633232513" + "061942105426273781618686365893871655369623538557877775965767" + "109785630310982604764603059355574307115163437126311616216384" + "242977475669012957189024924930269461826674503235685685987925" + "809774119784191955543740774385492835953479066971963899979438" + "211272068701163464704436181757668455872462574422571325034113" + "760130682177348501458144714636434216374798906646576252086802" + "190576650522584472987248024379770735540050259550986944302085" + "016537978874317385914557625547772714417301204338373972354274" + "419077120195935070346230688523551832885027881558371920399052" + "186032556413960972812515180755144550327091852825587440311130" + "369879274596217199708705082236031422718889130402045378780140" + "972327814060383227111423352378654611732272529152765871889754" + "120890173540735187244359494818495116869106087097802117296794" + "230636162657107764132729771811932156398134588213625909013771" + "355672989281159028330647620507547914707927109442806484197371" + "160282370564676895887174641137770747013214469567460313906231" + "863055876527311358559655058178010195688508347865329804729357" + "897103417200485899156841586760786011075803410294390125765035" + "920926599317258260436879683255022799187512419040453065369911" + "323428101759967597271722888176287261643418634944123527371986" + "991235954064415358673716302132700617408956418914644864212332" + "976051347071095204508969677769360451886970029662989435406797" + "409579245892705640914616364216092565465060838723454093018319" + "313458636362826625288516894137766424262510338430134251698122" + "005230434085183091834211200122610210349443542674137356176019" + "994661296545554711839281438920485832102187150591906236696737" + "090784511846412155988675390082958065319591301717494963485010" + "165932792068277883516946041506017760788778509260259389639323" + "482577101846088517553013799076262873998643533979247791914386" + "960081984502800508683707313453769958011319871060688162544921" + "322796577704456915961808005946752071556794084904878487842807" + "578404859150538520763286422764601209313650629444128511505177" + "823078798079410053668821705549172247884539912031329017420556" + "518079856488045326357586430559199198231719076822308881971367" + "856956096577769576676503111475982888204421007623288070328718" + "645608772303264875379950063930108312080388786177437812751905" + "584120030072202190891266365873672180818190597661476916755677" + "715854057980258925181834233866429689226159872122377094852588" + "295898990349864384447444388136549436618687954074375252286589" + "048125818566139866145014540017458695425579859498034933692028" + "762317180933725539105161577403467580031256943949510269316175" + "359789478610609381312994169116761450212882441190603620361337" + "401742128185995015738801892316215217037671976109410724436579" + "379380129538698961487878976867532145962342350850191560252504" + "588328537917104636518954376662039025472528325798776052476332" + "427970936224611080771416068440161969697007132497588046375640" + "310336775861665604288980226938462461877670282350726508356795" + "083014162348375615542992942120111083796673667263131651518958" + "304763295180814137547257343856489773685828509608384174334970" + "422481342457552997903572290775133733384303950144498613229418" + "397179849510232211865542364757577463809559424236059129650578" + "274637695590441751279797225383786991494466903311241791050376" + "488510955932598072576401976708615886006919314135648608248191" + "372656573811888893772800596985615900536551083040785709141896" + "296641372542336858585285155522688752251142239708098420366878" + "152586610030593201454626208011881281672071882478014556327250" + "829447091860808595318353098051073163872713705786832133739305" + "274057247245024850663340733036617513800734787932326379905451" + "641681281905937253230152460358472580273562222569806348116698" + "527056831689088216346583586087162394060010249474899626302057" + "768256926924131071156960064207129684139721916331135576180148" + "586965323299105282337234352989143787169680122112557687809323" + "099327979778140351718902363172319583042200757772513950642086" + "386297462185028482882268586936548025649697633305907484971486" + "223468552187182907218267776718819086234809172430906474927279" + "424906332107667190886359046554485179791303881091265489293005" + "803215603269635123264170125730831784388656332832186157145305" + "499039125566362759346764541205369778479271774262726853968049" + "190835636788762895037454777680406940517308675355872838184645" + "304120861875050177485053074785988569599549623179532516740082" + "254762377654894606213282493506567652669958464338099434131023" + "532342380354716890817886177034306313775574548031278141878295" + "980251853307150740536081553178646800560107856455481390160382" + "005461126866350869752876888962834360568840429704959648279120" + "254570425069854306995075705052164177031686333733533637409730" + "984494412360475557526051699665012526136673750101428368173353" + "692291950799667471134257499676684610182758435845702912870768" + "634362269004291803824464876008785139313163075651280377342747" + "514196839209631064363659625214193456598788316913732358910439" + "144944289890962417978739445105407297303138526378679343093624" + "793916741811475534377782218853134322959860449406077325705367" + "583234650794982848738379033597318010226151625248974524473699" + "941563637866604856552441632431065309199219150015729366397177" + "270609089591346091474506939150782160740711907964322876145597" + "395145650253317824445860465336707220824713684429363769920064" + "328717106332354307126419445673184428951466178635088943030837" + "800062385933485349971069564992754655393085948953856883512745" + "276808726026162095157115221834856892971964760467320232208335" + "588069531017474361045746982594856036396319417833033871766181" + "277368016889308069711197719469472302905853290440210418307024" + "687328533297123196506483109819531394653772296480087430315397" + "910124977426694468497871449032647123366969051087888029764547" + "456415615898945773195285528874803499674998405090778746309320" + "064107872403793733160110719300206260714233458242454046254281" + "635285667702843088958126476571787667820961524650778676508787" + "287657900313313469833862488641675238189345272301200116311311" + "303492219734822823456297208532453055880821528468347578839024" + "182302606029773658762919244232625769059672709989813876079805" + "901731987280611645667105082802031385796293908530864172849314" + "734765038966270760935051139880192249903989938642795205092207" + "952822973691541552895072989465910085758076040250451592417680" + "531245659592881584721257685461735599337168675230848625905522" + "537954644173568345921153170415953958626219568206031281995507" + "754830587823977775747100055764292205421357056446830465793611" + "273763808185723813453738631569497245609975712828305215965826" + "765053388068801916539196811808128141857281722046227535409567" + "591186285705821199833303929519850375909134041147203658893734" + "153755227136429729680819659989646998542009258703527635118557" + "461312447384232179849362403511141932531785089741645572777420" + "823800529533589278423940195407958568894264010164248006540849" + "160087103041996738567121092172708859342210949217088143091653" + "037148698668697189317909020017411070411852839836652652230104" + "488866928634364560949066615472075465717187751987781313900056" + "044708657100493771599807097662839308147951336602016088038303" + "870626870505976949769475176739700850740489054760418683992822" + "102108113039966954472254660236287017169543329420623006920875" + "061938087152339674093328885612297439387396288738175863458442" + "357873826429100480375666769347774936081994000132266037789617" + "679830658781791760994378526913815818404152940284873358141843" + "597059137957964030223538823290728128419992789364472918525589" + "681285724973674079560291263860105160408412185466402633325963" + "644349004773740071252405214227130755717722371864438087813957" + "049334824031598041404099084234710294086909715648810172537956" + "835325926716084588757074055943229897544714984821916277164996" + "230599856478631481011984609516445087451467976563225183485707" + "905749943922496442802923068967076792686823389362481124460494" + "704283461711793778132596522789732235020165930073010737247996" + "756585398791522224385870682607436284058126317337050038121079" + "280726961697763447828452886465665300624268272487877857547882" + "040348230983233787526246480631864102696170452823458479032723" + "578830127941292909511711557404847061107334262109213252422470" + "319474329457122819963756131151585297962065956542350731131832" + "291167683289866880335703968881847060958949006126601275397222" + "963545028494290493580535125944932141737036395266333000222605" + "399939949397684787800655350500300253367688419355690911939522" + "954187696262129926633159777279286294093780940318487461712750" + "226387000627400399639544234254491419528782664148814752549434" + "958379626065942049557661210343054447391632257569905575104963" + "151978577601750196863513705539558684739468547692356001818703" + "346520584228266295190510902524185553948226797601549646906331" + "357318702512537284414411278940348553578854011691588522553966" + "396992880818547561630476530111651734988588440593633173143253" + "379921189582756007503422520592416527801478723731289759302726" + "954132658111452941824189900172140279856850327867101851354527" + "960707100257512325083967625754750701218030688324551798845572" + "563961467133540032201733663397872597974240680973907443484971" + "336778877548334885936748221459115133124927658634325658911822" + "141900465275779942660530609582835893020640555401613806067868" + "906672403337819356286761270165163376232221193189950310375294" + "099272473556899577746566950896500458917467484114752398834619" + "916525324505134294351704317783999741553112682962362548172424" + "553203677298220235774592337715700123823027248783397252232365" + "244614123085588619381923187064661903176533571726773552842050" + "702937175388102506427999185259894275281676527853075648559301" + "546937519854064218673593564079625201315914443572667155686776" + "278611844814181954280005884447565767647080527522321087613093" + "707671162160338881533455590709990074927708052244965764744729" + "329916773586445274306248672389904320297548114968852625553081" + "569329154117394637312504479221081821827497192245673295726668" + "999970170051411272831657975091029205402438644968163990840352" + "384606029708844825109435893409052496506265196679891398538136" + "476438486282449805899794734239202159510526533092974155392673" + "110448209969504483783671382659657251334863763189986240759871" + "1389056234111194498836994171142578126e-4952", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-16448, + false, + 0x0p+0, + 0x4p-16448, + 0x0p+0, + 0x4p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x2p-16448, + 0x2p-16448, + 0x2p-16448, + 0x2.000000000004p-16448), + TEST ("-9.112998829706186506321014834048549540997627039233908359302" + "451217570929221583494342023901771564568012993118368368008827" + "754917464081555080424933770188974522513709556452944829196423" + "063159514083899391553906414958526822350799483883818171478101" + "999885432027538796345957615136921788556123238264649295670535" + "656555168830888652110170198149384349220565847429757033386660" + "529893234530000541906680730080693584097577114013824488797138" + "248030638302927908719072846157325088784631875400783211446468" + "366417145208372632809262984971759958271469599865806253671506" + "148665941467176141059086775605992986647150893920167836194956" + "910549340732044378238901342114403169616619771293658127309340" + "098781806953539883415240998611008505292633721120054944409011" + "094771719058122585292273236376330708886510637541177621277475" + "388124237050940437681936303994812073160411682073448062085946" + "305372118811154133351132852246337347252699998665212489482352" + "167705562919745231565830710334083843075914276516681777540254" + "242467271363817040233616963939558863216141676162273217657656" + "468904825547982098936715199331001854831676981466460619758131" + "504286256279130046834263891194174641007654179652470752555222" + "521881010595734530303539396317948868204070581777214986146436" + "787584632193988565062001979299954888360379791497508759572055" + "500889164919896927727344221023077626909362205236140801210681" + "790306995374590904151473988022708942218135581332388074374731" + "601376907398595603196240484548455193864763652931369903351174" + "544227914190235653301814318281518707344132851054049215257648" + "822998553579843623915248343490157688045755609613688354194931" + "155095316567258520417716293863465955387522390164888525982287" + "381559819702117898832961338716666201201408518828570963323251" + "306194210542627378161868636589387165536962353855787777596576" + "710978563031098260476460305935557430711516343712631161621638" + "424297747566901295718902492493026946182667450323568568598792" + "580977411978419195554374077438549283595347906697196389997943" + "821127206870116346470443618175766845587246257442257132503411" + "376013068217734850145814471463643421637479890664657625208680" + "219057665052258447298724802437977073554005025955098694430208" + "501653797887431738591455762554777271441730120433837397235427" + "441907712019593507034623068852355183288502788155837192039905" + "218603255641396097281251518075514455032709185282558744031113" + "036987927459621719970870508223603142271888913040204537878014" + "097232781406038322711142335237865461173227252915276587188975" + "412089017354073518724435949481849511686910608709780211729679" + "423063616265710776413272977181193215639813458821362590901377" + "135567298928115902833064762050754791470792710944280648419737" + "116028237056467689588717464113777074701321446956746031390623" + "186305587652731135855965505817801019568850834786532980472935" + "789710341720048589915684158676078601107580341029439012576503" + "592092659931725826043687968325502279918751241904045306536991" + "132342810175996759727172288817628726164341863494412352737198" + "699123595406441535867371630213270061740895641891464486421233" + "297605134707109520450896967776936045188697002966298943540679" + "740957924589270564091461636421609256546506083872345409301831" + "931345863636282662528851689413776642426251033843013425169812" + "200523043408518309183421120012261021034944354267413735617601" + "999466129654555471183928143892048583210218715059190623669673" + "709078451184641215598867539008295806531959130171749496348501" + "016593279206827788351694604150601776078877850926025938963932" + "348257710184608851755301379907626287399864353397924779191438" + "696008198450280050868370731345376995801131987106068816254492" + "132279657770445691596180800594675207155679408490487848784280" + "757840485915053852076328642276460120931365062944412851150517" + "782307879807941005366882170554917224788453991203132901742055" + "651807985648804532635758643055919919823171907682230888197136" + "785695609657776957667650311147598288820442100762328807032871" + "864560877230326487537995006393010831208038878617743781275190" + "558412003007220219089126636587367218081819059766147691675567" + "771585405798025892518183423386642968922615987212237709485258" + "829589899034986438444744438813654943661868795407437525228658" + "904812581856613986614501454001745869542557985949803493369202" + "876231718093372553910516157740346758003125694394951026931617" + "535978947861060938131299416911676145021288244119060362036133" + "740174212818599501573880189231621521703767197610941072443657" + "937938012953869896148787897686753214596234235085019156025250" + "458832853791710463651895437666203902547252832579877605247633" + "242797093622461108077141606844016196969700713249758804637564" + "031033677586166560428898022693846246187767028235072650835679" + "508301416234837561554299294212011108379667366726313165151895" + "830476329518081413754725734385648977368582850960838417433497" + "042248134245755299790357229077513373338430395014449861322941" + "839717984951023221186554236475757746380955942423605912965057" + "827463769559044175127979722538378699149446690331124179105037" + "648851095593259807257640197670861588600691931413564860824819" + "137265657381188889377280059698561590053655108304078570914189" + "629664137254233685858528515552268875225114223970809842036687" + "815258661003059320145462620801188128167207188247801455632725" + "082944709186080859531835309805107316387271370578683213373930" + "527405724724502485066334073303661751380073478793232637990545" + "164168128190593725323015246035847258027356222256980634811669" + "852705683168908821634658358608716239406001024947489962630205" + "776825692692413107115696006420712968413972191633113557618014" + "858696532329910528233723435298914378716968012211255768780932" + "309932797977814035171890236317231958304220075777251395064208" + "638629746218502848288226858693654802564969763330590748497148" + "622346855218718290721826777671881908623480917243090647492727" + "942490633210766719088635904655448517979130388109126548929300" + "580321560326963512326417012573083178438865633283218615714530" + "549903912556636275934676454120536977847927177426272685396804" + "919083563678876289503745477768040694051730867535587283818464" + "530412086187505017748505307478598856959954962317953251674008" + "225476237765489460621328249350656765266995846433809943413102" + "353234238035471689081788617703430631377557454803127814187829" + "598025185330715074053608155317864680056010785645548139016038" + "200546112686635086975287688896283436056884042970495964827912" + "025457042506985430699507570505216417703168633373353363740973" + "098449441236047555752605169966501252613667375010142836817335" + "369229195079966747113425749967668461018275843584570291287076" + "863436226900429180382446487600878513931316307565128037734274" + "751419683920963106436365962521419345659878831691373235891043" + "914494428989096241797873944510540729730313852637867934309362" + "479391674181147553437778221885313432295986044940607732570536" + "758323465079498284873837903359731801022615162524897452447369" + "994156363786660485655244163243106530919921915001572936639717" + "727060908959134609147450693915078216074071190796432287614559" + "739514565025331782444586046533670722082471368442936376992006" + "432871710633235430712641944567318442895146617863508894303083" + "780006238593348534997106956499275465539308594895385688351274" + "527680872602616209515711522183485689297196476046732023220833" + "558806953101747436104574698259485603639631941783303387176618" + "127736801688930806971119771946947230290585329044021041830702" + "468732853329712319650648310981953139465377229648008743031539" + "791012497742669446849787144903264712336696905108788802976454" + "745641561589894577319528552887480349967499840509077874630932" + "006410787240379373316011071930020626071423345824245404625428" + "163528566770284308895812647657178766782096152465077867650878" + "728765790031331346983386248864167523818934527230120011631131" + "130349221973482282345629720853245305588082152846834757883902" + "418230260602977365876291924423262576905967270998981387607980" + "590173198728061164566710508280203138579629390853086417284931" + "473476503896627076093505113988019224990398993864279520509220" + "795282297369154155289507298946591008575807604025045159241768" + "053124565959288158472125768546173559933716867523084862590552" + "253795464417356834592115317041595395862621956820603128199550" + "775483058782397777574710005576429220542135705644683046579361" + "127376380818572381345373863156949724560997571282830521596582" + "676505338806880191653919681180812814185728172204622753540956" + "759118628570582119983330392951985037590913404114720365889373" + "415375522713642972968081965998964699854200925870352763511855" + "746131244738423217984936240351114193253178508974164557277742" + "082380052953358927842394019540795856889426401016424800654084" + "916008710304199673856712109217270885934221094921708814309165" + "303714869866869718931790902001741107041185283983665265223010" + "448886692863436456094906661547207546571718775198778131390005" + "604470865710049377159980709766283930814795133660201608803830" + "387062687050597694976947517673970085074048905476041868399282" + "210210811303996695447225466023628701716954332942062300692087" + "506193808715233967409332888561229743938739628873817586345844" + "235787382642910048037566676934777493608199400013226603778961" + "767983065878179176099437852691381581840415294028487335814184" + "359705913795796403022353882329072812841999278936447291852558" + "968128572497367407956029126386010516040841218546640263332596" + "364434900477374007125240521422713075571772237186443808781395" + "704933482403159804140409908423471029408690971564881017253795" + "683532592671608458875707405594322989754471498482191627716499" + "623059985647863148101198460951644508745146797656322518348570" + "790574994392249644280292306896707679268682338936248112446049" + "470428346171179377813259652278973223502016593007301073724799" + "675658539879152222438587068260743628405812631733705003812107" + "928072696169776344782845288646566530062426827248787785754788" + "204034823098323378752624648063186410269617045282345847903272" + "357883012794129290951171155740484706110733426210921325242247" + "031947432945712281996375613115158529796206595654235073113183" + "229116768328986688033570396888184706095894900612660127539722" + "296354502849429049358053512594493214173703639526633300022260" + "539993994939768478780065535050030025336768841935569091193952" + "295418769626212992663315977727928629409378094031848746171275" + "022638700062740039963954423425449141952878266414881475254943" + "495837962606594204955766121034305444739163225756990557510496" + "315197857760175019686351370553955868473946854769235600181870" + "334652058422826629519051090252418555394822679760154964690633" + "135731870251253728441441127894034855357885401169158852255396" + "639699288081854756163047653011165173498858844059363317314325" + "337992118958275600750342252059241652780147872373128975930272" + "695413265811145294182418990017214027985685032786710185135452" + "796070710025751232508396762575475070121803068832455179884557" + "256396146713354003220173366339787259797424068097390744348497" + "133677887754833488593674822145911513312492765863432565891182" + "214190046527577994266053060958283589302064055540161380606786" + "890667240333781935628676127016516337623222119318995031037529" + "409927247355689957774656695089650045891746748411475239883461" + "991652532450513429435170431778399974155311268296236254817242" + "455320367729822023577459233771570012382302724878339725223236" + "524461412308558861938192318706466190317653357172677355284205" + "070293717538810250642799918525989427528167652785307564855930" + "154693751985406421867359356407962520131591444357266715568677" + "627861184481418195428000588444756576764708052752232108761309" + "370767116216033888153345559070999007492770805224496576474472" + "932991677358644527430624867238990432029754811496885262555308" + "156932915411739463731250447922108182182749719224567329572666" + "899997017005141127283165797509102920540243864496816399084035" + "238460602970884482510943589340905249650626519667989139853813" + "647643848628244980589979473423920215951052653309297415539267" + "311044820996950448378367138265965725133486376318998624075987" + "11389056234111194498836994171142578124e-4952", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x8p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x2p-16448, + -0x2p-16448, + -0x1.fffffffffffcp-16448, + -0x1.fffffffffffcp-16448), + TEST ("-9.112998829706186506321014834048549540997627039233908359302" + "451217570929221583494342023901771564568012993118368368008827" + "754917464081555080424933770188974522513709556452944829196423" + "063159514083899391553906414958526822350799483883818171478101" + "999885432027538796345957615136921788556123238264649295670535" + "656555168830888652110170198149384349220565847429757033386660" + "529893234530000541906680730080693584097577114013824488797138" + "248030638302927908719072846157325088784631875400783211446468" + "366417145208372632809262984971759958271469599865806253671506" + "148665941467176141059086775605992986647150893920167836194956" + "910549340732044378238901342114403169616619771293658127309340" + "098781806953539883415240998611008505292633721120054944409011" + "094771719058122585292273236376330708886510637541177621277475" + "388124237050940437681936303994812073160411682073448062085946" + "305372118811154133351132852246337347252699998665212489482352" + "167705562919745231565830710334083843075914276516681777540254" + "242467271363817040233616963939558863216141676162273217657656" + "468904825547982098936715199331001854831676981466460619758131" + "504286256279130046834263891194174641007654179652470752555222" + "521881010595734530303539396317948868204070581777214986146436" + "787584632193988565062001979299954888360379791497508759572055" + "500889164919896927727344221023077626909362205236140801210681" + "790306995374590904151473988022708942218135581332388074374731" + "601376907398595603196240484548455193864763652931369903351174" + "544227914190235653301814318281518707344132851054049215257648" + "822998553579843623915248343490157688045755609613688354194931" + "155095316567258520417716293863465955387522390164888525982287" + "381559819702117898832961338716666201201408518828570963323251" + "306194210542627378161868636589387165536962353855787777596576" + "710978563031098260476460305935557430711516343712631161621638" + "424297747566901295718902492493026946182667450323568568598792" + "580977411978419195554374077438549283595347906697196389997943" + "821127206870116346470443618175766845587246257442257132503411" + "376013068217734850145814471463643421637479890664657625208680" + "219057665052258447298724802437977073554005025955098694430208" + "501653797887431738591455762554777271441730120433837397235427" + "441907712019593507034623068852355183288502788155837192039905" + "218603255641396097281251518075514455032709185282558744031113" + "036987927459621719970870508223603142271888913040204537878014" + "097232781406038322711142335237865461173227252915276587188975" + "412089017354073518724435949481849511686910608709780211729679" + "423063616265710776413272977181193215639813458821362590901377" + "135567298928115902833064762050754791470792710944280648419737" + "116028237056467689588717464113777074701321446956746031390623" + "186305587652731135855965505817801019568850834786532980472935" + "789710341720048589915684158676078601107580341029439012576503" + "592092659931725826043687968325502279918751241904045306536991" + "132342810175996759727172288817628726164341863494412352737198" + "699123595406441535867371630213270061740895641891464486421233" + "297605134707109520450896967776936045188697002966298943540679" + "740957924589270564091461636421609256546506083872345409301831" + "931345863636282662528851689413776642426251033843013425169812" + "200523043408518309183421120012261021034944354267413735617601" + "999466129654555471183928143892048583210218715059190623669673" + "709078451184641215598867539008295806531959130171749496348501" + "016593279206827788351694604150601776078877850926025938963932" + "348257710184608851755301379907626287399864353397924779191438" + "696008198450280050868370731345376995801131987106068816254492" + "132279657770445691596180800594675207155679408490487848784280" + "757840485915053852076328642276460120931365062944412851150517" + "782307879807941005366882170554917224788453991203132901742055" + "651807985648804532635758643055919919823171907682230888197136" + "785695609657776957667650311147598288820442100762328807032871" + "864560877230326487537995006393010831208038878617743781275190" + "558412003007220219089126636587367218081819059766147691675567" + "771585405798025892518183423386642968922615987212237709485258" + "829589899034986438444744438813654943661868795407437525228658" + "904812581856613986614501454001745869542557985949803493369202" + "876231718093372553910516157740346758003125694394951026931617" + "535978947861060938131299416911676145021288244119060362036133" + "740174212818599501573880189231621521703767197610941072443657" + "937938012953869896148787897686753214596234235085019156025250" + "458832853791710463651895437666203902547252832579877605247633" + "242797093622461108077141606844016196969700713249758804637564" + "031033677586166560428898022693846246187767028235072650835679" + "508301416234837561554299294212011108379667366726313165151895" + "830476329518081413754725734385648977368582850960838417433497" + "042248134245755299790357229077513373338430395014449861322941" + "839717984951023221186554236475757746380955942423605912965057" + "827463769559044175127979722538378699149446690331124179105037" + "648851095593259807257640197670861588600691931413564860824819" + "137265657381188889377280059698561590053655108304078570914189" + "629664137254233685858528515552268875225114223970809842036687" + "815258661003059320145462620801188128167207188247801455632725" + "082944709186080859531835309805107316387271370578683213373930" + "527405724724502485066334073303661751380073478793232637990545" + "164168128190593725323015246035847258027356222256980634811669" + "852705683168908821634658358608716239406001024947489962630205" + "776825692692413107115696006420712968413972191633113557618014" + "858696532329910528233723435298914378716968012211255768780932" + "309932797977814035171890236317231958304220075777251395064208" + "638629746218502848288226858693654802564969763330590748497148" + "622346855218718290721826777671881908623480917243090647492727" + "942490633210766719088635904655448517979130388109126548929300" + "580321560326963512326417012573083178438865633283218615714530" + "549903912556636275934676454120536977847927177426272685396804" + "919083563678876289503745477768040694051730867535587283818464" + "530412086187505017748505307478598856959954962317953251674008" + "225476237765489460621328249350656765266995846433809943413102" + "353234238035471689081788617703430631377557454803127814187829" + "598025185330715074053608155317864680056010785645548139016038" + "200546112686635086975287688896283436056884042970495964827912" + "025457042506985430699507570505216417703168633373353363740973" + "098449441236047555752605169966501252613667375010142836817335" + "369229195079966747113425749967668461018275843584570291287076" + "863436226900429180382446487600878513931316307565128037734274" + "751419683920963106436365962521419345659878831691373235891043" + "914494428989096241797873944510540729730313852637867934309362" + "479391674181147553437778221885313432295986044940607732570536" + "758323465079498284873837903359731801022615162524897452447369" + "994156363786660485655244163243106530919921915001572936639717" + "727060908959134609147450693915078216074071190796432287614559" + "739514565025331782444586046533670722082471368442936376992006" + "432871710633235430712641944567318442895146617863508894303083" + "780006238593348534997106956499275465539308594895385688351274" + "527680872602616209515711522183485689297196476046732023220833" + "558806953101747436104574698259485603639631941783303387176618" + "127736801688930806971119771946947230290585329044021041830702" + "468732853329712319650648310981953139465377229648008743031539" + "791012497742669446849787144903264712336696905108788802976454" + "745641561589894577319528552887480349967499840509077874630932" + "006410787240379373316011071930020626071423345824245404625428" + "163528566770284308895812647657178766782096152465077867650878" + "728765790031331346983386248864167523818934527230120011631131" + "130349221973482282345629720853245305588082152846834757883902" + "418230260602977365876291924423262576905967270998981387607980" + "590173198728061164566710508280203138579629390853086417284931" + "473476503896627076093505113988019224990398993864279520509220" + "795282297369154155289507298946591008575807604025045159241768" + "053124565959288158472125768546173559933716867523084862590552" + "253795464417356834592115317041595395862621956820603128199550" + "775483058782397777574710005576429220542135705644683046579361" + "127376380818572381345373863156949724560997571282830521596582" + "676505338806880191653919681180812814185728172204622753540956" + "759118628570582119983330392951985037590913404114720365889373" + "415375522713642972968081965998964699854200925870352763511855" + "746131244738423217984936240351114193253178508974164557277742" + "082380052953358927842394019540795856889426401016424800654084" + "916008710304199673856712109217270885934221094921708814309165" + "303714869866869718931790902001741107041185283983665265223010" + "448886692863436456094906661547207546571718775198778131390005" + "604470865710049377159980709766283930814795133660201608803830" + "387062687050597694976947517673970085074048905476041868399282" + "210210811303996695447225466023628701716954332942062300692087" + "506193808715233967409332888561229743938739628873817586345844" + "235787382642910048037566676934777493608199400013226603778961" + "767983065878179176099437852691381581840415294028487335814184" + "359705913795796403022353882329072812841999278936447291852558" + "968128572497367407956029126386010516040841218546640263332596" + "364434900477374007125240521422713075571772237186443808781395" + "704933482403159804140409908423471029408690971564881017253795" + "683532592671608458875707405594322989754471498482191627716499" + "623059985647863148101198460951644508745146797656322518348570" + "790574994392249644280292306896707679268682338936248112446049" + "470428346171179377813259652278973223502016593007301073724799" + "675658539879152222438587068260743628405812631733705003812107" + "928072696169776344782845288646566530062426827248787785754788" + "204034823098323378752624648063186410269617045282345847903272" + "357883012794129290951171155740484706110733426210921325242247" + "031947432945712281996375613115158529796206595654235073113183" + "229116768328986688033570396888184706095894900612660127539722" + "296354502849429049358053512594493214173703639526633300022260" + "539993994939768478780065535050030025336768841935569091193952" + "295418769626212992663315977727928629409378094031848746171275" + "022638700062740039963954423425449141952878266414881475254943" + "495837962606594204955766121034305444739163225756990557510496" + "315197857760175019686351370553955868473946854769235600181870" + "334652058422826629519051090252418555394822679760154964690633" + "135731870251253728441441127894034855357885401169158852255396" + "639699288081854756163047653011165173498858844059363317314325" + "337992118958275600750342252059241652780147872373128975930272" + "695413265811145294182418990017214027985685032786710185135452" + "796070710025751232508396762575475070121803068832455179884557" + "256396146713354003220173366339787259797424068097390744348497" + "133677887754833488593674822145911513312492765863432565891182" + "214190046527577994266053060958283589302064055540161380606786" + "890667240333781935628676127016516337623222119318995031037529" + "409927247355689957774656695089650045891746748411475239883461" + "991652532450513429435170431778399974155311268296236254817242" + "455320367729822023577459233771570012382302724878339725223236" + "524461412308558861938192318706466190317653357172677355284205" + "070293717538810250642799918525989427528167652785307564855930" + "154693751985406421867359356407962520131591444357266715568677" + "627861184481418195428000588444756576764708052752232108761309" + "370767116216033888153345559070999007492770805224496576474472" + "932991677358644527430624867238990432029754811496885262555308" + "156932915411739463731250447922108182182749719224567329572666" + "899997017005141127283165797509102920540243864496816399084035" + "238460602970884482510943589340905249650626519667989139853813" + "647643848628244980589979473423920215951052653309297415539267" + "311044820996950448378367138265965725133486376318998624075987" + "11389056234111194498836994171142578125e-4952", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x8p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + true, + -0x2p-16448, + -0x2p-16448, + -0x2p-16448, + -0x2p-16448), + TEST ("-9.112998829706186506321014834048549540997627039233908359302" + "451217570929221583494342023901771564568012993118368368008827" + "754917464081555080424933770188974522513709556452944829196423" + "063159514083899391553906414958526822350799483883818171478101" + "999885432027538796345957615136921788556123238264649295670535" + "656555168830888652110170198149384349220565847429757033386660" + "529893234530000541906680730080693584097577114013824488797138" + "248030638302927908719072846157325088784631875400783211446468" + "366417145208372632809262984971759958271469599865806253671506" + "148665941467176141059086775605992986647150893920167836194956" + "910549340732044378238901342114403169616619771293658127309340" + "098781806953539883415240998611008505292633721120054944409011" + "094771719058122585292273236376330708886510637541177621277475" + "388124237050940437681936303994812073160411682073448062085946" + "305372118811154133351132852246337347252699998665212489482352" + "167705562919745231565830710334083843075914276516681777540254" + "242467271363817040233616963939558863216141676162273217657656" + "468904825547982098936715199331001854831676981466460619758131" + "504286256279130046834263891194174641007654179652470752555222" + "521881010595734530303539396317948868204070581777214986146436" + "787584632193988565062001979299954888360379791497508759572055" + "500889164919896927727344221023077626909362205236140801210681" + "790306995374590904151473988022708942218135581332388074374731" + "601376907398595603196240484548455193864763652931369903351174" + "544227914190235653301814318281518707344132851054049215257648" + "822998553579843623915248343490157688045755609613688354194931" + "155095316567258520417716293863465955387522390164888525982287" + "381559819702117898832961338716666201201408518828570963323251" + "306194210542627378161868636589387165536962353855787777596576" + "710978563031098260476460305935557430711516343712631161621638" + "424297747566901295718902492493026946182667450323568568598792" + "580977411978419195554374077438549283595347906697196389997943" + "821127206870116346470443618175766845587246257442257132503411" + "376013068217734850145814471463643421637479890664657625208680" + "219057665052258447298724802437977073554005025955098694430208" + "501653797887431738591455762554777271441730120433837397235427" + "441907712019593507034623068852355183288502788155837192039905" + "218603255641396097281251518075514455032709185282558744031113" + "036987927459621719970870508223603142271888913040204537878014" + "097232781406038322711142335237865461173227252915276587188975" + "412089017354073518724435949481849511686910608709780211729679" + "423063616265710776413272977181193215639813458821362590901377" + "135567298928115902833064762050754791470792710944280648419737" + "116028237056467689588717464113777074701321446956746031390623" + "186305587652731135855965505817801019568850834786532980472935" + "789710341720048589915684158676078601107580341029439012576503" + "592092659931725826043687968325502279918751241904045306536991" + "132342810175996759727172288817628726164341863494412352737198" + "699123595406441535867371630213270061740895641891464486421233" + "297605134707109520450896967776936045188697002966298943540679" + "740957924589270564091461636421609256546506083872345409301831" + "931345863636282662528851689413776642426251033843013425169812" + "200523043408518309183421120012261021034944354267413735617601" + "999466129654555471183928143892048583210218715059190623669673" + "709078451184641215598867539008295806531959130171749496348501" + "016593279206827788351694604150601776078877850926025938963932" + "348257710184608851755301379907626287399864353397924779191438" + "696008198450280050868370731345376995801131987106068816254492" + "132279657770445691596180800594675207155679408490487848784280" + "757840485915053852076328642276460120931365062944412851150517" + "782307879807941005366882170554917224788453991203132901742055" + "651807985648804532635758643055919919823171907682230888197136" + "785695609657776957667650311147598288820442100762328807032871" + "864560877230326487537995006393010831208038878617743781275190" + "558412003007220219089126636587367218081819059766147691675567" + "771585405798025892518183423386642968922615987212237709485258" + "829589899034986438444744438813654943661868795407437525228658" + "904812581856613986614501454001745869542557985949803493369202" + "876231718093372553910516157740346758003125694394951026931617" + "535978947861060938131299416911676145021288244119060362036133" + "740174212818599501573880189231621521703767197610941072443657" + "937938012953869896148787897686753214596234235085019156025250" + "458832853791710463651895437666203902547252832579877605247633" + "242797093622461108077141606844016196969700713249758804637564" + "031033677586166560428898022693846246187767028235072650835679" + "508301416234837561554299294212011108379667366726313165151895" + "830476329518081413754725734385648977368582850960838417433497" + "042248134245755299790357229077513373338430395014449861322941" + "839717984951023221186554236475757746380955942423605912965057" + "827463769559044175127979722538378699149446690331124179105037" + "648851095593259807257640197670861588600691931413564860824819" + "137265657381188889377280059698561590053655108304078570914189" + "629664137254233685858528515552268875225114223970809842036687" + "815258661003059320145462620801188128167207188247801455632725" + "082944709186080859531835309805107316387271370578683213373930" + "527405724724502485066334073303661751380073478793232637990545" + "164168128190593725323015246035847258027356222256980634811669" + "852705683168908821634658358608716239406001024947489962630205" + "776825692692413107115696006420712968413972191633113557618014" + "858696532329910528233723435298914378716968012211255768780932" + "309932797977814035171890236317231958304220075777251395064208" + "638629746218502848288226858693654802564969763330590748497148" + "622346855218718290721826777671881908623480917243090647492727" + "942490633210766719088635904655448517979130388109126548929300" + "580321560326963512326417012573083178438865633283218615714530" + "549903912556636275934676454120536977847927177426272685396804" + "919083563678876289503745477768040694051730867535587283818464" + "530412086187505017748505307478598856959954962317953251674008" + "225476237765489460621328249350656765266995846433809943413102" + "353234238035471689081788617703430631377557454803127814187829" + "598025185330715074053608155317864680056010785645548139016038" + "200546112686635086975287688896283436056884042970495964827912" + "025457042506985430699507570505216417703168633373353363740973" + "098449441236047555752605169966501252613667375010142836817335" + "369229195079966747113425749967668461018275843584570291287076" + "863436226900429180382446487600878513931316307565128037734274" + "751419683920963106436365962521419345659878831691373235891043" + "914494428989096241797873944510540729730313852637867934309362" + "479391674181147553437778221885313432295986044940607732570536" + "758323465079498284873837903359731801022615162524897452447369" + "994156363786660485655244163243106530919921915001572936639717" + "727060908959134609147450693915078216074071190796432287614559" + "739514565025331782444586046533670722082471368442936376992006" + "432871710633235430712641944567318442895146617863508894303083" + "780006238593348534997106956499275465539308594895385688351274" + "527680872602616209515711522183485689297196476046732023220833" + "558806953101747436104574698259485603639631941783303387176618" + "127736801688930806971119771946947230290585329044021041830702" + "468732853329712319650648310981953139465377229648008743031539" + "791012497742669446849787144903264712336696905108788802976454" + "745641561589894577319528552887480349967499840509077874630932" + "006410787240379373316011071930020626071423345824245404625428" + "163528566770284308895812647657178766782096152465077867650878" + "728765790031331346983386248864167523818934527230120011631131" + "130349221973482282345629720853245305588082152846834757883902" + "418230260602977365876291924423262576905967270998981387607980" + "590173198728061164566710508280203138579629390853086417284931" + "473476503896627076093505113988019224990398993864279520509220" + "795282297369154155289507298946591008575807604025045159241768" + "053124565959288158472125768546173559933716867523084862590552" + "253795464417356834592115317041595395862621956820603128199550" + "775483058782397777574710005576429220542135705644683046579361" + "127376380818572381345373863156949724560997571282830521596582" + "676505338806880191653919681180812814185728172204622753540956" + "759118628570582119983330392951985037590913404114720365889373" + "415375522713642972968081965998964699854200925870352763511855" + "746131244738423217984936240351114193253178508974164557277742" + "082380052953358927842394019540795856889426401016424800654084" + "916008710304199673856712109217270885934221094921708814309165" + "303714869866869718931790902001741107041185283983665265223010" + "448886692863436456094906661547207546571718775198778131390005" + "604470865710049377159980709766283930814795133660201608803830" + "387062687050597694976947517673970085074048905476041868399282" + "210210811303996695447225466023628701716954332942062300692087" + "506193808715233967409332888561229743938739628873817586345844" + "235787382642910048037566676934777493608199400013226603778961" + "767983065878179176099437852691381581840415294028487335814184" + "359705913795796403022353882329072812841999278936447291852558" + "968128572497367407956029126386010516040841218546640263332596" + "364434900477374007125240521422713075571772237186443808781395" + "704933482403159804140409908423471029408690971564881017253795" + "683532592671608458875707405594322989754471498482191627716499" + "623059985647863148101198460951644508745146797656322518348570" + "790574994392249644280292306896707679268682338936248112446049" + "470428346171179377813259652278973223502016593007301073724799" + "675658539879152222438587068260743628405812631733705003812107" + "928072696169776344782845288646566530062426827248787785754788" + "204034823098323378752624648063186410269617045282345847903272" + "357883012794129290951171155740484706110733426210921325242247" + "031947432945712281996375613115158529796206595654235073113183" + "229116768328986688033570396888184706095894900612660127539722" + "296354502849429049358053512594493214173703639526633300022260" + "539993994939768478780065535050030025336768841935569091193952" + "295418769626212992663315977727928629409378094031848746171275" + "022638700062740039963954423425449141952878266414881475254943" + "495837962606594204955766121034305444739163225756990557510496" + "315197857760175019686351370553955868473946854769235600181870" + "334652058422826629519051090252418555394822679760154964690633" + "135731870251253728441441127894034855357885401169158852255396" + "639699288081854756163047653011165173498858844059363317314325" + "337992118958275600750342252059241652780147872373128975930272" + "695413265811145294182418990017214027985685032786710185135452" + "796070710025751232508396762575475070121803068832455179884557" + "256396146713354003220173366339787259797424068097390744348497" + "133677887754833488593674822145911513312492765863432565891182" + "214190046527577994266053060958283589302064055540161380606786" + "890667240333781935628676127016516337623222119318995031037529" + "409927247355689957774656695089650045891746748411475239883461" + "991652532450513429435170431778399974155311268296236254817242" + "455320367729822023577459233771570012382302724878339725223236" + "524461412308558861938192318706466190317653357172677355284205" + "070293717538810250642799918525989427528167652785307564855930" + "154693751985406421867359356407962520131591444357266715568677" + "627861184481418195428000588444756576764708052752232108761309" + "370767116216033888153345559070999007492770805224496576474472" + "932991677358644527430624867238990432029754811496885262555308" + "156932915411739463731250447922108182182749719224567329572666" + "899997017005141127283165797509102920540243864496816399084035" + "238460602970884482510943589340905249650626519667989139853813" + "647643848628244980589979473423920215951052653309297415539267" + "311044820996950448378367138265965725133486376318998624075987" + "11389056234111194498836994171142578126e-4952", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x8p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-16448, + -0x4p-16448, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x2.000000000004p-16448, + -0x2p-16448, + -0x2p-16448, + -0x2p-16448), + TEST ("3.2375875597190125554622194791138232762497846690173405048449" + "421945985197700620596855088357456383249701279390707384240598" + "382936099431912710233425550359863089915213963553756674672083" + "673128192358701197242632527769951957277781260855740340354110" + "173441284912381364143945515141786687806740155311932822963199" + "131134959539539338316310328556057915323285980341541664226172" + "265348802632447238304822896568757017013159021750199744350376" + "278243566840330589397015778833566517337174685312047058426075" + "688036665697114219175258344917835835984013214761767520398571" + "735519302688914468501077605843338555214753050109407568139932" + "147308502166696009676987494125921676927574464221699654264839" + "192243410627511520570610765229732327315423820550872393685221" + "676561948307418196052769717057382723931306989375320957256133" + "838073129463951849807075348034900035402513943244599879584009" + "391110011261908615236154859382854977144106096407982738165117" + "693915685918231984764157652755343417097983676870433731452629" + "339981084526616826599425863049784138127555181662391766144738" + "159400253422795753041594932607700680306368857466952063923782" + "760519487592638820793893796669403574411398166619131986561877" + "034635197232626532239192571857518274939275861531537920777299" + "133535479548088762634002006634954143608168633852204577195463" + "389533233992867620995583241321034602255800668175356808869060" + "608582640890741203603916133682748118680676374951545690715916" + "241859799379894025137504643469040366684778763795442214328000" + "375999444991619403217748350277527106812175542863660436614910" + "135938862296156144947361864759321605496309393905421651264941" + "669606814994816518612155298709843817262034769175075602668866" + "926449523554218142013501373514352370369126244144449924971423" + "038024236058971106053649565799145071085840022305247663313482" + "714565918140785997808209749619683146844964283106915422726638" + "184861327711776708749278315100024436584176080783836115268999" + "055336294569042349971163039294272620322160728879610722678506" + "182344928526064885227397447578450046944618127903428943538029" + "386719288345854473283987116842451647036255801966780244103035" + "425445345127067921349083698736056197567752071915587544133815" + "717564310032485290205726480489464589999677885266171263493459" + "668963623768410922688414177814149693150024191921819721215688" + "114324591287371281400636455584825253000890602388603923710921" + "026880979879158388608823700222683123228822356907857261909150" + "626993825760416437415551396973489279578569909699853422995997" + "974315036153120383930698087773157253674975950409660938084071" + "173163693891122166282318691732176374528554627905530306369204" + "877964658806333996327938827344733821685425961846791581492287" + "250044047142934607523718654369478552373072400018635730811749" + "291666457582760812726851561001954207941547404866373158231367" + "986951247388733285659455982411993350593989550494594498447410" + "984783303191128659803467713819821511544998464785455306500918" + "241648925913966507036336000231915215026183799886938007038845" + "551916478649593272604688927931953165785101738164060543643192" + "949066412847647883846835866623820426428526541564774787007791" + "235843699657232847114093617412355486871810526396392792853731" + "390841657984518997639795008374280777823099107035223998600103" + "103211166230289241182380237703814248941627178152962100972452" + "217697144954497443279450919433943252592977710901289696002698" + "225209041938801190947812141758873162203113090284565687499100" + "109623665868340184032428667217835198069330185880779776269137" + "742366802202585247113480377505916462865316253065105837519292" + "805411191872195967066157363040364443666632564266439033866945" + "366496486863801221986778957510023272290593640187551645170603" + "215150911733580059874983597994671388176488814794186236946834" + "548816837468411497151813344980969677026131105901402313456769" + "561412278508799050185582199844418197980544632067644131002512" + "557755358307705356209461595354064971347590431926479961905129" + "785864961996560707071051177738535042777950247546470241655891" + "294428226271478689174637951663865529219133988782700199051475" + "108495188941141025360733690471601309904116260484264378352956" + "830972782977747351810451586166745640802378131466232692150196" + "132319386267589275314909450293562079332893638471814389025392" + "970579695249613486078445695214422379148991006996109216699215" + "721671648754881325271879493185438097033881789311707997697928" + "860866812849648616086569281093053695399558469641977866770538" + "476039621947215238679930485285585513808236992918733520331110" + "962448142457896209307561142289713638388281085340301520317159" + "297224995464365477734040179470355969363384621039467975256670" + "339354334892926205316491997244008324897517881293654265688813" + "283579663372924392043825371743576754041055802440187836850412" + "247984570221893156921757872572872036331343007592090605703195" + "088864753777199111760713027328198781654685927174063882187275" + "850263521274368447629947228263907797373221137688424821608129" + "731003236738630502344377228987961455961818623205503012858619" + "800521948637807438081069469400793496307826769301971342062597" + "391253779410607511754278887744936774785938056823221738917303" + "119592848951788560393540150358649310736020595310015728915288" + "289821678102453433273888879288862086153270028346900686360943" + "250522514297816412678213672667152836436597491522644579383191" + "851483036048273636234050603745735057899230038434384361744893" + "838050985090837220507663282503497932038372021626246900935334" + "781144388106031405650705176699646299475436084049881780196520" + "881623075256119318210664937469946410480660118598143375898298" + "965497205621170906772915413181530577151676241283182977713765" + "317889730886996471681592298058774155948285325398399674640645" + "566475947058303746531133735308766583802401453804232106737787" + "768035926272312574958173945816077962772826443125107145322971" + "087220172175473177449006473180221085709470643042801004189714" + "505520073568915195232936144169440163547568663500508335014169" + "425050712038101167190534305435310279534374364467455668392421" + "298604104431988622194699721632249712583483143417550152131186" + "288827131347662976240916448058011869761525369135147129192405" + "037216807405860168320999468074663117771890506566769628495813" + "837909047220874786467663205170561835819702362482274133227483" + "041342457179876653773960112367066273208176545656826800069574" + "547599816180234764485446735080683694920665668954370505715843" + "455110709594838989387382250502925336743830916124954071268053" + "817964873658921319164268375226716232666274830656557657055342" + "393552148933959057023293404027940528842591460490646295820755" + "765633076707491896621769767253619370462005760078938144396953" + "018925287611875441613896820035092167912718365454954166761481" + "511451950826683236776211829914518353242818636196417736206010" + "145109509967467266157037719712666871515644277723594273405669" + "093518586548079997818085130346801040781966074621669280188633" + "856299289656492439545033914935979634179552686396067914528336" + "924678729357419403624798426886422277256625046946795576781709" + "298737741510378578072199383561520569978396254537274419476511" + "983161908266152660163477408756159700314280122283281906103567" + "067156627222418787671312246698375736071215395722993294041012" + "744631560602983489316782773611740570974847045870362276861106" + "774130949410119612624380274679529647271294627526939490197641" + "645383447755544661714281218489998189691140343327976729279891" + "077101372792811842951182338559423852563331641533781432796742" + "873181364582071661749961126386895359760476172215209100274274" + "851619657020388051618654944574445941780637669570374280535432" + "399157923698778110534174856844986671232161320063786308144771" + "068130888985636449091787794632959555876880672773686838364706" + "122084832995722603440165161942472322987408003421165899848443" + "566885769845535074102932500939450142098799833145629484519298" + "622410092757836842296697186410137365818568152771850732591405" + "340248509247875448717161746544246407280913725135059228268131" + "453903691495906528862410006254958805237716723952273129715780" + "425223305517882562616830806755498203755676925741529569939445" + "043490046171854709456730491532189688306135861932534903184518" + "717706426178028900836080044604143054210332610482947502104703" + "032028463320549525316174330585387581543470878545616097381416" + "151451037487775797335749896735101048367502483255117772375025" + "269956476872153642623856062175536913321594213515989059505375" + "135183515207096576145781316398544325320022366962008554087665" + "201050763789833457082359181807492731245904330245198691471329" + "319324627030678762142685799400660305214140453863665517807185" + "105354694177602424937823924511789133225030926924236498557565" + "212794565582753399214908928688568628950225640472058381324292" + "866007645368390366981937596341868992912741319342960598330486" + "905946276235953206760977215407164729909506118583728562718724" + "235732515062300426080741679038098122641980345051854359908213" + "563779664847422505775922437272989231878912994048540484468227" + "199282393172540734295329890896755037903724644870572648941076" + "132423009124870700536763793881894969000042397318202298868940" + "530196108237639578098191879486398269734335286831689173606327" + "500405178476864790935386838169242131756729797688220656276969" + "434749140204830563840068728357383111109865861495106613619153" + "421725274090787422508800568671498311491210197298472420373359" + "044400631309819996507004167876832936101195902219429743174557" + "163362274547892397934880322990633165889175059124060202200452" + "648684577182821651588921716304707095995039972827781680978274" + "973838841958209215836456212939412000456040621743349981715350" + "305133662772937143899882197561295808685181679238411733642697" + "748892466944352640514849114619882270112386610376024527101889" + "119004382703622803911212700216792471528793241950356942780714" + "774957204475130171711488773121937363663487116301055073658645" + "980695862570269762957141239436916216723776945522480189876803" + "386123827956059851911061129713987960026363403936931196519733" + "447116468545744829997003979525368783485129837821983305137448" + "031689360764270759437872004895754351479890333865299565515706" + "690471030702230767978923298480584997256328135245813726407464" + "159230169328539541524724878662873185450510653764301207480799" + "488602832618557388369552461881286225098286358672257087829660" + "174231705350465091313887538950130611513878400895128618426154" + "417299623157313010877679890009181366178705821415173309356192" + "686429159835537275875876767919535369607142366878476025895389" + "279625854409611312402187942369446302119309705461187450803468" + "606366203101933821675974655441744883993796837164178911391575" + "751463591650231265941242686108002052587760190005508737394014" + "453031299745602214380618917954427803281262300931789525045703" + "809571995929933387196864877982754748535701000330924817431298" + "365273697561943437891318220691072831562717726798635382168915" + "187137325209768346284183473712613689334546294053718697897526" + "843398053681374508250012035211936425982389543291022583173280" + "985811169783438836113209408147936547458073361625570571955232" + "746103236016857123149307991441916732438322836596693687161268" + "151183603534413030099360835441935243365729307681545065674775" + "655582111435085683962037818795920337874290127531069511296530" + "746308404963763022896682861683252995925040540038039172626001" + "958340013361801588367655990575379797454237110701588716509764" + "759243657077584013289594787913434812509790293636440469725564" + "222946985585616708175959944099853232059130350099233608207347" + "955460820122006976717445739825352919058005528371183277021250" + "186916447745609162301667393077050176560656798672598371789181" + "232542195795945358691713761483976100058707499929103557275695" + "937295677892604799308353051124627278706035295473126217205599" + "530746756205492173148619619059839609108464715691924592576481" + "382126740168148453274964955074129767533813576349605298268179" + "068244338581354855186516322703199278802275718580352103754433" + "240982354636196477238624205575823556321375833700666021556412" + "182358152808745703724362178773168996492870519432472065091133" + "11767578124e-4966", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-16496), + TEST ("3.2375875597190125554622194791138232762497846690173405048449" + "421945985197700620596855088357456383249701279390707384240598" + "382936099431912710233425550359863089915213963553756674672083" + "673128192358701197242632527769951957277781260855740340354110" + "173441284912381364143945515141786687806740155311932822963199" + "131134959539539338316310328556057915323285980341541664226172" + "265348802632447238304822896568757017013159021750199744350376" + "278243566840330589397015778833566517337174685312047058426075" + "688036665697114219175258344917835835984013214761767520398571" + "735519302688914468501077605843338555214753050109407568139932" + "147308502166696009676987494125921676927574464221699654264839" + "192243410627511520570610765229732327315423820550872393685221" + "676561948307418196052769717057382723931306989375320957256133" + "838073129463951849807075348034900035402513943244599879584009" + "391110011261908615236154859382854977144106096407982738165117" + "693915685918231984764157652755343417097983676870433731452629" + "339981084526616826599425863049784138127555181662391766144738" + "159400253422795753041594932607700680306368857466952063923782" + "760519487592638820793893796669403574411398166619131986561877" + "034635197232626532239192571857518274939275861531537920777299" + "133535479548088762634002006634954143608168633852204577195463" + "389533233992867620995583241321034602255800668175356808869060" + "608582640890741203603916133682748118680676374951545690715916" + "241859799379894025137504643469040366684778763795442214328000" + "375999444991619403217748350277527106812175542863660436614910" + "135938862296156144947361864759321605496309393905421651264941" + "669606814994816518612155298709843817262034769175075602668866" + "926449523554218142013501373514352370369126244144449924971423" + "038024236058971106053649565799145071085840022305247663313482" + "714565918140785997808209749619683146844964283106915422726638" + "184861327711776708749278315100024436584176080783836115268999" + "055336294569042349971163039294272620322160728879610722678506" + "182344928526064885227397447578450046944618127903428943538029" + "386719288345854473283987116842451647036255801966780244103035" + "425445345127067921349083698736056197567752071915587544133815" + "717564310032485290205726480489464589999677885266171263493459" + "668963623768410922688414177814149693150024191921819721215688" + "114324591287371281400636455584825253000890602388603923710921" + "026880979879158388608823700222683123228822356907857261909150" + "626993825760416437415551396973489279578569909699853422995997" + "974315036153120383930698087773157253674975950409660938084071" + "173163693891122166282318691732176374528554627905530306369204" + "877964658806333996327938827344733821685425961846791581492287" + "250044047142934607523718654369478552373072400018635730811749" + "291666457582760812726851561001954207941547404866373158231367" + "986951247388733285659455982411993350593989550494594498447410" + "984783303191128659803467713819821511544998464785455306500918" + "241648925913966507036336000231915215026183799886938007038845" + "551916478649593272604688927931953165785101738164060543643192" + "949066412847647883846835866623820426428526541564774787007791" + "235843699657232847114093617412355486871810526396392792853731" + "390841657984518997639795008374280777823099107035223998600103" + "103211166230289241182380237703814248941627178152962100972452" + "217697144954497443279450919433943252592977710901289696002698" + "225209041938801190947812141758873162203113090284565687499100" + "109623665868340184032428667217835198069330185880779776269137" + "742366802202585247113480377505916462865316253065105837519292" + "805411191872195967066157363040364443666632564266439033866945" + "366496486863801221986778957510023272290593640187551645170603" + "215150911733580059874983597994671388176488814794186236946834" + "548816837468411497151813344980969677026131105901402313456769" + "561412278508799050185582199844418197980544632067644131002512" + "557755358307705356209461595354064971347590431926479961905129" + "785864961996560707071051177738535042777950247546470241655891" + "294428226271478689174637951663865529219133988782700199051475" + "108495188941141025360733690471601309904116260484264378352956" + "830972782977747351810451586166745640802378131466232692150196" + "132319386267589275314909450293562079332893638471814389025392" + "970579695249613486078445695214422379148991006996109216699215" + "721671648754881325271879493185438097033881789311707997697928" + "860866812849648616086569281093053695399558469641977866770538" + "476039621947215238679930485285585513808236992918733520331110" + "962448142457896209307561142289713638388281085340301520317159" + "297224995464365477734040179470355969363384621039467975256670" + "339354334892926205316491997244008324897517881293654265688813" + "283579663372924392043825371743576754041055802440187836850412" + "247984570221893156921757872572872036331343007592090605703195" + "088864753777199111760713027328198781654685927174063882187275" + "850263521274368447629947228263907797373221137688424821608129" + "731003236738630502344377228987961455961818623205503012858619" + "800521948637807438081069469400793496307826769301971342062597" + "391253779410607511754278887744936774785938056823221738917303" + "119592848951788560393540150358649310736020595310015728915288" + "289821678102453433273888879288862086153270028346900686360943" + "250522514297816412678213672667152836436597491522644579383191" + "851483036048273636234050603745735057899230038434384361744893" + "838050985090837220507663282503497932038372021626246900935334" + "781144388106031405650705176699646299475436084049881780196520" + "881623075256119318210664937469946410480660118598143375898298" + "965497205621170906772915413181530577151676241283182977713765" + "317889730886996471681592298058774155948285325398399674640645" + "566475947058303746531133735308766583802401453804232106737787" + "768035926272312574958173945816077962772826443125107145322971" + "087220172175473177449006473180221085709470643042801004189714" + "505520073568915195232936144169440163547568663500508335014169" + "425050712038101167190534305435310279534374364467455668392421" + "298604104431988622194699721632249712583483143417550152131186" + "288827131347662976240916448058011869761525369135147129192405" + "037216807405860168320999468074663117771890506566769628495813" + "837909047220874786467663205170561835819702362482274133227483" + "041342457179876653773960112367066273208176545656826800069574" + "547599816180234764485446735080683694920665668954370505715843" + "455110709594838989387382250502925336743830916124954071268053" + "817964873658921319164268375226716232666274830656557657055342" + "393552148933959057023293404027940528842591460490646295820755" + "765633076707491896621769767253619370462005760078938144396953" + "018925287611875441613896820035092167912718365454954166761481" + "511451950826683236776211829914518353242818636196417736206010" + "145109509967467266157037719712666871515644277723594273405669" + "093518586548079997818085130346801040781966074621669280188633" + "856299289656492439545033914935979634179552686396067914528336" + "924678729357419403624798426886422277256625046946795576781709" + "298737741510378578072199383561520569978396254537274419476511" + "983161908266152660163477408756159700314280122283281906103567" + "067156627222418787671312246698375736071215395722993294041012" + "744631560602983489316782773611740570974847045870362276861106" + "774130949410119612624380274679529647271294627526939490197641" + "645383447755544661714281218489998189691140343327976729279891" + "077101372792811842951182338559423852563331641533781432796742" + "873181364582071661749961126386895359760476172215209100274274" + "851619657020388051618654944574445941780637669570374280535432" + "399157923698778110534174856844986671232161320063786308144771" + "068130888985636449091787794632959555876880672773686838364706" + "122084832995722603440165161942472322987408003421165899848443" + "566885769845535074102932500939450142098799833145629484519298" + "622410092757836842296697186410137365818568152771850732591405" + "340248509247875448717161746544246407280913725135059228268131" + "453903691495906528862410006254958805237716723952273129715780" + "425223305517882562616830806755498203755676925741529569939445" + "043490046171854709456730491532189688306135861932534903184518" + "717706426178028900836080044604143054210332610482947502104703" + "032028463320549525316174330585387581543470878545616097381416" + "151451037487775797335749896735101048367502483255117772375025" + "269956476872153642623856062175536913321594213515989059505375" + "135183515207096576145781316398544325320022366962008554087665" + "201050763789833457082359181807492731245904330245198691471329" + "319324627030678762142685799400660305214140453863665517807185" + "105354694177602424937823924511789133225030926924236498557565" + "212794565582753399214908928688568628950225640472058381324292" + "866007645368390366981937596341868992912741319342960598330486" + "905946276235953206760977215407164729909506118583728562718724" + "235732515062300426080741679038098122641980345051854359908213" + "563779664847422505775922437272989231878912994048540484468227" + "199282393172540734295329890896755037903724644870572648941076" + "132423009124870700536763793881894969000042397318202298868940" + "530196108237639578098191879486398269734335286831689173606327" + "500405178476864790935386838169242131756729797688220656276969" + "434749140204830563840068728357383111109865861495106613619153" + "421725274090787422508800568671498311491210197298472420373359" + "044400631309819996507004167876832936101195902219429743174557" + "163362274547892397934880322990633165889175059124060202200452" + "648684577182821651588921716304707095995039972827781680978274" + "973838841958209215836456212939412000456040621743349981715350" + "305133662772937143899882197561295808685181679238411733642697" + "748892466944352640514849114619882270112386610376024527101889" + "119004382703622803911212700216792471528793241950356942780714" + "774957204475130171711488773121937363663487116301055073658645" + "980695862570269762957141239436916216723776945522480189876803" + "386123827956059851911061129713987960026363403936931196519733" + "447116468545744829997003979525368783485129837821983305137448" + "031689360764270759437872004895754351479890333865299565515706" + "690471030702230767978923298480584997256328135245813726407464" + "159230169328539541524724878662873185450510653764301207480799" + "488602832618557388369552461881286225098286358672257087829660" + "174231705350465091313887538950130611513878400895128618426154" + "417299623157313010877679890009181366178705821415173309356192" + "686429159835537275875876767919535369607142366878476025895389" + "279625854409611312402187942369446302119309705461187450803468" + "606366203101933821675974655441744883993796837164178911391575" + "751463591650231265941242686108002052587760190005508737394014" + "453031299745602214380618917954427803281262300931789525045703" + "809571995929933387196864877982754748535701000330924817431298" + "365273697561943437891318220691072831562717726798635382168915" + "187137325209768346284183473712613689334546294053718697897526" + "843398053681374508250012035211936425982389543291022583173280" + "985811169783438836113209408147936547458073361625570571955232" + "746103236016857123149307991441916732438322836596693687161268" + "151183603534413030099360835441935243365729307681545065674775" + "655582111435085683962037818795920337874290127531069511296530" + "746308404963763022896682861683252995925040540038039172626001" + "958340013361801588367655990575379797454237110701588716509764" + "759243657077584013289594787913434812509790293636440469725564" + "222946985585616708175959944099853232059130350099233608207347" + "955460820122006976717445739825352919058005528371183277021250" + "186916447745609162301667393077050176560656798672598371789181" + "232542195795945358691713761483976100058707499929103557275695" + "937295677892604799308353051124627278706035295473126217205599" + "530746756205492173148619619059839609108464715691924592576481" + "382126740168148453274964955074129767533813576349605298268179" + "068244338581354855186516322703199278802275718580352103754433" + "240982354636196477238624205575823556321375833700666021556412" + "182358152808745703724362178773168996492870519432472065091133" + "11767578125e-4966", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-16496), + TEST ("3.2375875597190125554622194791138232762497846690173405048449" + "421945985197700620596855088357456383249701279390707384240598" + "382936099431912710233425550359863089915213963553756674672083" + "673128192358701197242632527769951957277781260855740340354110" + "173441284912381364143945515141786687806740155311932822963199" + "131134959539539338316310328556057915323285980341541664226172" + "265348802632447238304822896568757017013159021750199744350376" + "278243566840330589397015778833566517337174685312047058426075" + "688036665697114219175258344917835835984013214761767520398571" + "735519302688914468501077605843338555214753050109407568139932" + "147308502166696009676987494125921676927574464221699654264839" + "192243410627511520570610765229732327315423820550872393685221" + "676561948307418196052769717057382723931306989375320957256133" + "838073129463951849807075348034900035402513943244599879584009" + "391110011261908615236154859382854977144106096407982738165117" + "693915685918231984764157652755343417097983676870433731452629" + "339981084526616826599425863049784138127555181662391766144738" + "159400253422795753041594932607700680306368857466952063923782" + "760519487592638820793893796669403574411398166619131986561877" + "034635197232626532239192571857518274939275861531537920777299" + "133535479548088762634002006634954143608168633852204577195463" + "389533233992867620995583241321034602255800668175356808869060" + "608582640890741203603916133682748118680676374951545690715916" + "241859799379894025137504643469040366684778763795442214328000" + "375999444991619403217748350277527106812175542863660436614910" + "135938862296156144947361864759321605496309393905421651264941" + "669606814994816518612155298709843817262034769175075602668866" + "926449523554218142013501373514352370369126244144449924971423" + "038024236058971106053649565799145071085840022305247663313482" + "714565918140785997808209749619683146844964283106915422726638" + "184861327711776708749278315100024436584176080783836115268999" + "055336294569042349971163039294272620322160728879610722678506" + "182344928526064885227397447578450046944618127903428943538029" + "386719288345854473283987116842451647036255801966780244103035" + "425445345127067921349083698736056197567752071915587544133815" + "717564310032485290205726480489464589999677885266171263493459" + "668963623768410922688414177814149693150024191921819721215688" + "114324591287371281400636455584825253000890602388603923710921" + "026880979879158388608823700222683123228822356907857261909150" + "626993825760416437415551396973489279578569909699853422995997" + "974315036153120383930698087773157253674975950409660938084071" + "173163693891122166282318691732176374528554627905530306369204" + "877964658806333996327938827344733821685425961846791581492287" + "250044047142934607523718654369478552373072400018635730811749" + "291666457582760812726851561001954207941547404866373158231367" + "986951247388733285659455982411993350593989550494594498447410" + "984783303191128659803467713819821511544998464785455306500918" + "241648925913966507036336000231915215026183799886938007038845" + "551916478649593272604688927931953165785101738164060543643192" + "949066412847647883846835866623820426428526541564774787007791" + "235843699657232847114093617412355486871810526396392792853731" + "390841657984518997639795008374280777823099107035223998600103" + "103211166230289241182380237703814248941627178152962100972452" + "217697144954497443279450919433943252592977710901289696002698" + "225209041938801190947812141758873162203113090284565687499100" + "109623665868340184032428667217835198069330185880779776269137" + "742366802202585247113480377505916462865316253065105837519292" + "805411191872195967066157363040364443666632564266439033866945" + "366496486863801221986778957510023272290593640187551645170603" + "215150911733580059874983597994671388176488814794186236946834" + "548816837468411497151813344980969677026131105901402313456769" + "561412278508799050185582199844418197980544632067644131002512" + "557755358307705356209461595354064971347590431926479961905129" + "785864961996560707071051177738535042777950247546470241655891" + "294428226271478689174637951663865529219133988782700199051475" + "108495188941141025360733690471601309904116260484264378352956" + "830972782977747351810451586166745640802378131466232692150196" + "132319386267589275314909450293562079332893638471814389025392" + "970579695249613486078445695214422379148991006996109216699215" + "721671648754881325271879493185438097033881789311707997697928" + "860866812849648616086569281093053695399558469641977866770538" + "476039621947215238679930485285585513808236992918733520331110" + "962448142457896209307561142289713638388281085340301520317159" + "297224995464365477734040179470355969363384621039467975256670" + "339354334892926205316491997244008324897517881293654265688813" + "283579663372924392043825371743576754041055802440187836850412" + "247984570221893156921757872572872036331343007592090605703195" + "088864753777199111760713027328198781654685927174063882187275" + "850263521274368447629947228263907797373221137688424821608129" + "731003236738630502344377228987961455961818623205503012858619" + "800521948637807438081069469400793496307826769301971342062597" + "391253779410607511754278887744936774785938056823221738917303" + "119592848951788560393540150358649310736020595310015728915288" + "289821678102453433273888879288862086153270028346900686360943" + "250522514297816412678213672667152836436597491522644579383191" + "851483036048273636234050603745735057899230038434384361744893" + "838050985090837220507663282503497932038372021626246900935334" + "781144388106031405650705176699646299475436084049881780196520" + "881623075256119318210664937469946410480660118598143375898298" + "965497205621170906772915413181530577151676241283182977713765" + "317889730886996471681592298058774155948285325398399674640645" + "566475947058303746531133735308766583802401453804232106737787" + "768035926272312574958173945816077962772826443125107145322971" + "087220172175473177449006473180221085709470643042801004189714" + "505520073568915195232936144169440163547568663500508335014169" + "425050712038101167190534305435310279534374364467455668392421" + "298604104431988622194699721632249712583483143417550152131186" + "288827131347662976240916448058011869761525369135147129192405" + "037216807405860168320999468074663117771890506566769628495813" + "837909047220874786467663205170561835819702362482274133227483" + "041342457179876653773960112367066273208176545656826800069574" + "547599816180234764485446735080683694920665668954370505715843" + "455110709594838989387382250502925336743830916124954071268053" + "817964873658921319164268375226716232666274830656557657055342" + "393552148933959057023293404027940528842591460490646295820755" + "765633076707491896621769767253619370462005760078938144396953" + "018925287611875441613896820035092167912718365454954166761481" + "511451950826683236776211829914518353242818636196417736206010" + "145109509967467266157037719712666871515644277723594273405669" + "093518586548079997818085130346801040781966074621669280188633" + "856299289656492439545033914935979634179552686396067914528336" + "924678729357419403624798426886422277256625046946795576781709" + "298737741510378578072199383561520569978396254537274419476511" + "983161908266152660163477408756159700314280122283281906103567" + "067156627222418787671312246698375736071215395722993294041012" + "744631560602983489316782773611740570974847045870362276861106" + "774130949410119612624380274679529647271294627526939490197641" + "645383447755544661714281218489998189691140343327976729279891" + "077101372792811842951182338559423852563331641533781432796742" + "873181364582071661749961126386895359760476172215209100274274" + "851619657020388051618654944574445941780637669570374280535432" + "399157923698778110534174856844986671232161320063786308144771" + "068130888985636449091787794632959555876880672773686838364706" + "122084832995722603440165161942472322987408003421165899848443" + "566885769845535074102932500939450142098799833145629484519298" + "622410092757836842296697186410137365818568152771850732591405" + "340248509247875448717161746544246407280913725135059228268131" + "453903691495906528862410006254958805237716723952273129715780" + "425223305517882562616830806755498203755676925741529569939445" + "043490046171854709456730491532189688306135861932534903184518" + "717706426178028900836080044604143054210332610482947502104703" + "032028463320549525316174330585387581543470878545616097381416" + "151451037487775797335749896735101048367502483255117772375025" + "269956476872153642623856062175536913321594213515989059505375" + "135183515207096576145781316398544325320022366962008554087665" + "201050763789833457082359181807492731245904330245198691471329" + "319324627030678762142685799400660305214140453863665517807185" + "105354694177602424937823924511789133225030926924236498557565" + "212794565582753399214908928688568628950225640472058381324292" + "866007645368390366981937596341868992912741319342960598330486" + "905946276235953206760977215407164729909506118583728562718724" + "235732515062300426080741679038098122641980345051854359908213" + "563779664847422505775922437272989231878912994048540484468227" + "199282393172540734295329890896755037903724644870572648941076" + "132423009124870700536763793881894969000042397318202298868940" + "530196108237639578098191879486398269734335286831689173606327" + "500405178476864790935386838169242131756729797688220656276969" + "434749140204830563840068728357383111109865861495106613619153" + "421725274090787422508800568671498311491210197298472420373359" + "044400631309819996507004167876832936101195902219429743174557" + "163362274547892397934880322990633165889175059124060202200452" + "648684577182821651588921716304707095995039972827781680978274" + "973838841958209215836456212939412000456040621743349981715350" + "305133662772937143899882197561295808685181679238411733642697" + "748892466944352640514849114619882270112386610376024527101889" + "119004382703622803911212700216792471528793241950356942780714" + "774957204475130171711488773121937363663487116301055073658645" + "980695862570269762957141239436916216723776945522480189876803" + "386123827956059851911061129713987960026363403936931196519733" + "447116468545744829997003979525368783485129837821983305137448" + "031689360764270759437872004895754351479890333865299565515706" + "690471030702230767978923298480584997256328135245813726407464" + "159230169328539541524724878662873185450510653764301207480799" + "488602832618557388369552461881286225098286358672257087829660" + "174231705350465091313887538950130611513878400895128618426154" + "417299623157313010877679890009181366178705821415173309356192" + "686429159835537275875876767919535369607142366878476025895389" + "279625854409611312402187942369446302119309705461187450803468" + "606366203101933821675974655441744883993796837164178911391575" + "751463591650231265941242686108002052587760190005508737394014" + "453031299745602214380618917954427803281262300931789525045703" + "809571995929933387196864877982754748535701000330924817431298" + "365273697561943437891318220691072831562717726798635382168915" + "187137325209768346284183473712613689334546294053718697897526" + "843398053681374508250012035211936425982389543291022583173280" + "985811169783438836113209408147936547458073361625570571955232" + "746103236016857123149307991441916732438322836596693687161268" + "151183603534413030099360835441935243365729307681545065674775" + "655582111435085683962037818795920337874290127531069511296530" + "746308404963763022896682861683252995925040540038039172626001" + "958340013361801588367655990575379797454237110701588716509764" + "759243657077584013289594787913434812509790293636440469725564" + "222946985585616708175959944099853232059130350099233608207347" + "955460820122006976717445739825352919058005528371183277021250" + "186916447745609162301667393077050176560656798672598371789181" + "232542195795945358691713761483976100058707499929103557275695" + "937295677892604799308353051124627278706035295473126217205599" + "530746756205492173148619619059839609108464715691924592576481" + "382126740168148453274964955074129767533813576349605298268179" + "068244338581354855186516322703199278802275718580352103754433" + "240982354636196477238624205575823556321375833700666021556412" + "182358152808745703724362178773168996492870519432472065091133" + "11767578126e-4966", + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-152, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x8p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-16448, + false, + 0x0p+0, + 0x0p+0, + 0x0p+0, + 0x4p-1076, + false, + 0x0p+0, + 0x4p-16496, + 0x0p+0, + 0x4p-16496), + TEST ("-3.237587559719012555462219479113823276249784669017340504844" + "942194598519770062059685508835745638324970127939070738424059" + "838293609943191271023342555035986308991521396355375667467208" + "367312819235870119724263252776995195727778126085574034035411" + "017344128491238136414394551514178668780674015531193282296319" + "913113495953953933831631032855605791532328598034154166422617" + "226534880263244723830482289656875701701315902175019974435037" + "627824356684033058939701577883356651733717468531204705842607" + "568803666569711421917525834491783583598401321476176752039857" + "173551930268891446850107760584333855521475305010940756813993" + "214730850216669600967698749412592167692757446422169965426483" + "919224341062751152057061076522973232731542382055087239368522" + "167656194830741819605276971705738272393130698937532095725613" + "383807312946395184980707534803490003540251394324459987958400" + "939111001126190861523615485938285497714410609640798273816511" + "769391568591823198476415765275534341709798367687043373145262" + "933998108452661682659942586304978413812755518166239176614473" + "815940025342279575304159493260770068030636885746695206392378" + "276051948759263882079389379666940357441139816661913198656187" + "703463519723262653223919257185751827493927586153153792077729" + "913353547954808876263400200663495414360816863385220457719546" + "338953323399286762099558324132103460225580066817535680886906" + "060858264089074120360391613368274811868067637495154569071591" + "624185979937989402513750464346904036668477876379544221432800" + "037599944499161940321774835027752710681217554286366043661491" + "013593886229615614494736186475932160549630939390542165126494" + "166960681499481651861215529870984381726203476917507560266886" + "692644952355421814201350137351435237036912624414444992497142" + "303802423605897110605364956579914507108584002230524766331348" + "271456591814078599780820974961968314684496428310691542272663" + "818486132771177670874927831510002443658417608078383611526899" + "905533629456904234997116303929427262032216072887961072267850" + "618234492852606488522739744757845004694461812790342894353802" + "938671928834585447328398711684245164703625580196678024410303" + "542544534512706792134908369873605619756775207191558754413381" + "571756431003248529020572648048946458999967788526617126349345" + "966896362376841092268841417781414969315002419192181972121568" + "811432459128737128140063645558482525300089060238860392371092" + "102688097987915838860882370022268312322882235690785726190915" + "062699382576041643741555139697348927957856990969985342299599" + "797431503615312038393069808777315725367497595040966093808407" + "117316369389112216628231869173217637452855462790553030636920" + "487796465880633399632793882734473382168542596184679158149228" + "725004404714293460752371865436947855237307240001863573081174" + "929166645758276081272685156100195420794154740486637315823136" + "798695124738873328565945598241199335059398955049459449844741" + "098478330319112865980346771381982151154499846478545530650091" + "824164892591396650703633600023191521502618379988693800703884" + "555191647864959327260468892793195316578510173816406054364319" + "294906641284764788384683586662382042642852654156477478700779" + "123584369965723284711409361741235548687181052639639279285373" + "139084165798451899763979500837428077782309910703522399860010" + "310321116623028924118238023770381424894162717815296210097245" + "221769714495449744327945091943394325259297771090128969600269" + "822520904193880119094781214175887316220311309028456568749910" + "010962366586834018403242866721783519806933018588077977626913" + "774236680220258524711348037750591646286531625306510583751929" + "280541119187219596706615736304036444366663256426643903386694" + "536649648686380122198677895751002327229059364018755164517060" + "321515091173358005987498359799467138817648881479418623694683" + "454881683746841149715181334498096967702613110590140231345676" + "956141227850879905018558219984441819798054463206764413100251" + "255775535830770535620946159535406497134759043192647996190512" + "978586496199656070707105117773853504277795024754647024165589" + "129442822627147868917463795166386552921913398878270019905147" + "510849518894114102536073369047160130990411626048426437835295" + "683097278297774735181045158616674564080237813146623269215019" + "613231938626758927531490945029356207933289363847181438902539" + "297057969524961348607844569521442237914899100699610921669921" + "572167164875488132527187949318543809703388178931170799769792" + "886086681284964861608656928109305369539955846964197786677053" + "847603962194721523867993048528558551380823699291873352033111" + "096244814245789620930756114228971363838828108534030152031715" + "929722499546436547773404017947035596936338462103946797525667" + "033935433489292620531649199724400832489751788129365426568881" + "328357966337292439204382537174357675404105580244018783685041" + "224798457022189315692175787257287203633134300759209060570319" + "508886475377719911176071302732819878165468592717406388218727" + "585026352127436844762994722826390779737322113768842482160812" + "973100323673863050234437722898796145596181862320550301285861" + "980052194863780743808106946940079349630782676930197134206259" + "739125377941060751175427888774493677478593805682322173891730" + "311959284895178856039354015035864931073602059531001572891528" + "828982167810245343327388887928886208615327002834690068636094" + "325052251429781641267821367266715283643659749152264457938319" + "185148303604827363623405060374573505789923003843438436174489" + "383805098509083722050766328250349793203837202162624690093533" + "478114438810603140565070517669964629947543608404988178019652" + "088162307525611931821066493746994641048066011859814337589829" + "896549720562117090677291541318153057715167624128318297771376" + "531788973088699647168159229805877415594828532539839967464064" + "556647594705830374653113373530876658380240145380423210673778" + "776803592627231257495817394581607796277282644312510714532297" + "108722017217547317744900647318022108570947064304280100418971" + "450552007356891519523293614416944016354756866350050833501416" + "942505071203810116719053430543531027953437436446745566839242" + "129860410443198862219469972163224971258348314341755015213118" + "628882713134766297624091644805801186976152536913514712919240" + "503721680740586016832099946807466311777189050656676962849581" + "383790904722087478646766320517056183581970236248227413322748" + "304134245717987665377396011236706627320817654565682680006957" + "454759981618023476448544673508068369492066566895437050571584" + "345511070959483898938738225050292533674383091612495407126805" + "381796487365892131916426837522671623266627483065655765705534" + "239355214893395905702329340402794052884259146049064629582075" + "576563307670749189662176976725361937046200576007893814439695" + "301892528761187544161389682003509216791271836545495416676148" + "151145195082668323677621182991451835324281863619641773620601" + "014510950996746726615703771971266687151564427772359427340566" + "909351858654807999781808513034680104078196607462166928018863" + "385629928965649243954503391493597963417955268639606791452833" + "692467872935741940362479842688642227725662504694679557678170" + "929873774151037857807219938356152056997839625453727441947651" + "198316190826615266016347740875615970031428012228328190610356" + "706715662722241878767131224669837573607121539572299329404101" + "274463156060298348931678277361174057097484704587036227686110" + "677413094941011961262438027467952964727129462752693949019764" + "164538344775554466171428121848999818969114034332797672927989" + "107710137279281184295118233855942385256333164153378143279674" + "287318136458207166174996112638689535976047617221520910027427" + "485161965702038805161865494457444594178063766957037428053543" + "239915792369877811053417485684498667123216132006378630814477" + "106813088898563644909178779463295955587688067277368683836470" + "612208483299572260344016516194247232298740800342116589984844" + "356688576984553507410293250093945014209879983314562948451929" + "862241009275783684229669718641013736581856815277185073259140" + "534024850924787544871716174654424640728091372513505922826813" + "145390369149590652886241000625495880523771672395227312971578" + "042522330551788256261683080675549820375567692574152956993944" + "504349004617185470945673049153218968830613586193253490318451" + "871770642617802890083608004460414305421033261048294750210470" + "303202846332054952531617433058538758154347087854561609738141" + "615145103748777579733574989673510104836750248325511777237502" + "526995647687215364262385606217553691332159421351598905950537" + "513518351520709657614578131639854432532002236696200855408766" + "520105076378983345708235918180749273124590433024519869147132" + "931932462703067876214268579940066030521414045386366551780718" + "510535469417760242493782392451178913322503092692423649855756" + "521279456558275339921490892868856862895022564047205838132429" + "286600764536839036698193759634186899291274131934296059833048" + "690594627623595320676097721540716472990950611858372856271872" + "423573251506230042608074167903809812264198034505185435990821" + "356377966484742250577592243727298923187891299404854048446822" + "719928239317254073429532989089675503790372464487057264894107" + "613242300912487070053676379388189496900004239731820229886894" + "053019610823763957809819187948639826973433528683168917360632" + "750040517847686479093538683816924213175672979768822065627696" + "943474914020483056384006872835738311110986586149510661361915" + "342172527409078742250880056867149831149121019729847242037335" + "904440063130981999650700416787683293610119590221942974317455" + "716336227454789239793488032299063316588917505912406020220045" + "264868457718282165158892171630470709599503997282778168097827" + "497383884195820921583645621293941200045604062174334998171535" + "030513366277293714389988219756129580868518167923841173364269" + "774889246694435264051484911461988227011238661037602452710188" + "911900438270362280391121270021679247152879324195035694278071" + "477495720447513017171148877312193736366348711630105507365864" + "598069586257026976295714123943691621672377694552248018987680" + "338612382795605985191106112971398796002636340393693119651973" + "344711646854574482999700397952536878348512983782198330513744" + "803168936076427075943787200489575435147989033386529956551570" + "669047103070223076797892329848058499725632813524581372640746" + "415923016932853954152472487866287318545051065376430120748079" + "948860283261855738836955246188128622509828635867225708782966" + "017423170535046509131388753895013061151387840089512861842615" + "441729962315731301087767989000918136617870582141517330935619" + "268642915983553727587587676791953536960714236687847602589538" + "927962585440961131240218794236944630211930970546118745080346" + "860636620310193382167597465544174488399379683716417891139157" + "575146359165023126594124268610800205258776019000550873739401" + "445303129974560221438061891795442780328126230093178952504570" + "380957199592993338719686487798275474853570100033092481743129" + "836527369756194343789131822069107283156271772679863538216891" + "518713732520976834628418347371261368933454629405371869789752" + "684339805368137450825001203521193642598238954329102258317328" + "098581116978343883611320940814793654745807336162557057195523" + "274610323601685712314930799144191673243832283659669368716126" + "815118360353441303009936083544193524336572930768154506567477" + "565558211143508568396203781879592033787429012753106951129653" + "074630840496376302289668286168325299592504054003803917262600" + "195834001336180158836765599057537979745423711070158871650976" + "475924365707758401328959478791343481250979029363644046972556" + "422294698558561670817595994409985323205913035009923360820734" + "795546082012200697671744573982535291905800552837118327702125" + "018691644774560916230166739307705017656065679867259837178918" + "123254219579594535869171376148397610005870749992910355727569" + "593729567789260479930835305112462727870603529547312621720559" + "953074675620549217314861961905983960910846471569192459257648" + "138212674016814845327496495507412976753381357634960529826817" + "906824433858135485518651632270319927880227571858035210375443" + "324098235463619647723862420557582355632137583370066602155641" + "218235815280874570372436217877316899649287051943247206509113" + "311767578124e-4966", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x8p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-16496, + -0x0p+0, + -0x0p+0, + -0x0p+0), + TEST ("-3.237587559719012555462219479113823276249784669017340504844" + "942194598519770062059685508835745638324970127939070738424059" + "838293609943191271023342555035986308991521396355375667467208" + "367312819235870119724263252776995195727778126085574034035411" + "017344128491238136414394551514178668780674015531193282296319" + "913113495953953933831631032855605791532328598034154166422617" + "226534880263244723830482289656875701701315902175019974435037" + "627824356684033058939701577883356651733717468531204705842607" + "568803666569711421917525834491783583598401321476176752039857" + "173551930268891446850107760584333855521475305010940756813993" + "214730850216669600967698749412592167692757446422169965426483" + "919224341062751152057061076522973232731542382055087239368522" + "167656194830741819605276971705738272393130698937532095725613" + "383807312946395184980707534803490003540251394324459987958400" + "939111001126190861523615485938285497714410609640798273816511" + "769391568591823198476415765275534341709798367687043373145262" + "933998108452661682659942586304978413812755518166239176614473" + "815940025342279575304159493260770068030636885746695206392378" + "276051948759263882079389379666940357441139816661913198656187" + "703463519723262653223919257185751827493927586153153792077729" + "913353547954808876263400200663495414360816863385220457719546" + "338953323399286762099558324132103460225580066817535680886906" + "060858264089074120360391613368274811868067637495154569071591" + "624185979937989402513750464346904036668477876379544221432800" + "037599944499161940321774835027752710681217554286366043661491" + "013593886229615614494736186475932160549630939390542165126494" + "166960681499481651861215529870984381726203476917507560266886" + "692644952355421814201350137351435237036912624414444992497142" + "303802423605897110605364956579914507108584002230524766331348" + "271456591814078599780820974961968314684496428310691542272663" + "818486132771177670874927831510002443658417608078383611526899" + "905533629456904234997116303929427262032216072887961072267850" + "618234492852606488522739744757845004694461812790342894353802" + "938671928834585447328398711684245164703625580196678024410303" + "542544534512706792134908369873605619756775207191558754413381" + "571756431003248529020572648048946458999967788526617126349345" + "966896362376841092268841417781414969315002419192181972121568" + "811432459128737128140063645558482525300089060238860392371092" + "102688097987915838860882370022268312322882235690785726190915" + "062699382576041643741555139697348927957856990969985342299599" + "797431503615312038393069808777315725367497595040966093808407" + "117316369389112216628231869173217637452855462790553030636920" + "487796465880633399632793882734473382168542596184679158149228" + "725004404714293460752371865436947855237307240001863573081174" + "929166645758276081272685156100195420794154740486637315823136" + "798695124738873328565945598241199335059398955049459449844741" + "098478330319112865980346771381982151154499846478545530650091" + "824164892591396650703633600023191521502618379988693800703884" + "555191647864959327260468892793195316578510173816406054364319" + "294906641284764788384683586662382042642852654156477478700779" + "123584369965723284711409361741235548687181052639639279285373" + "139084165798451899763979500837428077782309910703522399860010" + "310321116623028924118238023770381424894162717815296210097245" + "221769714495449744327945091943394325259297771090128969600269" + "822520904193880119094781214175887316220311309028456568749910" + "010962366586834018403242866721783519806933018588077977626913" + "774236680220258524711348037750591646286531625306510583751929" + "280541119187219596706615736304036444366663256426643903386694" + "536649648686380122198677895751002327229059364018755164517060" + "321515091173358005987498359799467138817648881479418623694683" + "454881683746841149715181334498096967702613110590140231345676" + "956141227850879905018558219984441819798054463206764413100251" + "255775535830770535620946159535406497134759043192647996190512" + "978586496199656070707105117773853504277795024754647024165589" + "129442822627147868917463795166386552921913398878270019905147" + "510849518894114102536073369047160130990411626048426437835295" + "683097278297774735181045158616674564080237813146623269215019" + "613231938626758927531490945029356207933289363847181438902539" + "297057969524961348607844569521442237914899100699610921669921" + "572167164875488132527187949318543809703388178931170799769792" + "886086681284964861608656928109305369539955846964197786677053" + "847603962194721523867993048528558551380823699291873352033111" + "096244814245789620930756114228971363838828108534030152031715" + "929722499546436547773404017947035596936338462103946797525667" + "033935433489292620531649199724400832489751788129365426568881" + "328357966337292439204382537174357675404105580244018783685041" + "224798457022189315692175787257287203633134300759209060570319" + "508886475377719911176071302732819878165468592717406388218727" + "585026352127436844762994722826390779737322113768842482160812" + "973100323673863050234437722898796145596181862320550301285861" + "980052194863780743808106946940079349630782676930197134206259" + "739125377941060751175427888774493677478593805682322173891730" + "311959284895178856039354015035864931073602059531001572891528" + "828982167810245343327388887928886208615327002834690068636094" + "325052251429781641267821367266715283643659749152264457938319" + "185148303604827363623405060374573505789923003843438436174489" + "383805098509083722050766328250349793203837202162624690093533" + "478114438810603140565070517669964629947543608404988178019652" + "088162307525611931821066493746994641048066011859814337589829" + "896549720562117090677291541318153057715167624128318297771376" + "531788973088699647168159229805877415594828532539839967464064" + "556647594705830374653113373530876658380240145380423210673778" + "776803592627231257495817394581607796277282644312510714532297" + "108722017217547317744900647318022108570947064304280100418971" + "450552007356891519523293614416944016354756866350050833501416" + "942505071203810116719053430543531027953437436446745566839242" + "129860410443198862219469972163224971258348314341755015213118" + "628882713134766297624091644805801186976152536913514712919240" + "503721680740586016832099946807466311777189050656676962849581" + "383790904722087478646766320517056183581970236248227413322748" + "304134245717987665377396011236706627320817654565682680006957" + "454759981618023476448544673508068369492066566895437050571584" + "345511070959483898938738225050292533674383091612495407126805" + "381796487365892131916426837522671623266627483065655765705534" + "239355214893395905702329340402794052884259146049064629582075" + "576563307670749189662176976725361937046200576007893814439695" + "301892528761187544161389682003509216791271836545495416676148" + "151145195082668323677621182991451835324281863619641773620601" + "014510950996746726615703771971266687151564427772359427340566" + "909351858654807999781808513034680104078196607462166928018863" + "385629928965649243954503391493597963417955268639606791452833" + "692467872935741940362479842688642227725662504694679557678170" + "929873774151037857807219938356152056997839625453727441947651" + "198316190826615266016347740875615970031428012228328190610356" + "706715662722241878767131224669837573607121539572299329404101" + "274463156060298348931678277361174057097484704587036227686110" + "677413094941011961262438027467952964727129462752693949019764" + "164538344775554466171428121848999818969114034332797672927989" + "107710137279281184295118233855942385256333164153378143279674" + "287318136458207166174996112638689535976047617221520910027427" + "485161965702038805161865494457444594178063766957037428053543" + "239915792369877811053417485684498667123216132006378630814477" + "106813088898563644909178779463295955587688067277368683836470" + "612208483299572260344016516194247232298740800342116589984844" + "356688576984553507410293250093945014209879983314562948451929" + "862241009275783684229669718641013736581856815277185073259140" + "534024850924787544871716174654424640728091372513505922826813" + "145390369149590652886241000625495880523771672395227312971578" + "042522330551788256261683080675549820375567692574152956993944" + "504349004617185470945673049153218968830613586193253490318451" + "871770642617802890083608004460414305421033261048294750210470" + "303202846332054952531617433058538758154347087854561609738141" + "615145103748777579733574989673510104836750248325511777237502" + "526995647687215364262385606217553691332159421351598905950537" + "513518351520709657614578131639854432532002236696200855408766" + "520105076378983345708235918180749273124590433024519869147132" + "931932462703067876214268579940066030521414045386366551780718" + "510535469417760242493782392451178913322503092692423649855756" + "521279456558275339921490892868856862895022564047205838132429" + "286600764536839036698193759634186899291274131934296059833048" + "690594627623595320676097721540716472990950611858372856271872" + "423573251506230042608074167903809812264198034505185435990821" + "356377966484742250577592243727298923187891299404854048446822" + "719928239317254073429532989089675503790372464487057264894107" + "613242300912487070053676379388189496900004239731820229886894" + "053019610823763957809819187948639826973433528683168917360632" + "750040517847686479093538683816924213175672979768822065627696" + "943474914020483056384006872835738311110986586149510661361915" + "342172527409078742250880056867149831149121019729847242037335" + "904440063130981999650700416787683293610119590221942974317455" + "716336227454789239793488032299063316588917505912406020220045" + "264868457718282165158892171630470709599503997282778168097827" + "497383884195820921583645621293941200045604062174334998171535" + "030513366277293714389988219756129580868518167923841173364269" + "774889246694435264051484911461988227011238661037602452710188" + "911900438270362280391121270021679247152879324195035694278071" + "477495720447513017171148877312193736366348711630105507365864" + "598069586257026976295714123943691621672377694552248018987680" + "338612382795605985191106112971398796002636340393693119651973" + "344711646854574482999700397952536878348512983782198330513744" + "803168936076427075943787200489575435147989033386529956551570" + "669047103070223076797892329848058499725632813524581372640746" + "415923016932853954152472487866287318545051065376430120748079" + "948860283261855738836955246188128622509828635867225708782966" + "017423170535046509131388753895013061151387840089512861842615" + "441729962315731301087767989000918136617870582141517330935619" + "268642915983553727587587676791953536960714236687847602589538" + "927962585440961131240218794236944630211930970546118745080346" + "860636620310193382167597465544174488399379683716417891139157" + "575146359165023126594124268610800205258776019000550873739401" + "445303129974560221438061891795442780328126230093178952504570" + "380957199592993338719686487798275474853570100033092481743129" + "836527369756194343789131822069107283156271772679863538216891" + "518713732520976834628418347371261368933454629405371869789752" + "684339805368137450825001203521193642598238954329102258317328" + "098581116978343883611320940814793654745807336162557057195523" + "274610323601685712314930799144191673243832283659669368716126" + "815118360353441303009936083544193524336572930768154506567477" + "565558211143508568396203781879592033787429012753106951129653" + "074630840496376302289668286168325299592504054003803917262600" + "195834001336180158836765599057537979745423711070158871650976" + "475924365707758401328959478791343481250979029363644046972556" + "422294698558561670817595994409985323205913035009923360820734" + "795546082012200697671744573982535291905800552837118327702125" + "018691644774560916230166739307705017656065679867259837178918" + "123254219579594535869171376148397610005870749992910355727569" + "593729567789260479930835305112462727870603529547312621720559" + "953074675620549217314861961905983960910846471569192459257648" + "138212674016814845327496495507412976753381357634960529826817" + "906824433858135485518651632270319927880227571858035210375443" + "324098235463619647723862420557582355632137583370066602155641" + "218235815280874570372436217877316899649287051943247206509113" + "311767578125e-4966", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x8p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-16496, + -0x0p+0, + -0x0p+0, + -0x0p+0), + TEST ("-3.237587559719012555462219479113823276249784669017340504844" + "942194598519770062059685508835745638324970127939070738424059" + "838293609943191271023342555035986308991521396355375667467208" + "367312819235870119724263252776995195727778126085574034035411" + "017344128491238136414394551514178668780674015531193282296319" + "913113495953953933831631032855605791532328598034154166422617" + "226534880263244723830482289656875701701315902175019974435037" + "627824356684033058939701577883356651733717468531204705842607" + "568803666569711421917525834491783583598401321476176752039857" + "173551930268891446850107760584333855521475305010940756813993" + "214730850216669600967698749412592167692757446422169965426483" + "919224341062751152057061076522973232731542382055087239368522" + "167656194830741819605276971705738272393130698937532095725613" + "383807312946395184980707534803490003540251394324459987958400" + "939111001126190861523615485938285497714410609640798273816511" + "769391568591823198476415765275534341709798367687043373145262" + "933998108452661682659942586304978413812755518166239176614473" + "815940025342279575304159493260770068030636885746695206392378" + "276051948759263882079389379666940357441139816661913198656187" + "703463519723262653223919257185751827493927586153153792077729" + "913353547954808876263400200663495414360816863385220457719546" + "338953323399286762099558324132103460225580066817535680886906" + "060858264089074120360391613368274811868067637495154569071591" + "624185979937989402513750464346904036668477876379544221432800" + "037599944499161940321774835027752710681217554286366043661491" + "013593886229615614494736186475932160549630939390542165126494" + "166960681499481651861215529870984381726203476917507560266886" + "692644952355421814201350137351435237036912624414444992497142" + "303802423605897110605364956579914507108584002230524766331348" + "271456591814078599780820974961968314684496428310691542272663" + "818486132771177670874927831510002443658417608078383611526899" + "905533629456904234997116303929427262032216072887961072267850" + "618234492852606488522739744757845004694461812790342894353802" + "938671928834585447328398711684245164703625580196678024410303" + "542544534512706792134908369873605619756775207191558754413381" + "571756431003248529020572648048946458999967788526617126349345" + "966896362376841092268841417781414969315002419192181972121568" + "811432459128737128140063645558482525300089060238860392371092" + "102688097987915838860882370022268312322882235690785726190915" + "062699382576041643741555139697348927957856990969985342299599" + "797431503615312038393069808777315725367497595040966093808407" + "117316369389112216628231869173217637452855462790553030636920" + "487796465880633399632793882734473382168542596184679158149228" + "725004404714293460752371865436947855237307240001863573081174" + "929166645758276081272685156100195420794154740486637315823136" + "798695124738873328565945598241199335059398955049459449844741" + "098478330319112865980346771381982151154499846478545530650091" + "824164892591396650703633600023191521502618379988693800703884" + "555191647864959327260468892793195316578510173816406054364319" + "294906641284764788384683586662382042642852654156477478700779" + "123584369965723284711409361741235548687181052639639279285373" + "139084165798451899763979500837428077782309910703522399860010" + "310321116623028924118238023770381424894162717815296210097245" + "221769714495449744327945091943394325259297771090128969600269" + "822520904193880119094781214175887316220311309028456568749910" + "010962366586834018403242866721783519806933018588077977626913" + "774236680220258524711348037750591646286531625306510583751929" + "280541119187219596706615736304036444366663256426643903386694" + "536649648686380122198677895751002327229059364018755164517060" + "321515091173358005987498359799467138817648881479418623694683" + "454881683746841149715181334498096967702613110590140231345676" + "956141227850879905018558219984441819798054463206764413100251" + "255775535830770535620946159535406497134759043192647996190512" + "978586496199656070707105117773853504277795024754647024165589" + "129442822627147868917463795166386552921913398878270019905147" + "510849518894114102536073369047160130990411626048426437835295" + "683097278297774735181045158616674564080237813146623269215019" + "613231938626758927531490945029356207933289363847181438902539" + "297057969524961348607844569521442237914899100699610921669921" + "572167164875488132527187949318543809703388178931170799769792" + "886086681284964861608656928109305369539955846964197786677053" + "847603962194721523867993048528558551380823699291873352033111" + "096244814245789620930756114228971363838828108534030152031715" + "929722499546436547773404017947035596936338462103946797525667" + "033935433489292620531649199724400832489751788129365426568881" + "328357966337292439204382537174357675404105580244018783685041" + "224798457022189315692175787257287203633134300759209060570319" + "508886475377719911176071302732819878165468592717406388218727" + "585026352127436844762994722826390779737322113768842482160812" + "973100323673863050234437722898796145596181862320550301285861" + "980052194863780743808106946940079349630782676930197134206259" + "739125377941060751175427888774493677478593805682322173891730" + "311959284895178856039354015035864931073602059531001572891528" + "828982167810245343327388887928886208615327002834690068636094" + "325052251429781641267821367266715283643659749152264457938319" + "185148303604827363623405060374573505789923003843438436174489" + "383805098509083722050766328250349793203837202162624690093533" + "478114438810603140565070517669964629947543608404988178019652" + "088162307525611931821066493746994641048066011859814337589829" + "896549720562117090677291541318153057715167624128318297771376" + "531788973088699647168159229805877415594828532539839967464064" + "556647594705830374653113373530876658380240145380423210673778" + "776803592627231257495817394581607796277282644312510714532297" + "108722017217547317744900647318022108570947064304280100418971" + "450552007356891519523293614416944016354756866350050833501416" + "942505071203810116719053430543531027953437436446745566839242" + "129860410443198862219469972163224971258348314341755015213118" + "628882713134766297624091644805801186976152536913514712919240" + "503721680740586016832099946807466311777189050656676962849581" + "383790904722087478646766320517056183581970236248227413322748" + "304134245717987665377396011236706627320817654565682680006957" + "454759981618023476448544673508068369492066566895437050571584" + "345511070959483898938738225050292533674383091612495407126805" + "381796487365892131916426837522671623266627483065655765705534" + "239355214893395905702329340402794052884259146049064629582075" + "576563307670749189662176976725361937046200576007893814439695" + "301892528761187544161389682003509216791271836545495416676148" + "151145195082668323677621182991451835324281863619641773620601" + "014510950996746726615703771971266687151564427772359427340566" + "909351858654807999781808513034680104078196607462166928018863" + "385629928965649243954503391493597963417955268639606791452833" + "692467872935741940362479842688642227725662504694679557678170" + "929873774151037857807219938356152056997839625453727441947651" + "198316190826615266016347740875615970031428012228328190610356" + "706715662722241878767131224669837573607121539572299329404101" + "274463156060298348931678277361174057097484704587036227686110" + "677413094941011961262438027467952964727129462752693949019764" + "164538344775554466171428121848999818969114034332797672927989" + "107710137279281184295118233855942385256333164153378143279674" + "287318136458207166174996112638689535976047617221520910027427" + "485161965702038805161865494457444594178063766957037428053543" + "239915792369877811053417485684498667123216132006378630814477" + "106813088898563644909178779463295955587688067277368683836470" + "612208483299572260344016516194247232298740800342116589984844" + "356688576984553507410293250093945014209879983314562948451929" + "862241009275783684229669718641013736581856815277185073259140" + "534024850924787544871716174654424640728091372513505922826813" + "145390369149590652886241000625495880523771672395227312971578" + "042522330551788256261683080675549820375567692574152956993944" + "504349004617185470945673049153218968830613586193253490318451" + "871770642617802890083608004460414305421033261048294750210470" + "303202846332054952531617433058538758154347087854561609738141" + "615145103748777579733574989673510104836750248325511777237502" + "526995647687215364262385606217553691332159421351598905950537" + "513518351520709657614578131639854432532002236696200855408766" + "520105076378983345708235918180749273124590433024519869147132" + "931932462703067876214268579940066030521414045386366551780718" + "510535469417760242493782392451178913322503092692423649855756" + "521279456558275339921490892868856862895022564047205838132429" + "286600764536839036698193759634186899291274131934296059833048" + "690594627623595320676097721540716472990950611858372856271872" + "423573251506230042608074167903809812264198034505185435990821" + "356377966484742250577592243727298923187891299404854048446822" + "719928239317254073429532989089675503790372464487057264894107" + "613242300912487070053676379388189496900004239731820229886894" + "053019610823763957809819187948639826973433528683168917360632" + "750040517847686479093538683816924213175672979768822065627696" + "943474914020483056384006872835738311110986586149510661361915" + "342172527409078742250880056867149831149121019729847242037335" + "904440063130981999650700416787683293610119590221942974317455" + "716336227454789239793488032299063316588917505912406020220045" + "264868457718282165158892171630470709599503997282778168097827" + "497383884195820921583645621293941200045604062174334998171535" + "030513366277293714389988219756129580868518167923841173364269" + "774889246694435264051484911461988227011238661037602452710188" + "911900438270362280391121270021679247152879324195035694278071" + "477495720447513017171148877312193736366348711630105507365864" + "598069586257026976295714123943691621672377694552248018987680" + "338612382795605985191106112971398796002636340393693119651973" + "344711646854574482999700397952536878348512983782198330513744" + "803168936076427075943787200489575435147989033386529956551570" + "669047103070223076797892329848058499725632813524581372640746" + "415923016932853954152472487866287318545051065376430120748079" + "948860283261855738836955246188128622509828635867225708782966" + "017423170535046509131388753895013061151387840089512861842615" + "441729962315731301087767989000918136617870582141517330935619" + "268642915983553727587587676791953536960714236687847602589538" + "927962585440961131240218794236944630211930970546118745080346" + "860636620310193382167597465544174488399379683716417891139157" + "575146359165023126594124268610800205258776019000550873739401" + "445303129974560221438061891795442780328126230093178952504570" + "380957199592993338719686487798275474853570100033092481743129" + "836527369756194343789131822069107283156271772679863538216891" + "518713732520976834628418347371261368933454629405371869789752" + "684339805368137450825001203521193642598238954329102258317328" + "098581116978343883611320940814793654745807336162557057195523" + "274610323601685712314930799144191673243832283659669368716126" + "815118360353441303009936083544193524336572930768154506567477" + "565558211143508568396203781879592033787429012753106951129653" + "074630840496376302289668286168325299592504054003803917262600" + "195834001336180158836765599057537979745423711070158871650976" + "475924365707758401328959478791343481250979029363644046972556" + "422294698558561670817595994409985323205913035009923360820734" + "795546082012200697671744573982535291905800552837118327702125" + "018691644774560916230166739307705017656065679867259837178918" + "123254219579594535869171376148397610005870749992910355727569" + "593729567789260479930835305112462727870603529547312621720559" + "953074675620549217314861961905983960910846471569192459257648" + "138212674016814845327496495507412976753381357634960529826817" + "906824433858135485518651632270319927880227571858035210375443" + "324098235463619647723862420557582355632137583370066602155641" + "218235815280874570372436217877316899649287051943247206509113" + "311767578126e-4966", + false, + -0x8p-152, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x8p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-16448, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-1076, + -0x0p+0, + -0x0p+0, + -0x0p+0, + false, + -0x4p-16496, + -0x4p-16496, + -0x0p+0, + -0x0p+0), +}; diff --git a/REORG.TODO/stdlib/tst-strtod-round-skeleton.c b/REORG.TODO/stdlib/tst-strtod-round-skeleton.c new file mode 100644 index 0000000000..73603e6158 --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod-round-skeleton.c @@ -0,0 +1,252 @@ +/* Test for correct rounding of results of strtod and related + functions. + Copyright (C) 2012-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* Defining _LIBC_TEST ensures long double math functions are + declared in the headers. */ +#define _LIBC_TEST 1 +#include <fenv.h> +#include <float.h> +#include <math.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math-tests.h> + +#include "tst-strtod.h" + +/* Non-standard macros expected to be externally defined: + + L_(str): Pastes the appropriate modifier to a string literal str. + + FNPFX: Expands to the correct prefix for the strtod equivalent + of type CHAR. (e.g str or wcs). + + CHAR: Expands to the string type being tested (e.g wchar_t or char). + + STRM: Expands to a string literal suitable for printing CHAR* via + printf (e.g "%s" or "%ls"). */ + +#define _CONCAT(a, b) a ## b +#define CONCAT(a, b) _CONCAT (a, b) + +#define STRTO(x) CONCAT (CONCAT (FNPFX, to), x) + +#if LDBL_MANT_DIG == 106 && LDBL_MAX_EXP == 1024 +/* This is a stupid hack for IBM long double. This test ignores + inexact values for long double due to the limitations of the + format. This ensures rounding tests are ignored. */ +# undef ROUNDING_TESTS_long_double +# define ROUNDING_TESTS_long_double(x) 0 +#endif + +/* Generator to create an FTYPE member variabled named FSUF + used to populate struct member variables. */ +#define FTYPE_MEMBER(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ + FTYPE FSUF; + +/* Likewise, but each member is of type bool. */ +#define BOOL_MEMBER(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ + bool FSUF; + +#define STRUCT_FOREACH_FLOAT_FTYPE GEN_TEST_STRTOD_FOREACH (FTYPE_MEMBER) +#define STRUCT_FOREACH_FLOAT_BOOL GEN_TEST_STRTOD_FOREACH (BOOL_MEMBER) + +/* Define the long double choose (CHOOSE_ld) macro + to select the appropriate generated long double + value from the generated test data. */ +#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024 +/* This is for the long double == double format. */ +# define CHOOSE_ld(f,d,...) d +#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && LDBL_MIN_EXP == -16381 +/* This is for the Intel extended float format. */ +# define CHOOSE_ld(f,d,ld64i,...) ld64i +#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 && LDBL_MIN_EXP == -16382 +/* This is for the Motorola extended float format. */ +# define CHOOSE_ld(f,d,ld64i,ld64m,...) ld64m +#elif LDBL_MANT_DIG == 106 && LDBL_MAX_EXP == 1024 +/* This is for the IBM extended double format. */ +# define CHOOSE_ld(f,d,ld64i,ld64m,ld106,...) ld106 +#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384 +/* This is for the IEEE binary128 format. */ +# define CHOOSE_ld(f,d,ld64i,ld64m,ld106,ld113,...) ld113 +#else +# error "unknown long double format" +#endif + +/* Add type specific choosing macros below. */ +#define CHOOSE_f(f,...) f +#define CHOOSE_d(f,d,...) d +/* long double is special, and handled above. */ + +/* Selector for expected result field of a given type. */ +#define _ENTRY(FSUF, FTYPE, FTOSTR, LSUF, CSUF, ...) \ + CONCAT (CHOOSE_ ## FSUF (__VA_ARGS__), LSUF), +#define ENTRY(...) \ + GEN_TEST_STRTOD_FOREACH (_ENTRY, __VA_ARGS__) + +/* Selector for boolean exact tag of expected results. */ +#define _XNTRY(FSUF, FTYPE, FTOSTR, LSUF, CSUF, ...) \ + CHOOSE_ ## FSUF (__VA_ARGS__), +#define XNTRY(...) \ + GEN_TEST_STRTOD_FOREACH (_XNTRY, __VA_ARGS__) + +/* This is hacky way around the seemingly unavoidable macro + expansion of the INFINITY or HUGE_VAL like macros in the + above. It is assumed the compiler will implicitly convert + the infinity correctly. */ +#define INF INFINITY + 0.0 + +/* This macro is used in conjunction with the output from the + gen-tst-strtod-round utility to select the appropriately + rounded long double value for a given format. */ +#define TEST(s, \ + fx, fd, fn, fz, fu, \ + dx, dd, dn, dz, du, \ + ld64ix, ld64id, ld64in, ld64iz, ld64iu, \ + ld64mx, ld64md, ld64mn, ld64mz, ld64mu, \ + ld106x, ld106d, ld106n, ld106z, ld106u, \ + ld113x, ld113d, ld113n, ld113z, ld113u) \ + { \ + L_ (s), \ + { XNTRY (fx, dx, ld64ix, ld64mx, ld106x, ld113x) }, \ + { \ + { ENTRY (fn, dn, ld64in, ld64mn, ld106n, ld113n) }, \ + { ENTRY (fd, dd, ld64id, ld64md, ld106d, ld113d) }, \ + { ENTRY (fz, dz, ld64iz, ld64mz, ld106z, ld113z) }, \ + { ENTRY (fu, du, ld64iu, ld64mu, ld106u, ld113u) } \ + } \ + } + +struct test_exactness + { + STRUCT_FOREACH_FLOAT_BOOL + }; + +struct test_results + { + STRUCT_FOREACH_FLOAT_FTYPE + }; + +struct test { + const CHAR *s; + struct test_exactness exact; + struct test_results r[4]; +}; + +/* Include the generated test data. */ +#include "tst-strtod-round-data.h" + +#define STRX(x) #x +#define STR(x) STRX (x) +#define FNPFXS STR (FNPFX) + +#ifndef FE_INEXACT +# define FE_INEXACT 0 +#endif + +#define GEN_ONE_TEST(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ +{ \ + feclearexcept (FE_INEXACT); \ + FTYPE f = STRTO (FSUF) (s, NULL); \ + if (f != expected->FSUF \ + || (copysign ## CSUF) (1.0 ## LSUF, f) \ + != (copysign ## CSUF) (1.0 ## LSUF, expected->FSUF)) \ + { \ + char efstr[FSTRLENMAX]; \ + char fstr[FSTRLENMAX]; \ + FTOSTR (efstr, FSTRLENMAX, "%a", expected->FSUF); \ + FTOSTR (fstr, FSTRLENMAX, "%a", f); \ + printf (FNPFXS "to" #FSUF " (" STRM ") returned %s not " \ + "%s (%s)\n", s, fstr, efstr, mode_name); \ + if (ROUNDING_TESTS (FTYPE, rnd_mode) || exact->FSUF) \ + result = 1; \ + else \ + printf ("ignoring this inexact result\n"); \ + } \ + else if (FE_INEXACT != 0) \ + { \ + bool inexact_raised = fetestexcept (FE_INEXACT) != 0; \ + if (inexact_raised != !exact->FSUF) \ + { \ + printf (FNPFXS "to" #FSUF " (" STRM ") inexact %d " \ + "not %d\n", s, inexact_raised, !exact->FSUF); \ + if (EXCEPTION_TESTS (FTYPE)) \ + result = 1; \ + else \ + printf ("ignoring this exception error\n"); \ + } \ + } \ +} + +static int +test_in_one_mode (const CHAR *s, const struct test_results *expected, + const struct test_exactness *exact, const char *mode_name, + int rnd_mode) +{ + int result = 0; + GEN_TEST_STRTOD_FOREACH (GEN_ONE_TEST) + return result; +} + +static const struct fetestmodes + { + const char *mode_name; + int rnd_mode; + int rnd_i; /* Corresponding index into r array of struct test. */ + } modes[] = { + { "default rounding mode", FE_TONEAREST, 0 }, +#ifdef FE_DOWNWARD + { "FE_DOWNWARD", FE_DOWNWARD, 1 }, +#endif +#ifdef FE_TOWARDZERO + { "FE_TOWARDZERO", FE_TOWARDZERO, 2 }, +#endif +#ifdef FE_UPWARD + { "FE_UPWARD", FE_UPWARD, 3 }, +#endif + {} +}; + +static int +do_test (void) +{ + int save_round_mode __attribute__ ((unused)) = fegetround (); + int result = 0; + for (size_t i = 0; i < sizeof (tests) / sizeof (tests[0]); i++) + { + result |= test_in_one_mode (tests[i].s, &tests[i].r[modes[0].rnd_i], + &tests[i].exact, modes[0].mode_name, + modes[0].rnd_mode); + for (const struct fetestmodes *m = &modes[1]; m->mode_name != NULL; m++) + { + if (!fesetround (m->rnd_mode)) + { + result |= test_in_one_mode (tests[i].s, &tests[i].r[m->rnd_i], + &tests[i].exact, m->mode_name, + m->rnd_mode); + fesetround (save_round_mode); + } + } + } + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-strtod-round.c b/REORG.TODO/stdlib/tst-strtod-round.c new file mode 100644 index 0000000000..2990d544d4 --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod-round.c @@ -0,0 +1,24 @@ +/* char shim for tst-strtod-round-skeleton.c. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define L_(str) str +#define FNPFX str +#define CHAR char +#define STRM "%s" + +#include <tst-strtod-round-skeleton.c> diff --git a/REORG.TODO/stdlib/tst-strtod-underflow.c b/REORG.TODO/stdlib/tst-strtod-underflow.c new file mode 100644 index 0000000000..f623a6be90 --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod-underflow.c @@ -0,0 +1,225 @@ +/* Test for strtod handling of arguments that may cause floating-point + underflow. + Copyright (C) 2012-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <fenv.h> +#include <float.h> +#include <stdbool.h> +#include <stdio.h> +#include <stdlib.h> +#include <tininess.h> + +enum underflow_case + { + /* Result is exact or outside the subnormal range. */ + UNDERFLOW_NONE, + /* Result has magnitude at most half way between the largest + subnormal value and the smallest positive normal value, and is + not exact, so underflows in all rounding modes and independent + of how tininess is detected. */ + UNDERFLOW_ALWAYS, + /* Result is positive, with magnitude larger than half way between + the largest subnormal value and the least positive normal + value, but would underflow when rounded to nearest to normal + precision, so underflows after rounding in all modes except + rounding upward. */ + UNDERFLOW_EXCEPT_UPWARD, + /* Likewise, for a negative result, underflowing after rounding + except when rounding downward. */ + UNDERFLOW_EXCEPT_DOWNWARD, + /* Result is positive, with magnitude at least three quarters of + the way from the largest subnormal value to the smallest + positive normal value, so underflows after rounding only when + rounding downward or toward zero. */ + UNDERFLOW_ONLY_DOWNWARD_ZERO, + /* Likewise, for a negative result, underflowing after rounding + only when rounding upward or toward zero. */ + UNDERFLOW_ONLY_UPWARD_ZERO, + }; + +struct test +{ + const char *s; + enum underflow_case c; +}; + +static const struct test tests[] = + { + { "0x1p-1022", UNDERFLOW_NONE }, + { "-0x1p-1022", UNDERFLOW_NONE }, + { "0x0p-10000000000000000000000000", UNDERFLOW_NONE }, + { "-0x0p-10000000000000000000000000", UNDERFLOW_NONE }, + { "0x1p-10000000000000000000000000", UNDERFLOW_ALWAYS }, + { "-0x1p-10000000000000000000000000", UNDERFLOW_ALWAYS }, + { "0x1.000000000000000000001p-1022", UNDERFLOW_NONE }, + { "-0x1.000000000000000000001p-1022", UNDERFLOW_NONE }, + { "0x1p-1075", UNDERFLOW_ALWAYS }, + { "-0x1p-1075", UNDERFLOW_ALWAYS }, + { "0x1p-1023", UNDERFLOW_NONE }, + { "-0x1p-1023", UNDERFLOW_NONE }, + { "0x1p-1074", UNDERFLOW_NONE }, + { "-0x1p-1074", UNDERFLOW_NONE }, + { "0x1.ffffffffffffep-1023", UNDERFLOW_NONE }, + { "-0x1.ffffffffffffep-1023", UNDERFLOW_NONE }, + { "0x1.fffffffffffffp-1023", UNDERFLOW_ALWAYS }, + { "-0x1.fffffffffffffp-1023", UNDERFLOW_ALWAYS }, + { "0x1.fffffffffffff0001p-1023", UNDERFLOW_EXCEPT_UPWARD }, + { "-0x1.fffffffffffff0001p-1023", UNDERFLOW_EXCEPT_DOWNWARD }, + { "0x1.fffffffffffff7fffp-1023", UNDERFLOW_EXCEPT_UPWARD }, + { "-0x1.fffffffffffff7fffp-1023", UNDERFLOW_EXCEPT_DOWNWARD }, + { "0x1.fffffffffffff8p-1023", UNDERFLOW_ONLY_DOWNWARD_ZERO }, + { "-0x1.fffffffffffff8p-1023", UNDERFLOW_ONLY_UPWARD_ZERO }, + { "0x1.fffffffffffffffffp-1023", UNDERFLOW_ONLY_DOWNWARD_ZERO }, + { "-0x1.fffffffffffffffffp-1023", UNDERFLOW_ONLY_UPWARD_ZERO }, + }; + +/* Return whether to expect underflow from a particular testcase, in a + given rounding mode. */ + +static bool +expect_underflow (enum underflow_case c, int rm) +{ + if (c == UNDERFLOW_NONE) + return false; + if (c == UNDERFLOW_ALWAYS) + return true; + if (TININESS_AFTER_ROUNDING) + { + switch (rm) + { +#ifdef FE_DOWNWARD + case FE_DOWNWARD: + return (c == UNDERFLOW_EXCEPT_UPWARD + || c == UNDERFLOW_ONLY_DOWNWARD_ZERO); +#endif + +#ifdef FE_TOWARDZERO + case FE_TOWARDZERO: + return true; +#endif + +#ifdef FE_UPWARD + case FE_UPWARD: + return (c == UNDERFLOW_EXCEPT_DOWNWARD + || c == UNDERFLOW_ONLY_UPWARD_ZERO); +#endif + + default: + return (c == UNDERFLOW_EXCEPT_UPWARD + || c == UNDERFLOW_EXCEPT_DOWNWARD); + } + } + else + return true; +} + +static bool support_underflow_exception = false; +volatile double d = DBL_MIN; +volatile double dd; + +static int +test_in_one_mode (const char *s, enum underflow_case c, int rm, + const char *mode_name) +{ + int result = 0; + feclearexcept (FE_ALL_EXCEPT); + errno = 0; + double d = strtod (s, NULL); + int got_errno = errno; +#ifdef FE_UNDERFLOW + bool got_fe_underflow = fetestexcept (FE_UNDERFLOW) != 0; +#else + bool got_fe_underflow = false; +#endif + printf ("strtod (%s) (%s) returned %a, errno = %d, %sunderflow exception\n", + s, mode_name, d, got_errno, got_fe_underflow ? "" : "no "); + bool this_expect_underflow = expect_underflow (c, rm); + if (got_errno != 0 && got_errno != ERANGE) + { + puts ("FAIL: errno neither 0 nor ERANGE"); + result = 1; + } + else if (this_expect_underflow != (errno == ERANGE)) + { + puts ("FAIL: underflow from errno differs from expectations"); + result = 1; + } + if (support_underflow_exception && got_fe_underflow != this_expect_underflow) + { + puts ("FAIL: underflow from exceptions differs from expectations"); + result = 1; + } + return result; +} + +static int +do_test (void) +{ + int save_round_mode __attribute__ ((unused)) = fegetround (); + int result = 0; +#ifdef FE_TONEAREST + const int fe_tonearest = FE_TONEAREST; +#else + const int fe_tonearest = 0; +# if defined FE_DOWNWARD || defined FE_TOWARDZERO || defined FE_UPWARD +# error "FE_TONEAREST not defined, but another rounding mode is" +# endif +#endif +#ifdef FE_UNDERFLOW + feclearexcept (FE_ALL_EXCEPT); + dd = d * d; + if (fetestexcept (FE_UNDERFLOW)) + support_underflow_exception = true; + else + puts ("underflow exception not supported at runtime, only testing errno"); +#endif + for (size_t i = 0; i < sizeof (tests) / sizeof (tests[0]); i++) + { + result |= test_in_one_mode (tests[i].s, tests[i].c, fe_tonearest, + "default rounding mode"); +#ifdef FE_DOWNWARD + if (!fesetround (FE_DOWNWARD)) + { + result |= test_in_one_mode (tests[i].s, tests[i].c, FE_DOWNWARD, + "FE_DOWNWARD"); + fesetround (save_round_mode); + } +#endif +#ifdef FE_TOWARDZERO + if (!fesetround (FE_TOWARDZERO)) + { + result |= test_in_one_mode (tests[i].s, tests[i].c, FE_TOWARDZERO, + "FE_TOWARDZERO"); + fesetround (save_round_mode); + } +#endif +#ifdef FE_UPWARD + if (!fesetround (FE_UPWARD)) + { + result |= test_in_one_mode (tests[i].s, tests[i].c, FE_UPWARD, + "FE_UPWARD"); + fesetround (save_round_mode); + } +#endif + } + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-strtod.c b/REORG.TODO/stdlib/tst-strtod.c new file mode 100644 index 0000000000..1ab7f8a5aa --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod.c @@ -0,0 +1,218 @@ +/* Basic tests for strtod. + Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <ctype.h> +#include <locale.h> +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <string.h> +#include <math.h> + +struct ltest + { + const char *str; /* Convert this. */ + double expect; /* To get this. */ + char left; /* With this left over. */ + int err; /* And this in errno. */ + }; +static const struct ltest tests[] = + { + { "12.345", 12.345, '\0', 0 }, + { "12.345e19", 12.345e19, '\0', 0 }, + { "-.1e+9", -.1e+9, '\0', 0 }, + { ".125", .125, '\0', 0 }, + { "1e20", 1e20, '\0', 0 }, + { "0e-19", 0, '\0', 0 }, + { "4\00012", 4.0, '\0', 0 }, + { "5.9e-76", 5.9e-76, '\0', 0 }, + { "0x1.4p+3", 10.0, '\0', 0 }, + { "0xAp0", 10.0, '\0', 0 }, + { "0x0Ap0", 10.0, '\0', 0 }, + { "0x0A", 10.0, '\0', 0 }, + { "0xA0", 160.0, '\0', 0 }, + { "0x0.A0p8", 160.0, '\0', 0 }, + { "0x0.50p9", 160.0, '\0', 0 }, + { "0x0.28p10", 160.0, '\0', 0 }, + { "0x0.14p11", 160.0, '\0', 0 }, + { "0x0.0A0p12", 160.0, '\0', 0 }, + { "0x0.050p13", 160.0, '\0', 0 }, + { "0x0.028p14", 160.0, '\0', 0 }, + { "0x0.014p15", 160.0, '\0', 0 }, + { "0x00.00A0p16", 160.0, '\0', 0 }, + { "0x00.0050p17", 160.0, '\0', 0 }, + { "0x00.0028p18", 160.0, '\0', 0 }, + { "0x00.0014p19", 160.0, '\0', 0 }, + { "0x1p-1023", + 1.11253692925360069154511635866620203210960799023116591527666e-308, + '\0', 0 }, + { "0x0.8p-1022", + 1.11253692925360069154511635866620203210960799023116591527666e-308, + '\0', 0 }, + { "Inf", HUGE_VAL, '\0', 0 }, + { "-Inf", -HUGE_VAL, '\0', 0 }, + { "+InFiNiTy", HUGE_VAL, '\0', 0 }, + { "0x80000Ap-23", 0x80000Ap-23, '\0', 0 }, + { "1e-324", 0, '\0', ERANGE }, + { "0x100000000000008p0", 0x1p56, '\0', 0 }, + { "0x100000000000008.p0", 0x1p56, '\0', 0 }, + { "0x100000000000008.00p0", 0x1p56, '\0', 0 }, + { "0x10000000000000800p0", 0x1p64, '\0', 0 }, + { "0x10000000000000801p0", 0x1.0000000000001p64, '\0', 0 }, + { NULL, 0, '\0', 0 } + }; + +static void expand (char *dst, int c); +static int long_dbl (void); + +static int +do_test (void) +{ + char buf[100]; + const struct ltest *lt; + char *ep; + int status = 0; + int save_errno; + + for (lt = tests; lt->str != NULL; ++lt) + { + double d; + + errno = 0; + d = strtod(lt->str, &ep); + save_errno = errno; + printf ("strtod (\"%s\") test %u", + lt->str, (unsigned int) (lt - tests)); + if (d == lt->expect && *ep == lt->left && save_errno == lt->err) + puts ("\tOK"); + else + { + puts ("\tBAD"); + if (d != lt->expect) + printf (" returns %.60g, expected %.60g\n", d, lt->expect); + if (lt->left != *ep) + { + char exp1[5], exp2[5]; + expand (exp1, *ep); + expand (exp2, lt->left); + printf (" leaves '%s', expected '%s'\n", exp1, exp2); + } + if (save_errno != lt->err) + printf (" errno %d (%s) instead of %d (%s)\n", + save_errno, strerror (save_errno), + lt->err, strerror (lt->err)); + status = 1; + } + } + + sprintf (buf, "%f", strtod ("-0.0", NULL)); + if (strcmp (buf, "-0.000000") != 0) + { + printf (" strtod (\"-0.0\", NULL) returns \"%s\"\n", buf); + status = 1; + } + + const char input[] = "3752432815e-39"; + + float f1 = strtold (input, NULL); + float f2; + float f3 = strtof (input, NULL); + sscanf (input, "%g", &f2); + + if (f1 != f2) + { + printf ("f1 = %a != f2 = %a\n", f1, f2); + status = 1; + } + if (f1 != f3) + { + printf ("f1 = %a != f3 = %a\n", f1, f3); + status = 1; + } + if (f2 != f3) + { + printf ("f2 = %a != f3 = %a\n", f2, f3); + status = 1; + } + + const char input2[] = "+1.000000000116415321826934814453125"; + if (strtold (input2, NULL) != +1.000000000116415321826934814453125L) + { + printf ("input2: %La != %La\n", strtold (input2, NULL), + +1.000000000116415321826934814453125L); + status = 1; + } + + static struct { const char *str; long double l; } ltests[] = + { + { "42.0000000000000000001", 42.0000000000000000001L }, + { "42.00000000000000000001", 42.00000000000000000001L }, + { "42.000000000000000000001", 42.000000000000000000001L } + }; + int n; + for (n = 0; n < sizeof (ltests) / sizeof (ltests[0]); ++n) + if (strtold (ltests[n].str, NULL) != ltests[n].l) + { + printf ("ltests[%d]: %La != %La\n", n, + strtold (ltests[n].str, NULL), ltests[n].l); + status = 1; + } + + status |= long_dbl (); + + return status ? EXIT_FAILURE : EXIT_SUCCESS; +} + +static void +expand (char *dst, int c) +{ + if (isprint (c)) + { + dst[0] = c; + dst[1] = '\0'; + } + else + (void) sprintf (dst, "%#.3o", (unsigned int) c); +} + +static int +long_dbl (void) +{ + /* Regenerate this string using + + echo '(2^53-1)*2^(1024-53)' | bc | sed 's/\([^\]*\)\\*$/ "\1"/' + + */ + static const char longestdbl[] = + "17976931348623157081452742373170435679807056752584499659891747680315" + "72607800285387605895586327668781715404589535143824642343213268894641" + "82768467546703537516986049910576551282076245490090389328944075868508" + "45513394230458323690322294816580855933212334827479782620414472316873" + "8177180919299881250404026184124858368"; + double d = strtod (longestdbl, NULL); + + printf ("strtod (\"%s\", NULL) = %g\n", longestdbl, d); + + if (d != 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000) + return 1; + + return 0; +} + +#include <support/test-driver.c> diff --git a/REORG.TODO/stdlib/tst-strtod.h b/REORG.TODO/stdlib/tst-strtod.h new file mode 100644 index 0000000000..bf5f90138f --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod.h @@ -0,0 +1,49 @@ +/* Common utilities for testing strtod and its derivatives. + This file is part of the GNU C Library. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#ifndef _TST_STRTOD_H +#define _TST_STRTOD_H + +#define FSTRLENMAX 128 + +/* Splat n variants of the same test for the various strtod functions. */ +#define GEN_TEST_STRTOD_FOREACH(mfunc, ...) \ + mfunc ( f, float, strfromf, f, f, ##__VA_ARGS__) \ + mfunc ( d, double, strfromd, , , ##__VA_ARGS__) \ + mfunc ( ld, long double, strfroml, L, l, ##__VA_ARGS__) +/* The arguments to the generated macros are: + FSUF - Function suffix + FTYPE - float type + FTOSTR - float to string func + LSUF - Literal suffix + CSUF - C standardish suffix for many of the math functions +*/ + + + +#define STRTOD_TEST_FOREACH(mfunc, ...) \ +({ \ + int result = 0; \ + result |= mfunc ## f (__VA_ARGS__); \ + result |= mfunc ## d (__VA_ARGS__); \ + result |= mfunc ## ld (__VA_ARGS__); \ + result; \ +}) + + +#endif diff --git a/REORG.TODO/stdlib/tst-strtod1i.c b/REORG.TODO/stdlib/tst-strtod1i.c new file mode 100644 index 0000000000..6f79425667 --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod1i.c @@ -0,0 +1,84 @@ +/* Basic tests for __strtod_internal. + Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <ctype.h> +#include <locale.h> +#include <stddef.h> +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <string.h> +#include <math.h> + +/* Perform a few tests in a locale with thousands separators. */ +static int +do_test (void) +{ + static const struct + { + const char *loc; + const char *str; + double exp; + ptrdiff_t nread; + } tests[] = + { + { "de_DE.UTF-8", "1,5", 1.5, 3 }, + { "de_DE.UTF-8", "1.5", 1.0, 1 }, + { "de_DE.UTF-8", "1.500", 1500.0, 5 }, + { "de_DE.UTF-8", "36.893.488.147.419.103.232", 0x1.0p65, 26 } + }; +#define ntests (sizeof (tests) / sizeof (tests[0])) + size_t n; + int result = 0; + + puts ("\nLocale tests"); + + for (n = 0; n < ntests; ++n) + { + double d; + char *endp; + + if (setlocale (LC_ALL, tests[n].loc) == NULL) + { + printf ("cannot set locale %s\n", tests[n].loc); + result = 1; + continue; + } + + d = __strtod_internal (tests[n].str, &endp, 1); + if (d != tests[n].exp) + { + printf ("strtod(\"%s\") returns %g and not %g\n", + tests[n].str, d, tests[n].exp); + result = 1; + } + else if (endp - tests[n].str != tests[n].nread) + { + printf ("strtod(\"%s\") read %td bytes and not %td\n", + tests[n].str, endp - tests[n].str, tests[n].nread); + result = 1; + } + } + + if (result == 0) + puts ("all OK"); + + return result ? EXIT_FAILURE : EXIT_SUCCESS; +} + +#include <support/test-driver.c> diff --git a/REORG.TODO/stdlib/tst-strtod2.c b/REORG.TODO/stdlib/tst-strtod2.c new file mode 100644 index 0000000000..a7df82ebbd --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod2.c @@ -0,0 +1,44 @@ +#include <stdio.h> +#include <stdlib.h> + +struct test +{ + const char *str; + double result; + size_t offset; +} tests[] = +{ + { "0xy", 0.0, 1 }, + { "0x.y", 0.0, 1 }, + { "0x0.y", 0.0, 4 }, + { "0x.0y", 0.0, 4 }, + { ".y", 0.0, 0 }, + { "0.y", 0.0, 2 }, + { ".0y", 0.0, 2 } +}; + +static int +do_test (void) +{ + int status = 0; + for (size_t i = 0; i < sizeof (tests) / sizeof (tests[0]); ++i) + { + char *ep; + double r = strtod (tests[i].str, &ep); + if (r != tests[i].result) + { + printf ("test %zu r = %g, expect %g\n", i, r, tests[i].result); + status = 1; + } + if (ep != tests[i].str + tests[i].offset) + { + printf ("test %zu strtod parsed %tu characters, expected %zu\n", + i, ep - tests[i].str, tests[i].offset); + status = 1; + } + } + return status; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-strtod3.c b/REORG.TODO/stdlib/tst-strtod3.c new file mode 100644 index 0000000000..23abec1896 --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod3.c @@ -0,0 +1,55 @@ +#include <locale.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +static const struct +{ + const char *in; + const char *out; + double expected; +} tests[] = + { + { "000,,,e1", ",,,e1", 0.0 }, + { "000e1", "", 0.0 }, + { "000,1e1", ",1e1", 0.0 } + }; +#define NTESTS (sizeof (tests) / sizeof (tests[0])) + + +static int +do_test (void) +{ + if (setlocale (LC_ALL, "en_US.ISO-8859-1") == NULL) + { + puts ("could not set locale"); + return 1; + } + + int status = 0; + + for (int i = 0; i < NTESTS; ++i) + { + char *ep; + double r = __strtod_internal (tests[i].in, &ep, 1); + + if (strcmp (ep, tests[i].out) != 0) + { + printf ("%d: got rest string \"%s\", expected \"%s\"\n", + i, ep, tests[i].out); + status = 1; + } + + if (r != tests[i].expected) + { + printf ("%d: got wrong results %g, expected %g\n", + i, r, tests[i].expected); + status = 1; + } + } + + return status; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-strtod4.c b/REORG.TODO/stdlib/tst-strtod4.c new file mode 100644 index 0000000000..2d9d54c944 --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod4.c @@ -0,0 +1,56 @@ +#include <locale.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#define NBSP "\xc2\xa0" + +static const struct +{ + const char *in; + const char *out; + double expected; +} tests[] = + { + { "000"NBSP"000"NBSP"000", "", 0.0 }, + { "1"NBSP"000"NBSP"000,5x", "x", 1000000.5 } + }; +#define NTESTS (sizeof (tests) / sizeof (tests[0])) + + +static int +do_test (void) +{ + if (setlocale (LC_ALL, "cs_CZ.UTF-8") == NULL) + { + puts ("could not set locale"); + return 1; + } + + int status = 0; + + for (int i = 0; i < NTESTS; ++i) + { + char *ep; + double r = __strtod_internal (tests[i].in, &ep, 1); + + if (strcmp (ep, tests[i].out) != 0) + { + printf ("%d: got rest string \"%s\", expected \"%s\"\n", + i, ep, tests[i].out); + status = 1; + } + + if (r != tests[i].expected) + { + printf ("%d: got wrong results %g, expected %g\n", + i, r, tests[i].expected); + status = 1; + } + } + + return status; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-strtod5.c b/REORG.TODO/stdlib/tst-strtod5.c new file mode 100644 index 0000000000..8976e39a58 --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod5.c @@ -0,0 +1,89 @@ +/* Tests of strtod in a locale using decimal comma. + Copyright (C) 2007-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <locale.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> + +#define NBSP "\xc2\xa0" + +static const struct +{ + const char *in; + double expected; +} tests[] = + { + { "0", 0.0 }, + { "000", 0.0 }, + { "-0", -0.0 }, + { "-000", -0.0 }, + { "0,", 0.0 }, + { "-0,", -0.0 }, + { "0,0", 0.0 }, + { "-0,0", -0.0 }, + { "0e-10", 0.0 }, + { "-0e-10", -0.0 }, + { "0,e-10", 0.0 }, + { "-0,e-10", -0.0 }, + { "0,0e-10", 0.0 }, + { "-0,0e-10", -0.0 }, + { "0e-1000000", 0.0 }, + { "-0e-1000000", -0.0 }, + { "0,0e-1000000", 0.0 }, + { "-0,0e-1000000", -0.0 }, + }; +#define NTESTS (sizeof (tests) / sizeof (tests[0])) + + +static int +do_test (void) +{ + if (setlocale (LC_ALL, "cs_CZ.UTF-8") == NULL) + { + puts ("could not set locale"); + return 1; + } + + int status = 0; + + for (int i = 0; i < NTESTS; ++i) + { + char *ep; + double r = strtod (tests[i].in, &ep); + + if (*ep != '\0') + { + printf ("%d: got rest string \"%s\", expected \"\"\n", i, ep); + status = 1; + } + + if (r != tests[i].expected + || copysign (10.0, r) != copysign (10.0, tests[i].expected)) + { + printf ("%d: got wrong results %g, expected %g\n", + i, r, tests[i].expected); + status = 1; + } + } + + return status; +} + +#include <support/test-driver.c> diff --git a/REORG.TODO/stdlib/tst-strtod5i.c b/REORG.TODO/stdlib/tst-strtod5i.c new file mode 100644 index 0000000000..7e319585bb --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod5i.c @@ -0,0 +1,100 @@ +/* Tests of __strtod_internal in a locale using decimal comma. + Copyright (C) 2007-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <locale.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> + +#define NBSP "\xc2\xa0" + +static const struct +{ + const char *in; + int group; + double expected; +} tests[] = + { + { "0", 0, 0.0 }, + { "000", 0, 0.0 }, + { "-0", 0, -0.0 }, + { "-000", 0, -0.0 }, + { "0,", 0, 0.0 }, + { "-0,", 0, -0.0 }, + { "0,0", 0, 0.0 }, + { "-0,0", 0, -0.0 }, + { "0e-10", 0, 0.0 }, + { "-0e-10", 0, -0.0 }, + { "0,e-10", 0, 0.0 }, + { "-0,e-10", 0, -0.0 }, + { "0,0e-10", 0, 0.0 }, + { "-0,0e-10", 0, -0.0 }, + { "0e-1000000", 0, 0.0 }, + { "-0e-1000000", 0, -0.0 }, + { "0,0e-1000000", 0, 0.0 }, + { "-0,0e-1000000", 0, -0.0 }, + { "0", 1, 0.0 }, + { "000", 1, 0.0 }, + { "-0", 1, -0.0 }, + { "-000", 1, -0.0 }, + { "0e-10", 1, 0.0 }, + { "-0e-10", 1, -0.0 }, + { "0e-1000000", 1, 0.0 }, + { "-0e-1000000", 1, -0.0 }, + { "000"NBSP"000"NBSP"000", 1, 0.0 }, + { "-000"NBSP"000"NBSP"000", 1, -0.0 } + }; +#define NTESTS (sizeof (tests) / sizeof (tests[0])) + + +static int +do_test (void) +{ + if (setlocale (LC_ALL, "cs_CZ.UTF-8") == NULL) + { + puts ("could not set locale"); + return 1; + } + + int status = 0; + + for (int i = 0; i < NTESTS; ++i) + { + char *ep; + double r = __strtod_internal (tests[i].in, &ep, tests[i].group); + + if (*ep != '\0') + { + printf ("%d: got rest string \"%s\", expected \"\"\n", i, ep); + status = 1; + } + + if (r != tests[i].expected + || copysign (10.0, r) != copysign (10.0, tests[i].expected)) + { + printf ("%d: got wrong results %g, expected %g\n", + i, r, tests[i].expected); + status = 1; + } + } + + return status; +} + +#include <support/test-driver.c> diff --git a/REORG.TODO/stdlib/tst-strtod6.c b/REORG.TODO/stdlib/tst-strtod6.c new file mode 100644 index 0000000000..9bfbdc2b38 --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtod6.c @@ -0,0 +1,57 @@ +#include <math.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "tst-strtod.h" + +#define TEST_STRTOD(FSUF, FTYPE, FTOSTR, LSUF, CSUF) \ +static int \ +test_strto ## FSUF (const char str[]) \ +{ \ + char *endp; \ + int result = 0; \ + puts (str); \ + FTYPE d = strto ## FSUF (str, &endp); \ + if (!isnan (d)) \ + { \ + puts ("strto" #FSUF " did not return NAN"); \ + result = 1; \ + } \ + if (issignaling (d)) \ + { \ + puts ("strto" #FSUF " returned a sNAN"); \ + result = 1; \ + } \ + if (strcmp (endp, "something") != 0) \ + { \ + puts ("strto" #FSUF " set incorrect end pointer"); \ + result = 1; \ + } \ + return result; \ +} + +GEN_TEST_STRTOD_FOREACH (TEST_STRTOD); + +static int +do_test (void) +{ + int result = 0; + + result |= STRTOD_TEST_FOREACH (test_strto, "NaN(blabla)something"); + result |= STRTOD_TEST_FOREACH (test_strto, "NaN(1234)something"); + /* UINT32_MAX. */ + result |= STRTOD_TEST_FOREACH (test_strto, "NaN(4294967295)something"); + /* UINT64_MAX. */ + result |= STRTOD_TEST_FOREACH (test_strto, + "NaN(18446744073709551615)something"); + /* The case of zero is special in that "something" has to be done to make the + mantissa different from zero, which would mean infinity instead of + NaN. */ + result |= STRTOD_TEST_FOREACH (test_strto, "NaN(0)something"); + + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-strtol-locale-main.c b/REORG.TODO/stdlib/tst-strtol-locale-main.c new file mode 100644 index 0000000000..5de61e7b16 --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtol-locale-main.c @@ -0,0 +1,87 @@ +/* Test strtol functions work with all ASCII letters in Turkish + locales (bug 19242). + Copyright (C) 2015-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <locale.h> +#include <stdio.h> +#include <stdlib.h> +#include <wchar.h> + +#define STR_(X) #X +#define STR(X) STR_(X) +#define FNPFXS STR (FNPFX) +#define CONCAT_(X, Y) X ## Y +#define CONCAT(X, Y) CONCAT_ (X, Y) +#define FNX(FN) CONCAT (FNPFX, FN) + +#define TEST(LOC, STR, EXP_VAL, FN, TYPE, FMT) \ + do \ + { \ + CHAR *ep; \ + TYPE val = FNX (FN) (STR, &ep, 36); \ + printf ("%s: " FNPFXS #FN " (" SFMT ") == " FMT "\n", LOC, STR, val); \ + if (val == (TYPE) (EXP_VAL) && *ep == 0) \ + printf ("PASS: %s: " FNPFXS #FN " (" SFMT ")\n", LOC, STR); \ + else \ + { \ + printf ("FAIL: %s: " FNPFXS #FN " (" SFMT ")\n", LOC, STR); \ + result = 1; \ + } \ + } \ + while (0) + +static int +test_one_locale (const char *loc) +{ + if (setlocale (LC_ALL, loc) == NULL) + { + printf ("setlocale (LC_ALL, \"%s\") failed\n", loc); + return 1; + } + int result = 0; + for (int i = 10; i < 36; i++) + { + CHAR s[2]; + s[0] = L_('A') + i - 10; + s[1] = 0; + TEST (loc, s, i, l, long int, "%ld"); + TEST (loc, s, i, ul, unsigned long int, "%lu"); + TEST (loc, s, i, ll, long long int, "%lld"); + TEST (loc, s, i, ull, unsigned long long int, "%llu"); + s[0] = L_('a') + i - 10; + s[1] = 0; + TEST (loc, s, i, l, long int, "%ld"); + TEST (loc, s, i, ul, unsigned long int, "%lu"); + TEST (loc, s, i, ll, long long int, "%lld"); + TEST (loc, s, i, ull, unsigned long long int, "%llu"); + } + return result; +} + +static int +do_test (void) +{ + int result = 0; + result |= test_one_locale ("C"); + result |= test_one_locale ("tr_TR.UTF-8"); + result |= test_one_locale ("tr_TR.ISO-8859-9"); + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-strtol-locale.c b/REORG.TODO/stdlib/tst-strtol-locale.c new file mode 100644 index 0000000000..1d5092ba84 --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtol-locale.c @@ -0,0 +1,25 @@ +/* Test strtol functions work with all ASCII letters in Turkish + locales (bug 19242). Narrow string version. + Copyright (C) 2015-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define CHAR char +#define SFMT "\"%s\"" +#define FNPFX strto +#define L_(C) C + +#include <tst-strtol-locale-main.c> diff --git a/REORG.TODO/stdlib/tst-strtol.c b/REORG.TODO/stdlib/tst-strtol.c new file mode 100644 index 0000000000..5b80622e07 --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtol.c @@ -0,0 +1,626 @@ +/* My bet is this was written by Chris Torek. + I reformatted and ansidecl-ized it, and tweaked it a little. */ + +#include <ctype.h> +#include <stdio.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#include <limits.h> + +struct ltest + { + const char *str; /* Convert this. */ + unsigned long int expect; /* To get this. */ + int base; /* Use this base. */ + char left; /* With this left over. */ + int err; /* And this in errno. */ + }; +static const struct ltest tests[] = + { + /* First, signed numbers: */ + /* simple... */ + {"123", 123, 0, 0, 0}, + {"+123", 123, 0, 0, 0}, + {" 123", 123, 0, 0, 0}, + {" 123 ", 123, 0, ' ', 0}, + {" -17", -17, 0, 0, 0}, + + /* implicit base... */ + {"0123", 0123, 0, 0, 0}, + {"0123a", 0123, 0, 'a', 0}, + {"01239", 0123, 0, '9', 0}, + {"0x123", 0x123, 0, 0, 0}, + {"-0x123", -0x123, 0, 0, 0}, + {"0x0xc", 0, 0, 'x', 0}, + {" +0x123fg", 0x123f, 0, 'g', 0}, + + /* explicit base... */ + {"123", 0x123, 16, 0, 0}, + {"0x123", 0x123, 16, 0, 0}, + {"123", 0123, 8, 0, 0}, + {"0123", 0123, 8, 0, 0}, + {"0123", 123, 10, 0, 0}, + {"0x123", 0, 10, 'x', 0}, + + /* case insensitivity... */ + {"abcd", 0xabcd, 16, 0, 0}, + {"AbCd", 0xabcd, 16, 0, 0}, + {"0xABCD", 0xabcd, 16, 0, 0}, + {"0Xabcd", 0xabcd, 16, 0, 0}, + + /* odd bases... */ + {"0xyz", 33 * 35 + 34, 35, 'z', 0}, + {"yz!", 34 * 36 + 35, 36, '!', 0}, + {"-yz", -(34*36 + 35), 36, 0, 0}, + {"GhI4", ((16*20 + 17)*20 + 18)*20 + 4, 20, 0, 0}, + + /* extremes... */ +#if LONG_MAX == 0x7fffffff + {"2147483647", 2147483647, 0, 0, 0}, + {"2147483648", 2147483647, 0, 0, ERANGE}, + {"214748364888", 2147483647, 0, 0, ERANGE}, + {"2147483650", 2147483647, 0, 0, ERANGE}, + {"-2147483648", 0x80000000, 0, 0, 0}, + {"-2147483649", 0x80000000, 0, 0, ERANGE}, + {"0x1122334455z", 2147483647, 16, 'z', ERANGE}, + + {"1111111111111111111111111111111", 2147483647, 2, 0, 0}, + {"10000000000000000000000000000000", 2147483647, 2, 0, ERANGE}, + {"12112122212110202101", 2147483647, 3, 0, 0}, + {"12112122212110202102", 2147483647, 3, 0, ERANGE}, + {"1333333333333333", 2147483647, 4, 0, 0}, + {"2000000000000000", 2147483647, 4, 0, ERANGE}, + {"13344223434042", 2147483647, 5, 0, 0}, + {"13344223434043", 2147483647, 5, 0, ERANGE}, + {"553032005531", 2147483647, 6, 0, 0}, + {"553032005532", 2147483647, 6, 0, ERANGE}, + {"104134211161", 2147483647, 7, 0, 0}, + {"104134211162", 2147483647, 7, 0, ERANGE}, + {"17777777777", 2147483647, 8, 0, 0}, + {"20000000000", 2147483647, 8, 0, ERANGE}, + {"5478773671", 2147483647, 9, 0, 0}, + {"5478773672", 2147483647, 9, 0, ERANGE}, + {"2147483647", 2147483647, 10, 0, 0}, + {"2147483648", 2147483647, 10, 0, ERANGE}, + {"a02220281", 2147483647, 11, 0, 0}, + {"a02220282", 2147483647, 11, 0, ERANGE}, + {"4bb2308a7", 2147483647, 12, 0, 0}, + {"4bb2308a8", 2147483647, 12, 0, ERANGE}, + {"282ba4aaa", 2147483647, 13, 0, 0}, + {"282ba4aab", 2147483647, 13, 0, ERANGE}, + {"1652ca931", 2147483647, 14, 0, 0}, + {"1652ca932", 2147483647, 14, 0, ERANGE}, + {"c87e66b7", 2147483647, 15, 0, 0}, + {"c87e66b8", 2147483647, 15, 0, ERANGE}, + {"7fffffff", 2147483647, 16, 0, 0}, + {"80000000", 2147483647, 16, 0, ERANGE}, + {"53g7f548", 2147483647, 17, 0, 0}, + {"53g7f549", 2147483647, 17, 0, ERANGE}, + {"3928g3h1", 2147483647, 18, 0, 0}, + {"3928g3h2", 2147483647, 18, 0, ERANGE}, + {"27c57h32", 2147483647, 19, 0, 0}, + {"27c57h33", 2147483647, 19, 0, ERANGE}, + {"1db1f927", 2147483647, 20, 0, 0}, + {"1db1f928", 2147483647, 20, 0, ERANGE}, + {"140h2d91", 2147483647, 21, 0, 0}, + {"140h2d92", 2147483647, 21, 0, ERANGE}, + {"ikf5bf1", 2147483647, 22, 0, 0}, + {"ikf5bf2", 2147483647, 22, 0, ERANGE}, + {"ebelf95", 2147483647, 23, 0, 0}, + {"ebelf96", 2147483647, 23, 0, ERANGE}, + {"b5gge57", 2147483647, 24, 0, 0}, + {"b5gge58", 2147483647, 24, 0, ERANGE}, + {"8jmdnkm", 2147483647, 25, 0, 0}, + {"8jmdnkn", 2147483647, 25, 0, ERANGE}, + {"6oj8ion", 2147483647, 26, 0, 0}, + {"6oj8ioo", 2147483647, 26, 0, ERANGE}, + {"5ehncka", 2147483647, 27, 0, 0}, + {"5ehnckb", 2147483647, 27, 0, ERANGE}, + {"4clm98f", 2147483647, 28, 0, 0}, + {"4clm98g", 2147483647, 28, 0, ERANGE}, + {"3hk7987", 2147483647, 29, 0, 0}, + {"3hk7988", 2147483647, 29, 0, ERANGE}, + {"2sb6cs7", 2147483647, 30, 0, 0}, + {"2sb6cs8", 2147483647, 30, 0, ERANGE}, + {"2d09uc1", 2147483647, 31, 0, 0}, + {"2d09uc2", 2147483647, 31, 0, ERANGE}, + {"1vvvvvv", 2147483647, 32, 0, 0}, + {"2000000", 2147483647, 32, 0, ERANGE}, + {"1lsqtl1", 2147483647, 33, 0, 0}, + {"1lsqtl2", 2147483647, 33, 0, ERANGE}, + {"1d8xqrp", 2147483647, 34, 0, 0}, + {"1d8xqrq", 2147483647, 34, 0, ERANGE}, + {"15v22um", 2147483647, 35, 0, 0}, + {"15v22un", 2147483647, 35, 0, ERANGE}, + {"zik0zj", 2147483647, 36, 0, 0}, + {"zik0zk", 2147483647, 36, 0, ERANGE}, + + {"-10000000000000000000000000000000", -2147483648, 2, 0, 0}, + {"-10000000000000000000000000000001", -2147483648, 2, 0, ERANGE}, + {"-12112122212110202102", -2147483648, 3, 0, 0}, + {"-12112122212110202110", -2147483648, 3, 0, ERANGE}, + {"-2000000000000000", -2147483648, 4, 0, 0}, + {"-2000000000000001", -2147483648, 4, 0, ERANGE}, + {"-13344223434043", -2147483648, 5, 0, 0}, + {"-13344223434044", -2147483648, 5, 0, ERANGE}, + {"-553032005532", -2147483648, 6, 0, 0}, + {"-553032005533", -2147483648, 6, 0, ERANGE}, + {"-104134211162", -2147483648, 7, 0, 0}, + {"-104134211163", -2147483648, 7, 0, ERANGE}, + {"-20000000000", -2147483648, 8, 0, }, + {"-20000000001", -2147483648, 8, 0, ERANGE}, + {"-5478773672", -2147483648, 9, 0, 0}, + {"-5478773673", -2147483648, 9, 0, ERANGE}, + {"-2147483648", -2147483648, 10, 0, 0}, + {"-2147483649", -2147483648, 10, 0, ERANGE}, + {"-a02220282", -2147483648, 11, 0, 0}, + {"-a02220283", -2147483648, 11, 0, ERANGE}, + {"-4bb2308a8", -2147483648, 12, 0, 0}, + {"-4bb2308a9", -2147483648, 12, 0, ERANGE}, + {"-282ba4aab", -2147483648, 13, 0, 0}, + {"-282ba4aac", -2147483648, 13, 0, ERANGE}, + {"-1652ca932", -2147483648, 14, 0, 0}, + {"-1652ca933", -2147483648, 14, 0, ERANGE}, + {"-c87e66b8", -2147483648, 15, 0, 0}, + {"-c87e66b9", -2147483648, 15, 0, ERANGE}, + {"-80000000", -2147483648, 16, 0, 0}, + {"-80000001", -2147483648, 16, 0, ERANGE}, + {"-53g7f549", -2147483648, 17, 0, 0}, + {"-53g7f54a", -2147483648, 17, 0, ERANGE}, + {"-3928g3h2", -2147483648, 18, 0, 0}, + {"-3928g3h3", -2147483648, 18, 0, ERANGE}, + {"-27c57h33", -2147483648, 19, 0, 0}, + {"-27c57h34", -2147483648, 19, 0, ERANGE}, + {"-1db1f928", -2147483648, 20, 0, 0}, + {"-1db1f929", -2147483648, 20, 0, ERANGE}, + {"-140h2d92", -2147483648, 21, 0, 0}, + {"-140h2d93", -2147483648, 21, 0, ERANGE}, + {"-ikf5bf2", -2147483648, 22, 0, 0}, + {"-ikf5bf3", -2147483648, 22, 0, ERANGE}, + {"-ebelf96", -2147483648, 23, 0, 0}, + {"-ebelf97", -2147483648, 23, 0, ERANGE}, + {"-b5gge58", -2147483648, 24, 0, 0}, + {"-b5gge59", -2147483648, 24, 0, ERANGE}, + {"-8jmdnkn", -2147483648, 25, 0, 0}, + {"-8jmdnko", -2147483648, 25, 0, ERANGE}, + {"-6oj8ioo", -2147483648, 26, 0, 0}, + {"-6oj8iop", -2147483648, 26, 0, ERANGE}, + {"-5ehnckb", -2147483648, 27, 0, 0}, + {"-5ehnckc", -2147483648, 27, 0, ERANGE}, + {"-4clm98g", -2147483648, 28, 0, 0}, + {"-4clm98h", -2147483648, 28, 0, ERANGE}, + {"-3hk7988", -2147483648, 29, 0, 0}, + {"-3hk7989", -2147483648, 29, 0, ERANGE}, + {"-2sb6cs8", -2147483648, 30, 0, 0}, + {"-2sb6cs9", -2147483648, 30, 0, ERANGE}, + {"-2d09uc2", -2147483648, 31, 0, 0}, + {"-2d09uc3", -2147483648, 31, 0, ERANGE}, + {"-2000000", -2147483648, 32, 0, 0}, + {"-2000001", -2147483648, 32, 0, ERANGE}, + {"-1lsqtl2", -2147483648, 33, 0, 0}, + {"-1lsqtl3", -2147483648, 33, 0, ERANGE}, + {"-1d8xqrq", -2147483648, 34, 0, 0}, + {"-1d8xqrr", -2147483648, 34, 0, ERANGE}, + {"-15v22un", -2147483648, 35, 0, 0}, + {"-15v22uo", -2147483648, 35, 0, ERANGE}, + {"-zik0zk", -2147483648, 36, 0, 0}, + {"-zik0zl", -2147483648, 36, 0, ERANGE}, +#else + {"9223372036854775807", 9223372036854775807, 0, 0, 0}, + {"9223372036854775808", 9223372036854775807, 0, 0, ERANGE}, + {"922337203685477580777", 9223372036854775807, 0, 0, ERANGE}, + {"9223372036854775810", 9223372036854775807, 0, 0, ERANGE}, + {"-2147483648", -2147483648, 0, 0, 0}, + {"-9223372036854775808", 0x8000000000000000, 0, 0, 0}, + {"-9223372036854775809", 0x8000000000000000, 0, 0, ERANGE}, + {"0x112233445566778899z", 9223372036854775807, 16, 'z', ERANGE}, + {"0xFFFFFFFFFFFF00FF" , 9223372036854775807, 0, 0, ERANGE}, + + {"111111111111111111111111111111111111111111111111111111111111111", + 9223372036854775807, 2, 0, 0}, + {"1000000000000000000000000000000000000000000000000000000000000000", + 9223372036854775807, 2, 0, ERANGE}, + {"2021110011022210012102010021220101220221", + 9223372036854775807, 3, 0, 0}, + {"2021110011022210012102010021220101220222", + 9223372036854775807, 3, 0, ERANGE}, + {"13333333333333333333333333333333", 9223372036854775807, 4, 0, 0}, + {"20000000000000000000000000000000", 9223372036854775807, 4, 0, ERANGE}, + {"1104332401304422434310311212", 9223372036854775807, 5, 0, 0}, + {"1104332401304422434310311213", 9223372036854775807, 5, 0, ERANGE}, + {"1540241003031030222122211", 9223372036854775807, 6, 0, 0}, + {"1540241003031030222122212", 9223372036854775807, 6, 0, ERANGE}, + {"22341010611245052052300", 9223372036854775807, 7, 0, 0}, + {"22341010611245052052301", 9223372036854775807, 7, 0, ERANGE}, + {"777777777777777777777", 9223372036854775807, 8, 0, 0}, + {"1000000000000000000000", 9223372036854775807, 8, 0, ERANGE}, + {"67404283172107811827", 9223372036854775807, 9, 0, 0}, + {"67404283172107811828", 9223372036854775807, 9, 0, ERANGE}, + {"9223372036854775807", 9223372036854775807, 10, 0, 0}, + {"9223372036854775808", 9223372036854775807, 10, 0, ERANGE}, + {"1728002635214590697", 9223372036854775807, 11, 0, 0}, + {"1728002635214590698", 9223372036854775807, 11, 0, ERANGE}, + {"41a792678515120367", 9223372036854775807, 12, 0, 0}, + {"41a792678515120368", 9223372036854775807, 12, 0, ERANGE}, + {"10b269549075433c37", 9223372036854775807, 13, 0, 0}, + {"10b269549075433c38", 9223372036854775807, 13, 0, ERANGE}, + {"4340724c6c71dc7a7", 9223372036854775807, 14, 0, 0}, + {"4340724c6c71dc7a8", 9223372036854775807, 14, 0, ERANGE}, + {"160e2ad3246366807", 9223372036854775807, 15, 0, 0}, + {"160e2ad3246366808", 9223372036854775807, 15, 0, ERANGE}, + {"7fffffffffffffff", 9223372036854775807, 16, 0, 0}, + {"8000000000000000", 9223372036854775807, 16, 0, ERANGE}, + {"33d3d8307b214008", 9223372036854775807, 17, 0, 0}, + {"33d3d8307b214009", 9223372036854775807, 17, 0, ERANGE}, + {"16agh595df825fa7", 9223372036854775807, 18, 0, 0}, + {"16agh595df825fa8", 9223372036854775807, 18, 0, ERANGE}, + {"ba643dci0ffeehh", 9223372036854775807, 19, 0, 0}, + {"ba643dci0ffeehi", 9223372036854775807, 19, 0, ERANGE}, + {"5cbfjia3fh26ja7", 9223372036854775807, 20, 0, 0}, + {"5cbfjia3fh26ja8", 9223372036854775807, 20, 0, ERANGE}, + {"2heiciiie82dh97", 9223372036854775807, 21, 0, 0}, + {"2heiciiie82dh98", 9223372036854775807, 21, 0, ERANGE}, + {"1adaibb21dckfa7", 9223372036854775807, 22, 0, 0}, + {"1adaibb21dckfa8", 9223372036854775807, 22, 0, ERANGE}, + {"i6k448cf4192c2", 9223372036854775807, 23, 0, 0}, + {"i6k448cf4192c3", 9223372036854775807, 23, 0, ERANGE}, + {"acd772jnc9l0l7", 9223372036854775807, 24, 0, 0}, + {"acd772jnc9l0l8", 9223372036854775807, 24, 0, ERANGE}, + {"64ie1focnn5g77", 9223372036854775807, 25, 0, 0}, + {"64ie1focnn5g78", 9223372036854775807, 25, 0, ERANGE}, + {"3igoecjbmca687", 9223372036854775807, 26, 0, 0}, + {"3igoecjbmca688", 9223372036854775807, 26, 0, ERANGE}, + {"27c48l5b37oaop", 9223372036854775807, 27, 0, 0}, + {"27c48l5b37oaoq", 9223372036854775807, 27, 0, ERANGE}, + {"1bk39f3ah3dmq7", 9223372036854775807, 28, 0, 0}, + {"1bk39f3ah3dmq8", 9223372036854775807, 28, 0, ERANGE}, + {"q1se8f0m04isb", 9223372036854775807, 29, 0, 0}, + {"q1se8f0m04isc", 9223372036854775807, 29, 0, ERANGE}, + {"hajppbc1fc207", 9223372036854775807, 30, 0, 0}, + {"hajppbc1fc208", 9223372036854775807, 30, 0, ERANGE}, + {"bm03i95hia437", 9223372036854775807, 31, 0, 0}, + {"bm03i95hia438", 9223372036854775807, 31, 0, ERANGE}, + {"7vvvvvvvvvvvv", 9223372036854775807, 32, 0, 0}, + {"8000000000000", 9223372036854775807, 32, 0, ERANGE}, + {"5hg4ck9jd4u37", 9223372036854775807, 33, 0, 0}, + {"5hg4ck9jd4u38", 9223372036854775807, 33, 0, ERANGE}, + {"3tdtk1v8j6tpp", 9223372036854775807, 34, 0, 0}, + {"3tdtk1v8j6tpq", 9223372036854775807, 34, 0, ERANGE}, + {"2pijmikexrxp7", 9223372036854775807, 35, 0, 0}, + {"2pijmikexrxp8", 9223372036854775807, 35, 0, ERANGE}, + {"1y2p0ij32e8e7", 9223372036854775807, 36, 0, 0}, + {"1y2p0ij32e8e8", 9223372036854775807, 36, 0, ERANGE}, + + {"-1000000000000000000000000000000000000000000000000000000000000000", + -9223372036854775808ull, 2, 0, 0}, + {"-1000000000000000000000000000000000000000000000000000000000000001", + -9223372036854775808ull, 2, 0, ERANGE}, + {"-2021110011022210012102010021220101220222", + -9223372036854775808ull, 3, 0, 0}, + {"-2021110011022210012102010021220101221000", + -9223372036854775808ull, 3, 0, ERANGE}, + {"-20000000000000000000000000000000", -9223372036854775808ull, 4, 0, 0}, + {"-20000000000000000000000000000001", -9223372036854775808ull, 4, 0, ERANGE}, + {"-1104332401304422434310311213", -9223372036854775808ull, 5, 0, 0}, + {"-1104332401304422434310311214", -9223372036854775808ull, 5, 0, ERANGE}, + {"-1540241003031030222122212", -9223372036854775808ull, 6, 0, 0}, + {"-1540241003031030222122213", -9223372036854775808ull, 6, 0, ERANGE}, + {"-22341010611245052052301", -9223372036854775808ull, 7, 0, 0}, + {"-22341010611245052052302", -9223372036854775808ull, 7, 0, ERANGE}, + {"-1000000000000000000000", -9223372036854775808ull, 8, 0, 0}, + {"-1000000000000000000001", -9223372036854775808ull, 8, 0, ERANGE}, + {"-67404283172107811828", -9223372036854775808ull, 9, 0, 0}, + {"-67404283172107811830", -9223372036854775808ull, 9, 0, ERANGE}, + {"-9223372036854775808", -9223372036854775808ull, 10, 0, 0}, + {"-9223372036854775809", -9223372036854775808ull, 10, 0, ERANGE}, + {"-1728002635214590698", -9223372036854775808ull, 11, 0, 0}, + {"-1728002635214590699", -9223372036854775808ull, 11, 0, ERANGE}, + {"-41a792678515120368", -9223372036854775808ull, 12, 0, 0}, + {"-41a792678515120369", -9223372036854775808ull, 12, 0, ERANGE}, + {"-10b269549075433c38", -9223372036854775808ull, 13, 0, 0}, + {"-10b269549075433c39", -9223372036854775808ull, 13, 0, ERANGE}, + {"-4340724c6c71dc7a8", -9223372036854775808ull, 14, 0, 0}, + {"-4340724c6c71dc7a9", -9223372036854775808ull, 14, 0, ERANGE}, + {"-160e2ad3246366808", -9223372036854775808ull, 15, 0, 0}, + {"-160e2ad3246366809", -9223372036854775808ull, 15, 0, ERANGE}, + {"-8000000000000000", -9223372036854775808ull, 16, 0, 0}, + {"-8000000000000001", -9223372036854775808ull, 16, 0, ERANGE}, + {"-33d3d8307b214009", -9223372036854775808ull, 17, 0, 0}, + {"-33d3d8307b21400a", -9223372036854775808ull, 17, 0, ERANGE}, + {"-16agh595df825fa8", -9223372036854775808ull, 18, 0, 0}, + {"-16agh595df825fa9", -9223372036854775808ull, 18, 0, ERANGE}, + {"-ba643dci0ffeehi", -9223372036854775808ull, 19, 0, 0}, + {"-ba643dci0ffeei0", -9223372036854775808ull, 19, 0, ERANGE}, + {"-5cbfjia3fh26ja8", -9223372036854775808ull, 20, 0, 0}, + {"-5cbfjia3fh26ja9", -9223372036854775808ull, 20, 0, ERANGE}, + {"-2heiciiie82dh98", -9223372036854775808ull, 21, 0, 0}, + {"-2heiciiie82dh99", -9223372036854775808ull, 21, 0, ERANGE}, + {"-1adaibb21dckfa8", -9223372036854775808ull, 22, 0, 0}, + {"-1adaibb21dckfa9", -9223372036854775808ull, 22, 0, ERANGE}, + {"-i6k448cf4192c3", -9223372036854775808ull, 23, 0, 0}, + {"-i6k448cf4192c4", -9223372036854775808ull, 23, 0, ERANGE}, + {"-acd772jnc9l0l8", -9223372036854775808ull, 24, 0, 0}, + {"-acd772jnc9l0l9", -9223372036854775808ull, 24, 0, ERANGE}, + {"-64ie1focnn5g78", -9223372036854775808ull, 25, 0, 0}, + {"-64ie1focnn5g79", -9223372036854775808ull, 25, 0, ERANGE}, + {"-3igoecjbmca688", -9223372036854775808ull, 26, 0, 0}, + {"-3igoecjbmca689", -9223372036854775808ull, 26, 0, ERANGE}, + {"-27c48l5b37oaoq", -9223372036854775808ull, 27, 0, 0}, + {"-27c48l5b37oap0", -9223372036854775808ull, 27, 0, ERANGE}, + {"-1bk39f3ah3dmq8", -9223372036854775808ull, 28, 0, 0}, + {"-1bk39f3ah3dmq9", -9223372036854775808ull, 28, 0, ERANGE}, + {"-q1se8f0m04isc", -9223372036854775808ull, 29, 0, 0}, + {"-q1se8f0m04isd", -9223372036854775808ull, 29, 0, ERANGE}, + {"-hajppbc1fc208", -9223372036854775808ull, 30, 0, 0}, + {"-hajppbc1fc209", -9223372036854775808ull, 30, 0, ERANGE}, + {"-bm03i95hia438", -9223372036854775808ull, 31, 0, 0}, + {"-bm03i95hia439", -9223372036854775808ull, 31, 0, ERANGE}, + {"-8000000000000", -9223372036854775808ull, 32, 0, 0}, + {"-8000000000001", -9223372036854775808ull, 32, 0, ERANGE}, + {"-5hg4ck9jd4u38", -9223372036854775808ull, 33, 0, 0}, + {"-5hg4ck9jd4u39", -9223372036854775808ull, 33, 0, ERANGE}, + {"-3tdtk1v8j6tpq", -9223372036854775808ull, 34, 0, 0}, + {"-3tdtk1v8j6tpr", -9223372036854775808ull, 34, 0, ERANGE}, + {"-2pijmikexrxp8", -9223372036854775808ull, 35, 0, 0}, + {"-2pijmikexrxp9", -9223372036854775808ull, 35, 0, ERANGE}, + {"-1y2p0ij32e8e8", -9223372036854775808ull, 36, 0, 0}, + {"-1y2p0ij32e8e9", -9223372036854775808ull, 36, 0, ERANGE}, +#endif + {NULL, 0, 0, 0, 0}, + + /* Then unsigned. */ + {" 0", 0, 0, 0, 0}, + {"0xffffffffg", 0xffffffff, 0, 'g', 0}, +#if LONG_MAX == 0x7fffffff + {"-0xfedcba98", 0x01234568, 0, 0, 0}, + {"0xf1f2f3f4f5", 0xffffffff, 0, 0, ERANGE}, + {"-0x123456789", 0xffffffff, 0, 0, ERANGE}, + + {"11111111111111111111111111111111", 0xffffffff, 2, 0, 0}, + {"100000000000000000000000000000000", 0xffffffff, 2, 0, ERANGE}, + {"102002022201221111210", 0xffffffff, 3, 0, 0}, + {"102002022201221111211", 0xffffffff, 3, 0, ERANGE}, + {"3333333333333333", 0xffffffff, 4, 0, 0}, + {"10000000000000000", 0xffffffff, 4, 0, ERANGE}, + {"32244002423140", 0xffffffff, 5, 0, 0}, + {"32244002423141", 0xffffffff, 5, 0, ERANGE}, + {"1550104015503", 0xffffffff, 6, 0, 0}, + {"1550104015504", 0xffffffff, 6, 0, ERANGE}, + {"211301422353", 0xffffffff, 7, 0, 0}, + {"211301422354", 0xffffffff, 7, 0, ERANGE}, + {"37777777777", 0xffffffff, 8, 0, 0}, + {"40000000000", 0xffffffff, 8, 0, ERANGE}, + {"12068657453", 0xffffffff, 9, 0, 0}, + {"12068657454", 0xffffffff, 9, 0, ERANGE}, + {"4294967295", 0xffffffff, 10, 0, 0}, + {"4294967296", 0xffffffff, 10, 0, ERANGE}, + {"1904440553", 0xffffffff, 11, 0, 0}, + {"1904440554", 0xffffffff, 11, 0, ERANGE}, + {"9ba461593", 0xffffffff, 12, 0, 0}, + {"9ba461594", 0xffffffff, 12, 0, ERANGE}, + {"535a79888", 0xffffffff, 13, 0, 0}, + {"535a79889", 0xffffffff, 13, 0, ERANGE}, + {"2ca5b7463", 0xffffffff, 14, 0, 0}, + {"2ca5b7464", 0xffffffff, 14, 0, ERANGE}, + {"1a20dcd80", 0xffffffff, 15, 0, 0}, + {"1a20dcd81", 0xffffffff, 15, 0, ERANGE}, + {"ffffffff", 0xffffffff, 16, 0, 0}, + {"100000000", 0xffffffff, 16, 0, ERANGE}, + {"a7ffda90", 0xffffffff, 17, 0, 0}, + {"a7ffda91", 0xffffffff, 17, 0, ERANGE}, + {"704he7g3", 0xffffffff, 18, 0, 0}, + {"704he7g4", 0xffffffff, 18, 0, ERANGE}, + {"4f5aff65", 0xffffffff, 19, 0, 0}, + {"4f5aff66", 0xffffffff, 19, 0, ERANGE}, + {"3723ai4f", 0xffffffff, 20, 0, 0}, + {"3723ai4g", 0xffffffff, 20, 0, ERANGE}, + {"281d55i3", 0xffffffff, 21, 0, 0}, + {"281d55i4", 0xffffffff, 21, 0, ERANGE}, + {"1fj8b183", 0xffffffff, 22, 0, 0}, + {"1fj8b184", 0xffffffff, 22, 0, ERANGE}, + {"1606k7ib", 0xffffffff, 23, 0, 0}, + {"1606k7ic", 0xffffffff, 23, 0, ERANGE}, + {"mb994af", 0xffffffff, 24, 0, 0}, + {"mb994ag", 0xffffffff, 24, 0, ERANGE}, + {"hek2mgk", 0xffffffff, 25, 0, 0}, + {"hek2mgl", 0xffffffff, 25, 0, ERANGE}, + {"dnchbnl", 0xffffffff, 26, 0, 0}, + {"dnchbnm", 0xffffffff, 26, 0, ERANGE}, + {"b28jpdl", 0xffffffff, 27, 0, 0}, + {"b28jpdm", 0xffffffff, 27, 0, ERANGE}, + {"8pfgih3", 0xffffffff, 28, 0, 0}, + {"8pfgih4", 0xffffffff, 28, 0, ERANGE}, + {"76beigf", 0xffffffff, 29, 0, 0}, + {"76beigg", 0xffffffff, 29, 0, ERANGE}, + {"5qmcpqf", 0xffffffff, 30, 0, 0}, + {"5qmcpqg", 0xffffffff, 30, 0, ERANGE}, + {"4q0jto3", 0xffffffff, 31, 0, 0}, + {"4q0jto4", 0xffffffff, 31, 0, ERANGE}, + {"3vvvvvv", 0xffffffff, 32, 0, 0}, + {"4000000", 0xffffffff, 32, 0, ERANGE}, + {"3aokq93", 0xffffffff, 33, 0, 0}, + {"3aokq94", 0xffffffff, 33, 0, ERANGE}, + {"2qhxjlh", 0xffffffff, 34, 0, 0}, + {"2qhxjli", 0xffffffff, 34, 0, ERANGE}, + {"2br45qa", 0xffffffff, 35, 0, 0}, + {"2br45qb", 0xffffffff, 35, 0, ERANGE}, + {"1z141z3", 0xffffffff, 36, 0, 0}, + {"1z141z4", 0xffffffff, 36, 0, ERANGE}, +#else + {"0xffffffffffffffffg", 0xffffffffffffffff, 0, 'g', 0}, + {"-0xfedcba987654321", 0xf0123456789abcdf, 0, 0, 0}, + {"0xf1f2f3f4f5f6f7f8f9", 0xffffffffffffffff, 0, 0, ERANGE}, + {"-0x123456789abcdef01", 0xffffffffffffffff, 0, 0, ERANGE}, + + {"1111111111111111111111111111111111111111111111111111111111111111", + 0xffffffffffffffff, 2, 0, 0}, + {"10000000000000000000000000000000000000000000000000000000000000000", + 0xffffffffffffffff, 2, 0, ERANGE}, + {"11112220022122120101211020120210210211220", + 0xffffffffffffffff, 3, 0, 0}, + {"11112220022122120101211020120210210211221", + 0xffffffffffffffff, 3, 0, ERANGE}, + {"33333333333333333333333333333333", 0xffffffffffffffff, 4, 0, 0}, + {"100000000000000000000000000000000", 0xffffffffffffffff, 4, 0, ERANGE}, + {"2214220303114400424121122430", 0xffffffffffffffff, 5, 0, 0}, + {"2214220303114400424121122431", 0xffffffffffffffff, 5, 0, ERANGE}, + {"3520522010102100444244423", 0xffffffffffffffff, 6, 0, 0}, + {"3520522010102100444244424", 0xffffffffffffffff, 6, 0, ERANGE}, + {"45012021522523134134601", 0xffffffffffffffff, 7, 0, 0}, + {"45012021522523134134602", 0xffffffffffffffff, 7, 0, ERANGE}, + {"1777777777777777777777", 0xffffffffffffffff, 8, 0, 0}, + {"2000000000000000000000", 0xffffffffffffffff, 8, 0, ERANGE}, + {"145808576354216723756", 0xffffffffffffffff, 9, 0, 0}, + {"145808576354216723757", 0xffffffffffffffff, 9, 0, ERANGE}, + {"18446744073709551615", 0xffffffffffffffff, 10, 0, 0}, + {"18446744073709551616", 0xffffffffffffffff, 10, 0, ERANGE}, + {"335500516a429071284", 0xffffffffffffffff, 11, 0, 0}, + {"335500516a429071285", 0xffffffffffffffff, 11, 0, ERANGE}, + {"839365134a2a240713", 0xffffffffffffffff, 12, 0, 0}, + {"839365134a2a240714", 0xffffffffffffffff, 12, 0, ERANGE}, + {"219505a9511a867b72", 0xffffffffffffffff, 13, 0, 0}, + {"219505a9511a867b73", 0xffffffffffffffff, 13, 0, ERANGE}, + {"8681049adb03db171", 0xffffffffffffffff, 14, 0, 0}, + {"8681049adb03db172", 0xffffffffffffffff, 14, 0, ERANGE}, + {"2c1d56b648c6cd110", 0xffffffffffffffff, 15, 0, 0}, + {"2c1d56b648c6cd111", 0xffffffffffffffff, 15, 0, ERANGE}, + {"ffffffffffffffff", 0xffffffffffffffff, 16, 0, 0}, + {"10000000000000000", 0xffffffffffffffff, 16, 0, ERANGE}, + {"67979g60f5428010", 0xffffffffffffffff, 17, 0, 0}, + {"67979g60f5428011", 0xffffffffffffffff, 17, 0, ERANGE}, + {"2d3fgb0b9cg4bd2f", 0xffffffffffffffff, 18, 0, 0}, + {"2d3fgb0b9cg4bd2g", 0xffffffffffffffff, 18, 0, ERANGE}, + {"141c8786h1ccaagg", 0xffffffffffffffff, 19, 0, 0}, + {"141c8786h1ccaagh", 0xffffffffffffffff, 19, 0, ERANGE}, + {"b53bjh07be4dj0f", 0xffffffffffffffff, 20, 0, 0}, + {"b53bjh07be4dj0g", 0xffffffffffffffff, 20, 0, ERANGE}, + {"5e8g4ggg7g56dif", 0xffffffffffffffff, 21, 0, 0}, + {"5e8g4ggg7g56dig", 0xffffffffffffffff, 21, 0, ERANGE}, + {"2l4lf104353j8kf", 0xffffffffffffffff, 22, 0, 0}, + {"2l4lf104353j8kg", 0xffffffffffffffff, 22, 0, ERANGE}, + {"1ddh88h2782i515", 0xffffffffffffffff, 23, 0, 0}, + {"1ddh88h2782i516", 0xffffffffffffffff, 23, 0, ERANGE}, + {"l12ee5fn0ji1if", 0xffffffffffffffff, 24, 0, 0}, + {"l12ee5fn0ji1ig", 0xffffffffffffffff, 24, 0, ERANGE}, + {"c9c336o0mlb7ef", 0xffffffffffffffff, 25, 0, 0}, + {"c9c336o0mlb7eg", 0xffffffffffffffff, 25, 0, ERANGE}, + {"7b7n2pcniokcgf", 0xffffffffffffffff, 26, 0, 0}, + {"7b7n2pcniokcgg", 0xffffffffffffffff, 26, 0, ERANGE}, + {"4eo8hfam6fllmo", 0xffffffffffffffff, 27, 0, 0}, + {"4eo8hfam6fllmp", 0xffffffffffffffff, 27, 0, ERANGE}, + {"2nc6j26l66rhof", 0xffffffffffffffff, 28, 0, 0}, + {"2nc6j26l66rhog", 0xffffffffffffffff, 28, 0, ERANGE}, + {"1n3rsh11f098rn", 0xffffffffffffffff, 29, 0, 0}, + {"1n3rsh11f098ro", 0xffffffffffffffff, 29, 0, ERANGE}, + {"14l9lkmo30o40f", 0xffffffffffffffff, 30, 0, 0}, + {"14l9lkmo30o40g", 0xffffffffffffffff, 30, 0, ERANGE}, + {"nd075ib45k86f", 0xffffffffffffffff, 31, 0, 0}, + {"nd075ib45k86g", 0xffffffffffffffff, 31, 0, ERANGE}, + {"fvvvvvvvvvvvv", 0xffffffffffffffff, 32, 0, 0}, + {"g000000000000", 0xffffffffffffffff, 32, 0, ERANGE}, + {"b1w8p7j5q9r6f", 0xffffffffffffffff, 33, 0, 0}, + {"b1w8p7j5q9r6g", 0xffffffffffffffff, 33, 0, ERANGE}, + {"7orp63sh4dphh", 0xffffffffffffffff, 34, 0, 0}, + {"7orp63sh4dphi", 0xffffffffffffffff, 34, 0, ERANGE}, + {"5g24a25twkwff", 0xffffffffffffffff, 35, 0, 0}, + {"5g24a25twkwfg", 0xffffffffffffffff, 35, 0, ERANGE}, + {"3w5e11264sgsf", 0xffffffffffffffff, 36, 0, 0}, + {"3w5e11264sgsg", 0xffffffffffffffff, 36, 0, ERANGE}, +#endif + {NULL, 0, 0, 0, 0}, + }; + +/* Prototypes for local functions. */ +static void expand (char *dst, int c); + +static int +do_test (void) +{ + const struct ltest *lt; + char *ep; + int status = 0; + int save_errno; + + for (lt = tests; lt->str != NULL; ++lt) + { + long int l; + + errno = 0; + l = strtol (lt->str, &ep, lt->base); + save_errno = errno; + printf ("strtol(\"%s\", , %d) test %u", + lt->str, lt->base, (unsigned int) (lt - tests)); + if (l == (long int) lt->expect && *ep == lt->left + && save_errno == lt->err) + puts("\tOK"); + else + { + puts("\tBAD"); + if (l != (long int) lt->expect) + printf(" returns %ld, expected %ld\n", + l, (long int) lt->expect); + if (lt->left != *ep) + { + char exp1[5], exp2[5]; + expand (exp1, *ep); + expand (exp2, lt->left); + printf (" leaves '%s', expected '%s'\n", exp1, exp2); + } + if (save_errno != lt->err) + printf (" errno %d (%s) instead of %d (%s)\n", + save_errno, strerror (save_errno), + lt->err, strerror (lt->err)); + status = 1; + } + } + + for (++lt; lt->str != NULL; lt++) + { + unsigned long int ul; + + errno = 0; + ul = strtoul (lt->str, &ep, lt->base); + save_errno = errno; + printf ("strtoul(\"%s\", , %d) test %u", + lt->str, lt->base, (unsigned int) (lt - tests)); + if (ul == lt->expect && *ep == lt->left && save_errno == lt->err) + puts("\tOK"); + else + { + puts ("\tBAD"); + if (ul != lt->expect) + printf (" returns %lu, expected %lu\n", + ul, lt->expect); + if (lt->left != *ep) + { + char exp1[5], exp2[5]; + expand (exp1, *ep); + expand (exp2, lt->left); + printf (" leaves '%s', expected '%s'\n", exp1, exp2); + } + if (save_errno != lt->err) + printf (" errno %d (%s) instead of %d (%s)\n", + save_errno, strerror (save_errno), + lt->err, strerror (lt->err)); + status = 1; + } + } + + return status ? EXIT_FAILURE : EXIT_SUCCESS; +} + +static void +expand (char *dst, int c) +{ + if (isprint (c)) + { + dst[0] = c; + dst[1] = '\0'; + } + else + (void) sprintf (dst, "%#.3o", (unsigned int) c); +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-strtoll.c b/REORG.TODO/stdlib/tst-strtoll.c new file mode 100644 index 0000000000..de39ee3a5e --- /dev/null +++ b/REORG.TODO/stdlib/tst-strtoll.c @@ -0,0 +1,401 @@ +/* My bet is this was written by Chris Torek. + I reformatted and ansidecl-ized it, and tweaked it a little. */ + +#include <ctype.h> +#include <stdio.h> +#include <errno.h> +#include <stdlib.h> +#include <string.h> +#include <limits.h> + +struct ltest + { + const char *str; /* Convert this. */ + unsigned long long int expect; /* To get this. */ + int base; /* Use this base. */ + char left; /* With this left over. */ + int err; /* And this in errno. */ + }; +static const struct ltest tests[] = + { + /* First, signed numbers: */ + /* simple... */ + {"123", 123, 0, 0, 0}, + {"+123", 123, 0, 0, 0}, + {" 123", 123, 0, 0, 0}, + {" 123 ", 123, 0, ' ', 0}, + {" -17", -17, 0, 0, 0}, + + /* implicit base... */ + {"0123", 0123, 0, 0, 0}, + {"0123a", 0123, 0, 'a', 0}, + {"01239", 0123, 0, '9', 0}, + {"0x123", 0x123, 0, 0, 0}, + {"-0x123", -0x123, 0, 0, 0}, + {"0x0xc", 0, 0, 'x', 0}, + {" +0x123fg", 0x123f, 0, 'g', 0}, + + /* explicit base... */ + {"123", 0x123, 16, 0, 0}, + {"0x123", 0x123, 16, 0, 0}, + {"123", 0123, 8, 0, 0}, + {"0123", 0123, 8, 0, 0}, + {"0123", 123, 10, 0, 0}, + {"0x123", 0, 10, 'x', 0}, + + /* case insensitivity... */ + {"abcd", 0xabcd, 16, 0, 0}, + {"AbCd", 0xabcd, 16, 0, 0}, + {"0xABCD", 0xabcd, 16, 0, 0}, + {"0Xabcd", 0xabcd, 16, 0, 0}, + + /* odd bases... */ + {"0xyz", 33 * 35 + 34, 35, 'z', 0}, + {"yz!", 34 * 36 + 35, 36, '!', 0}, + {"-yz", -(34*36 + 35), 36, 0, 0}, + {"GhI4", ((16*20 + 17)*20 + 18)*20 + 4, 20, 0, 0}, + + /* special case for the 32-bit version of strtoll, + from a ncftp configure test */ + {"99000000001", 1000000000ll * 99ll + 1ll, 0, 0}, + + /* extremes... */ + {"9223372036854775807", 9223372036854775807ll, 0, 0, 0}, + {"9223372036854775808", 9223372036854775807ll, 0, 0, ERANGE}, + {"922337203685477580777", 9223372036854775807ll, 0, 0, ERANGE}, + {"9223372036854775810", 9223372036854775807ll, 0, 0, ERANGE}, + {"-2147483648", -2147483648ll, 0, 0, 0}, + {"-9223372036854775808", -9223372036854775807ll - 1, 0, 0, 0}, + {"-9223372036854775809", -9223372036854775807ll - 1, 0, 0, ERANGE}, + {"0x112233445566778899z", 9223372036854775807ll, 16, 'z', ERANGE}, + {"0xFFFFFFFFFFFF00FF" , 9223372036854775807ll, 0, 0, ERANGE}, + + {"111111111111111111111111111111111111111111111111111111111111111", + 9223372036854775807ll, 2, 0, 0}, + {"1000000000000000000000000000000000000000000000000000000000000000", + 9223372036854775807ll, 2, 0, ERANGE}, + {"2021110011022210012102010021220101220221", + 9223372036854775807ll, 3, 0, 0}, + {"2021110011022210012102010021220101220222", + 9223372036854775807ll, 3, 0, ERANGE}, + {"13333333333333333333333333333333", 9223372036854775807ll, 4, 0, 0}, + {"20000000000000000000000000000000", 9223372036854775807ll, 4, 0, ERANGE}, + {"1104332401304422434310311212", 9223372036854775807ll, 5, 0, 0}, + {"1104332401304422434310311213", 9223372036854775807ll, 5, 0, ERANGE}, + {"1540241003031030222122211", 9223372036854775807ll, 6, 0, 0}, + {"1540241003031030222122212", 9223372036854775807ll, 6, 0, ERANGE}, + {"22341010611245052052300", 9223372036854775807ll, 7, 0, 0}, + {"22341010611245052052301", 9223372036854775807ll, 7, 0, ERANGE}, + {"777777777777777777777", 9223372036854775807ll, 8, 0, 0}, + {"1000000000000000000000", 9223372036854775807ll, 8, 0, ERANGE}, + {"67404283172107811827", 9223372036854775807ll, 9, 0, 0}, + {"67404283172107811828", 9223372036854775807ll, 9, 0, ERANGE}, + {"9223372036854775807", 9223372036854775807ll, 10, 0, 0}, + {"9223372036854775808", 9223372036854775807ll, 10, 0, ERANGE}, + {"1728002635214590697", 9223372036854775807ll, 11, 0, 0}, + {"1728002635214590698", 9223372036854775807ll, 11, 0, ERANGE}, + {"41a792678515120367", 9223372036854775807ll, 12, 0, 0}, + {"41a792678515120368", 9223372036854775807ll, 12, 0, ERANGE}, + {"10b269549075433c37", 9223372036854775807ll, 13, 0, 0}, + {"10b269549075433c38", 9223372036854775807ll, 13, 0, ERANGE}, + {"4340724c6c71dc7a7", 9223372036854775807ll, 14, 0, 0}, + {"4340724c6c71dc7a8", 9223372036854775807ll, 14, 0, ERANGE}, + {"160e2ad3246366807", 9223372036854775807ll, 15, 0, 0}, + {"160e2ad3246366808", 9223372036854775807ll, 15, 0, ERANGE}, + {"7fffffffffffffff", 9223372036854775807ll, 16, 0, 0}, + {"8000000000000000", 9223372036854775807ll, 16, 0, ERANGE}, + {"33d3d8307b214008", 9223372036854775807ll, 17, 0, 0}, + {"33d3d8307b214009", 9223372036854775807ll, 17, 0, ERANGE}, + {"16agh595df825fa7", 9223372036854775807ll, 18, 0, 0}, + {"16agh595df825fa8", 9223372036854775807ll, 18, 0, ERANGE}, + {"ba643dci0ffeehh", 9223372036854775807ll, 19, 0, 0}, + {"ba643dci0ffeehi", 9223372036854775807ll, 19, 0, ERANGE}, + {"5cbfjia3fh26ja7", 9223372036854775807ll, 20, 0, 0}, + {"5cbfjia3fh26ja8", 9223372036854775807ll, 20, 0, ERANGE}, + {"2heiciiie82dh97", 9223372036854775807ll, 21, 0, 0}, + {"2heiciiie82dh98", 9223372036854775807ll, 21, 0, ERANGE}, + {"1adaibb21dckfa7", 9223372036854775807ll, 22, 0, 0}, + {"1adaibb21dckfa8", 9223372036854775807ll, 22, 0, ERANGE}, + {"i6k448cf4192c2", 9223372036854775807ll, 23, 0, 0}, + {"i6k448cf4192c3", 9223372036854775807ll, 23, 0, ERANGE}, + {"acd772jnc9l0l7", 9223372036854775807ll, 24, 0, 0}, + {"acd772jnc9l0l8", 9223372036854775807ll, 24, 0, ERANGE}, + {"64ie1focnn5g77", 9223372036854775807ll, 25, 0, 0}, + {"64ie1focnn5g78", 9223372036854775807ll, 25, 0, ERANGE}, + {"3igoecjbmca687", 9223372036854775807ll, 26, 0, 0}, + {"3igoecjbmca688", 9223372036854775807ll, 26, 0, ERANGE}, + {"27c48l5b37oaop", 9223372036854775807ll, 27, 0, 0}, + {"27c48l5b37oaoq", 9223372036854775807ll, 27, 0, ERANGE}, + {"1bk39f3ah3dmq7", 9223372036854775807ll, 28, 0, 0}, + {"1bk39f3ah3dmq8", 9223372036854775807ll, 28, 0, ERANGE}, + {"q1se8f0m04isb", 9223372036854775807ll, 29, 0, 0}, + {"q1se8f0m04isc", 9223372036854775807ll, 29, 0, ERANGE}, + {"hajppbc1fc207", 9223372036854775807ll, 30, 0, 0}, + {"hajppbc1fc208", 9223372036854775807ll, 30, 0, ERANGE}, + {"bm03i95hia437", 9223372036854775807ll, 31, 0, 0}, + {"bm03i95hia438", 9223372036854775807ll, 31, 0, ERANGE}, + {"7vvvvvvvvvvvv", 9223372036854775807ll, 32, 0, 0}, + {"8000000000000", 9223372036854775807ll, 32, 0, ERANGE}, + {"5hg4ck9jd4u37", 9223372036854775807ll, 33, 0, 0}, + {"5hg4ck9jd4u38", 9223372036854775807ll, 33, 0, ERANGE}, + {"3tdtk1v8j6tpp", 9223372036854775807ll, 34, 0, 0}, + {"3tdtk1v8j6tpq", 9223372036854775807ll, 34, 0, ERANGE}, + {"2pijmikexrxp7", 9223372036854775807ll, 35, 0, 0}, + {"2pijmikexrxp8", 9223372036854775807ll, 35, 0, ERANGE}, + {"1y2p0ij32e8e7", 9223372036854775807ll, 36, 0, 0}, + {"1y2p0ij32e8e8", 9223372036854775807ll, 36, 0, ERANGE}, + + {"-1000000000000000000000000000000000000000000000000000000000000000", + -9223372036854775808ull, 2, 0, 0}, + {"-1000000000000000000000000000000000000000000000000000000000000001", + -9223372036854775808ull, 2, 0, ERANGE}, + {"-2021110011022210012102010021220101220222", + -9223372036854775808ull, 3, 0, 0}, + {"-2021110011022210012102010021220101221000", + -9223372036854775808ull, 3, 0, ERANGE}, + {"-20000000000000000000000000000000", -9223372036854775808ull, 4, 0, 0}, + {"-20000000000000000000000000000001", -9223372036854775808ull, 4, 0, ERANGE}, + {"-1104332401304422434310311213", -9223372036854775808ull, 5, 0, 0}, + {"-1104332401304422434310311214", -9223372036854775808ull, 5, 0, ERANGE}, + {"-1540241003031030222122212", -9223372036854775808ull, 6, 0, 0}, + {"-1540241003031030222122213", -9223372036854775808ull, 6, 0, ERANGE}, + {"-22341010611245052052301", -9223372036854775808ull, 7, 0, 0}, + {"-22341010611245052052302", -9223372036854775808ull, 7, 0, ERANGE}, + {"-1000000000000000000000", -9223372036854775808ull, 8, 0, 0}, + {"-1000000000000000000001", -9223372036854775808ull, 8, 0, ERANGE}, + {"-67404283172107811828", -9223372036854775808ull, 9, 0, 0}, + {"-67404283172107811830", -9223372036854775808ull, 9, 0, ERANGE}, + {"-9223372036854775808", -9223372036854775808ull, 10, 0, 0}, + {"-9223372036854775809", -9223372036854775808ull, 10, 0, ERANGE}, + {"-1728002635214590698", -9223372036854775808ull, 11, 0, 0}, + {"-1728002635214590699", -9223372036854775808ull, 11, 0, ERANGE}, + {"-41a792678515120368", -9223372036854775808ull, 12, 0, 0}, + {"-41a792678515120369", -9223372036854775808ull, 12, 0, ERANGE}, + {"-10b269549075433c38", -9223372036854775808ull, 13, 0, 0}, + {"-10b269549075433c39", -9223372036854775808ull, 13, 0, ERANGE}, + {"-4340724c6c71dc7a8", -9223372036854775808ull, 14, 0, 0}, + {"-4340724c6c71dc7a9", -9223372036854775808ull, 14, 0, ERANGE}, + {"-160e2ad3246366808", -9223372036854775808ull, 15, 0, 0}, + {"-160e2ad3246366809", -9223372036854775808ull, 15, 0, ERANGE}, + {"-8000000000000000", -9223372036854775808ull, 16, 0, 0}, + {"-8000000000000001", -9223372036854775808ull, 16, 0, ERANGE}, + {"-33d3d8307b214009", -9223372036854775808ull, 17, 0, 0}, + {"-33d3d8307b21400a", -9223372036854775808ull, 17, 0, ERANGE}, + {"-16agh595df825fa8", -9223372036854775808ull, 18, 0, 0}, + {"-16agh595df825fa9", -9223372036854775808ull, 18, 0, ERANGE}, + {"-ba643dci0ffeehi", -9223372036854775808ull, 19, 0, 0}, + {"-ba643dci0ffeei0", -9223372036854775808ull, 19, 0, ERANGE}, + {"-5cbfjia3fh26ja8", -9223372036854775808ull, 20, 0, 0}, + {"-5cbfjia3fh26ja9", -9223372036854775808ull, 20, 0, ERANGE}, + {"-2heiciiie82dh98", -9223372036854775808ull, 21, 0, 0}, + {"-2heiciiie82dh99", -9223372036854775808ull, 21, 0, ERANGE}, + {"-1adaibb21dckfa8", -9223372036854775808ull, 22, 0, 0}, + {"-1adaibb21dckfa9", -9223372036854775808ull, 22, 0, ERANGE}, + {"-i6k448cf4192c3", -9223372036854775808ull, 23, 0, 0}, + {"-i6k448cf4192c4", -9223372036854775808ull, 23, 0, ERANGE}, + {"-acd772jnc9l0l8", -9223372036854775808ull, 24, 0, 0}, + {"-acd772jnc9l0l9", -9223372036854775808ull, 24, 0, ERANGE}, + {"-64ie1focnn5g78", -9223372036854775808ull, 25, 0, 0}, + {"-64ie1focnn5g79", -9223372036854775808ull, 25, 0, ERANGE}, + {"-3igoecjbmca688", -9223372036854775808ull, 26, 0, 0}, + {"-3igoecjbmca689", -9223372036854775808ull, 26, 0, ERANGE}, + {"-27c48l5b37oaoq", -9223372036854775808ull, 27, 0, 0}, + {"-27c48l5b37oap0", -9223372036854775808ull, 27, 0, ERANGE}, + {"-1bk39f3ah3dmq8", -9223372036854775808ull, 28, 0, 0}, + {"-1bk39f3ah3dmq9", -9223372036854775808ull, 28, 0, ERANGE}, + {"-q1se8f0m04isc", -9223372036854775808ull, 29, 0, 0}, + {"-q1se8f0m04isd", -9223372036854775808ull, 29, 0, ERANGE}, + {"-hajppbc1fc208", -9223372036854775808ull, 30, 0, 0}, + {"-hajppbc1fc209", -9223372036854775808ull, 30, 0, ERANGE}, + {"-bm03i95hia438", -9223372036854775808ull, 31, 0, 0}, + {"-bm03i95hia439", -9223372036854775808ull, 31, 0, ERANGE}, + {"-8000000000000", -9223372036854775808ull, 32, 0, 0}, + {"-8000000000001", -9223372036854775808ull, 32, 0, ERANGE}, + {"-5hg4ck9jd4u38", -9223372036854775808ull, 33, 0, 0}, + {"-5hg4ck9jd4u39", -9223372036854775808ull, 33, 0, ERANGE}, + {"-3tdtk1v8j6tpq", -9223372036854775808ull, 34, 0, 0}, + {"-3tdtk1v8j6tpr", -9223372036854775808ull, 34, 0, ERANGE}, + {"-2pijmikexrxp8", -9223372036854775808ull, 35, 0, 0}, + {"-2pijmikexrxp9", -9223372036854775808ull, 35, 0, ERANGE}, + {"-1y2p0ij32e8e8", -9223372036854775808ull, 36, 0, 0}, + {"-1y2p0ij32e8e9", -9223372036854775808ull, 36, 0, ERANGE}, + {NULL, 0, 0, 0, 0}, + + /* Then unsigned. */ + {" 0", 0, 0, 0, 0}, + {"0xffffffffg", 0xffffffff, 0, 'g', 0}, + {"0xffffffffffffffffg", 0xffffffffffffffffull, 0, 'g', 0}, + {"-0xfedcba987654321", 0xf0123456789abcdfull, 0, 0, 0}, + {"0xf1f2f3f4f5f6f7f8f9", 0xffffffffffffffffull, 0, 0, ERANGE}, + {"-0x123456789abcdef01", 0xffffffffffffffffull, 0, 0, ERANGE}, + + {"1111111111111111111111111111111111111111111111111111111111111111", + 0xffffffffffffffff, 2, 0, 0}, + {"10000000000000000000000000000000000000000000000000000000000000000", + 0xffffffffffffffff, 2, 0, ERANGE}, + {"11112220022122120101211020120210210211220", + 0xffffffffffffffff, 3, 0, 0}, + {"11112220022122120101211020120210210211221", + 0xffffffffffffffff, 3, 0, ERANGE}, + {"33333333333333333333333333333333", 0xffffffffffffffff, 4, 0, 0}, + {"100000000000000000000000000000000", 0xffffffffffffffff, 4, 0, ERANGE}, + {"2214220303114400424121122430", 0xffffffffffffffff, 5, 0, 0}, + {"2214220303114400424121122431", 0xffffffffffffffff, 5, 0, ERANGE}, + {"3520522010102100444244423", 0xffffffffffffffff, 6, 0, 0}, + {"3520522010102100444244424", 0xffffffffffffffff, 6, 0, ERANGE}, + {"45012021522523134134601", 0xffffffffffffffff, 7, 0, 0}, + {"45012021522523134134602", 0xffffffffffffffff, 7, 0, ERANGE}, + {"1777777777777777777777", 0xffffffffffffffff, 8, 0, 0}, + {"2000000000000000000000", 0xffffffffffffffff, 8, 0, ERANGE}, + {"145808576354216723756", 0xffffffffffffffff, 9, 0, 0}, + {"145808576354216723757", 0xffffffffffffffff, 9, 0, ERANGE}, + {"18446744073709551615", 0xffffffffffffffff, 10, 0, 0}, + {"18446744073709551616", 0xffffffffffffffff, 10, 0, ERANGE}, + {"335500516a429071284", 0xffffffffffffffff, 11, 0, 0}, + {"335500516a429071285", 0xffffffffffffffff, 11, 0, ERANGE}, + {"839365134a2a240713", 0xffffffffffffffff, 12, 0, 0}, + {"839365134a2a240714", 0xffffffffffffffff, 12, 0, ERANGE}, + {"219505a9511a867b72", 0xffffffffffffffff, 13, 0, 0}, + {"219505a9511a867b73", 0xffffffffffffffff, 13, 0, ERANGE}, + {"8681049adb03db171", 0xffffffffffffffff, 14, 0, 0}, + {"8681049adb03db172", 0xffffffffffffffff, 14, 0, ERANGE}, + {"2c1d56b648c6cd110", 0xffffffffffffffff, 15, 0, 0}, + {"2c1d56b648c6cd111", 0xffffffffffffffff, 15, 0, ERANGE}, + {"ffffffffffffffff", 0xffffffffffffffff, 16, 0, 0}, + {"10000000000000000", 0xffffffffffffffff, 16, 0, ERANGE}, + {"67979g60f5428010", 0xffffffffffffffff, 17, 0, 0}, + {"67979g60f5428011", 0xffffffffffffffff, 17, 0, ERANGE}, + {"2d3fgb0b9cg4bd2f", 0xffffffffffffffff, 18, 0, 0}, + {"2d3fgb0b9cg4bd2g", 0xffffffffffffffff, 18, 0, ERANGE}, + {"141c8786h1ccaagg", 0xffffffffffffffff, 19, 0, 0}, + {"141c8786h1ccaagh", 0xffffffffffffffff, 19, 0, ERANGE}, + {"b53bjh07be4dj0f", 0xffffffffffffffff, 20, 0, 0}, + {"b53bjh07be4dj0g", 0xffffffffffffffff, 20, 0, ERANGE}, + {"5e8g4ggg7g56dif", 0xffffffffffffffff, 21, 0, 0}, + {"5e8g4ggg7g56dig", 0xffffffffffffffff, 21, 0, ERANGE}, + {"2l4lf104353j8kf", 0xffffffffffffffff, 22, 0, 0}, + {"2l4lf104353j8kg", 0xffffffffffffffff, 22, 0, ERANGE}, + {"1ddh88h2782i515", 0xffffffffffffffff, 23, 0, 0}, + {"1ddh88h2782i516", 0xffffffffffffffff, 23, 0, ERANGE}, + {"l12ee5fn0ji1if", 0xffffffffffffffff, 24, 0, 0}, + {"l12ee5fn0ji1ig", 0xffffffffffffffff, 24, 0, ERANGE}, + {"c9c336o0mlb7ef", 0xffffffffffffffff, 25, 0, 0}, + {"c9c336o0mlb7eg", 0xffffffffffffffff, 25, 0, ERANGE}, + {"7b7n2pcniokcgf", 0xffffffffffffffff, 26, 0, 0}, + {"7b7n2pcniokcgg", 0xffffffffffffffff, 26, 0, ERANGE}, + {"4eo8hfam6fllmo", 0xffffffffffffffff, 27, 0, 0}, + {"4eo8hfam6fllmp", 0xffffffffffffffff, 27, 0, ERANGE}, + {"2nc6j26l66rhof", 0xffffffffffffffff, 28, 0, 0}, + {"2nc6j26l66rhog", 0xffffffffffffffff, 28, 0, ERANGE}, + {"1n3rsh11f098rn", 0xffffffffffffffff, 29, 0, 0}, + {"1n3rsh11f098ro", 0xffffffffffffffff, 29, 0, ERANGE}, + {"14l9lkmo30o40f", 0xffffffffffffffff, 30, 0, 0}, + {"14l9lkmo30o40g", 0xffffffffffffffff, 30, 0, ERANGE}, + {"nd075ib45k86f", 0xffffffffffffffff, 31, 0, 0}, + {"nd075ib45k86g", 0xffffffffffffffff, 31, 0, ERANGE}, + {"fvvvvvvvvvvvv", 0xffffffffffffffff, 32, 0, 0}, + {"g000000000000", 0xffffffffffffffff, 32, 0, ERANGE}, + {"b1w8p7j5q9r6f", 0xffffffffffffffff, 33, 0, 0}, + {"b1w8p7j5q9r6g", 0xffffffffffffffff, 33, 0, ERANGE}, + {"7orp63sh4dphh", 0xffffffffffffffff, 34, 0, 0}, + {"7orp63sh4dphi", 0xffffffffffffffff, 34, 0, ERANGE}, + {"5g24a25twkwff", 0xffffffffffffffff, 35, 0, 0}, + {"5g24a25twkwfg", 0xffffffffffffffff, 35, 0, ERANGE}, + {"3w5e11264sgsf", 0xffffffffffffffff, 36, 0, 0}, + {"3w5e11264sgsg", 0xffffffffffffffff, 36, 0, ERANGE}, + {NULL, 0, 0, 0, 0}, + }; + +/* Prototypes for local functions. */ +static void expand (char *dst, int c); + +static int +do_test (void) +{ + const struct ltest *lt; + char *ep; + int status = 0; + int save_errno; + + for (lt = tests; lt->str != NULL; ++lt) + { + long long int l; + + errno = 0; + l = strtoll (lt->str, &ep, lt->base); + save_errno = errno; + printf ("strtoll(\"%s\", , %d) test %u", + lt->str, lt->base, (unsigned int) (lt - tests)); + if (l == (long long int) lt->expect && *ep == lt->left + && save_errno == lt->err) + puts("\tOK"); + else + { + puts("\tBAD"); + if (l != (long long int) lt->expect) + printf(" returns %lld, expected %lld\n", + l, (long long int) lt->expect); + if (lt->left != *ep) + { + char exp1[5], exp2[5]; + expand (exp1, *ep); + expand (exp2, lt->left); + printf (" leaves '%s', expected '%s'\n", exp1, exp2); + } + if (save_errno != lt->err) + printf (" errno %d (%s) instead of %d (%s)\n", + save_errno, strerror (save_errno), + lt->err, strerror (lt->err)); + status = 1; + } + } + + for (++lt; lt->str != NULL; lt++) + { + unsigned long long int ul; + + errno = 0; + ul = strtoull (lt->str, &ep, lt->base); + save_errno = errno; + printf ("strtoull(\"%s\", , %d) test %u", + lt->str, lt->base, (unsigned int) (lt - tests)); + if (ul == lt->expect && *ep == lt->left && save_errno == lt->err) + puts("\tOK"); + else + { + puts ("\tBAD"); + if (ul != lt->expect) + printf (" returns %llu, expected %llu\n", + ul, lt->expect); + if (lt->left != *ep) + { + char exp1[5], exp2[5]; + expand (exp1, *ep); + expand (exp2, lt->left); + printf (" leaves '%s', expected '%s'\n", exp1, exp2); + } + if (save_errno != lt->err) + printf (" errno %d (%s) instead of %d (%s)\n", + save_errno, strerror (save_errno), + lt->err, strerror (lt->err)); + status = 1; + } + } + + return status ? EXIT_FAILURE : EXIT_SUCCESS; +} + +static void +expand (char *dst, int c) +{ + if (isprint (c)) + { + dst[0] = c; + dst[1] = '\0'; + } + else + (void) sprintf (dst, "%#.3o", (unsigned int) c); +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-system.c b/REORG.TODO/stdlib/tst-system.c new file mode 100644 index 0000000000..6cb62e1248 --- /dev/null +++ b/REORG.TODO/stdlib/tst-system.c @@ -0,0 +1,30 @@ +/* Copyright (C) 2002-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@redhat.com>, 2002. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + + +static int +do_test (void) +{ + return system (":"); +} + + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-thread-quick_exit.cc b/REORG.TODO/stdlib/tst-thread-quick_exit.cc new file mode 100644 index 0000000000..047df6043d --- /dev/null +++ b/REORG.TODO/stdlib/tst-thread-quick_exit.cc @@ -0,0 +1,66 @@ +/* Bug 20198: Do not call object destructors at exit. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <errno.h> +#include <pthread.h> +#include <stdio.h> +#include <stdlib.h> + +struct A +{ + ~A () { abort (); } +}; + +thread_local A a1; +thread_local A a2; + +void +__attribute__ ((noinline, noclone)) +optimization_barrier (A &) +{ +} + +/* Call std::quick_exit from a non-main thread. */ +void * +non_main_thread (void *) +{ + optimization_barrier (a1); + /* The C++11 standard in 18.5.12 says: + "Objects shall not be destroyed as a result of calling + quick_exit." + If quick_exit calls the destructors the test aborts. */ + quick_exit (0); +} + +static int +do_test() +{ + optimization_barrier (a2); + pthread_t thr; + int ret = pthread_create (&thr, NULL, non_main_thread, NULL); + if (ret != 0) + { + errno = ret; + printf ("error: pthread_create: %m\n"); + } + pthread_join (thr, NULL); + return 1; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-tininess.c b/REORG.TODO/stdlib/tst-tininess.c new file mode 100644 index 0000000000..c032454f96 --- /dev/null +++ b/REORG.TODO/stdlib/tst-tininess.c @@ -0,0 +1,69 @@ +/* Test that tininess.h is correct for this architecture. + Copyright (C) 2012-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <fenv.h> +#include <float.h> +#include <stdio.h> +#include <tininess.h> + +volatile float a = 0x1.fffp-126; +volatile float b = 0x1.0008p-1; +volatile float c; +volatile float m = FLT_MIN; +volatile float mm; + +static int +do_test (void) +{ + int result = 0; +#ifdef FE_UNDERFLOW + feclearexcept (FE_ALL_EXCEPT); + mm = m * m; + if (!fetestexcept (FE_UNDERFLOW)) + { + puts ("underflow exception not supported at runtime, cannot test"); + return 0; + } + feclearexcept (FE_ALL_EXCEPT); + c = a * b; + if (fetestexcept (FE_UNDERFLOW)) + { + if (TININESS_AFTER_ROUNDING) + { + puts ("tininess.h says after rounding, " + "but detected before rounding"); + result = 1; + } + } + else + { + if (!TININESS_AFTER_ROUNDING) + { + puts ("tininess.h says before rounding, " + "but detected after rounding"); + result = 1; + } + } +#else + puts ("underflow exception not supported at compile time, cannot test"); +#endif + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-tls-atexit-lib.c b/REORG.TODO/stdlib/tst-tls-atexit-lib.c new file mode 100644 index 0000000000..a227e4653c --- /dev/null +++ b/REORG.TODO/stdlib/tst-tls-atexit-lib.c @@ -0,0 +1,38 @@ +/* Verify that DSO is unloaded only if its TLS objects are destroyed - the DSO. + Copyright (C) 2013-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> + +extern void *__dso_handle; + +typedef struct +{ + void *val; +} A; + +/* We only care about the destructor. */ +void A_dtor (void *obj) +{ + ((A *)obj)->val = obj; +} + +void reg_dtor (void) +{ + static __thread A b; + __cxa_thread_atexit_impl (A_dtor, &b, __dso_handle); +} diff --git a/REORG.TODO/stdlib/tst-tls-atexit-nodelete.c b/REORG.TODO/stdlib/tst-tls-atexit-nodelete.c new file mode 100644 index 0000000000..2293685144 --- /dev/null +++ b/REORG.TODO/stdlib/tst-tls-atexit-nodelete.c @@ -0,0 +1,24 @@ +/* Verify that a RTLD_NODELETE DSO is not unloaded even if its TLS objects are + destroyed. + + Copyright (C) 2015-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#define NO_DELETE 1 +#define H2_RTLD_FLAGS (RTLD_LAZY | RTLD_NODELETE) +#define LOADED_IS_GOOD true +#include "tst-tls-atexit.c" diff --git a/REORG.TODO/stdlib/tst-tls-atexit.c b/REORG.TODO/stdlib/tst-tls-atexit.c new file mode 100644 index 0000000000..6dbf49d460 --- /dev/null +++ b/REORG.TODO/stdlib/tst-tls-atexit.c @@ -0,0 +1,156 @@ +/* Verify that DSO is unloaded only if its TLS objects are destroyed. + Copyright (C) 2013-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* For the default case, i.e. NO_DELETE not defined, the test dynamically loads + a DSO and spawns a thread that subsequently calls into the DSO to register a + destructor for an object in the DSO and then calls dlclose on the handle for + the DSO. When the thread exits, the DSO should not be unloaded or else the + destructor called during thread exit will crash. Further in the main + thread, the DSO is opened and closed again, at which point the DSO should be + unloaded. + + When NO_DELETE is defined, the DSO is loaded twice, once with just RTLD_LAZY + flag and the second time with the RTLD_NODELETE flag set. The thread is + spawned, destructor registered and then thread exits without closing the + DSO. In the main thread, the first handle is then closed, followed by the + second handle. In the end, the DSO should remain loaded due to the + RTLD_NODELETE flag being set in the second dlopen call. */ + +#include <dlfcn.h> +#include <pthread.h> +#include <stdio.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> +#include <link.h> +#include <stdbool.h> + +#ifndef NO_DELETE +# define LOADED_IS_GOOD false +#endif + +#ifndef H2_RTLD_FLAGS +# define H2_RTLD_FLAGS (RTLD_LAZY) +#endif + +#define DSO_NAME "$ORIGIN/tst-tls-atexit-lib.so" + +/* Walk through the map in the _r_debug structure to see if our lib is still + loaded. */ +static bool +is_loaded (void) +{ + struct link_map *lm = (struct link_map *) _r_debug.r_map; + + for (; lm; lm = lm->l_next) + if (lm->l_type == lt_loaded && lm->l_name + && strcmp (basename (DSO_NAME), basename (lm->l_name)) == 0) + { + printf ("%s is still loaded\n", lm->l_name); + return true; + } + return false; +} + +/* Accept a valid handle returned by DLOPEN, load the reg_dtor symbol to + register a destructor and then call dlclose on the handle. The dlclose + should not unload the DSO since the destructor has not been called yet. */ +static void * +reg_dtor_and_close (void *h) +{ + void (*reg_dtor) (void) = (void (*) (void)) dlsym (h, "reg_dtor"); + + if (reg_dtor == NULL) + { + printf ("Unable to find symbol: %s\n", dlerror ()); + return (void *) (uintptr_t) 1; + } + + reg_dtor (); + +#ifndef NO_DELETE + dlclose (h); +#endif + + return NULL; +} + +static int +spawn_thread (void *h) +{ + pthread_t t; + int ret; + void *thr_ret; + + if ((ret = pthread_create (&t, NULL, reg_dtor_and_close, h)) != 0) + { + printf ("pthread_create failed: %s\n", strerror (ret)); + return 1; + } + + if ((ret = pthread_join (t, &thr_ret)) != 0) + { + printf ("pthread_join failed: %s\n", strerror (ret)); + return 1; + } + + if (thr_ret != NULL) + return 1; + + return 0; +} + +static int +do_test (void) +{ + /* Load the DSO. */ + void *h1 = dlopen (DSO_NAME, RTLD_LAZY); + if (h1 == NULL) + { + printf ("h1: Unable to load DSO: %s\n", dlerror ()); + return 1; + } + +#ifndef NO_DELETE + if (spawn_thread (h1) != 0) + return 1; +#endif + + void *h2 = dlopen (DSO_NAME, H2_RTLD_FLAGS); + if (h2 == NULL) + { + printf ("h2: Unable to load DSO: %s\n", dlerror ()); + return 1; + } + +#ifdef NO_DELETE + if (spawn_thread (h1) != 0) + return 1; + + dlclose (h1); +#endif + dlclose (h2); + + /* Check link maps to ensure that the DSO has unloaded. In the normal case, + the DSO should be unloaded if there are no uses. However, if one of the + dlopen calls were with RTLD_NODELETE, the DSO should remain loaded. */ + return is_loaded () == LOADED_IS_GOOD ? 0 : 1; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-unsetenv1.c b/REORG.TODO/stdlib/tst-unsetenv1.c new file mode 100644 index 0000000000..a2a760d241 --- /dev/null +++ b/REORG.TODO/stdlib/tst-unsetenv1.c @@ -0,0 +1,12 @@ +#include <stdlib.h> + +static int +do_test (void) +{ + clearenv (); + unsetenv ("FOO"); + return 0; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-width-stdint.c b/REORG.TODO/stdlib/tst-width-stdint.c new file mode 100644 index 0000000000..9a4c4167b2 --- /dev/null +++ b/REORG.TODO/stdlib/tst-width-stdint.c @@ -0,0 +1,185 @@ +/* Test integer width macros in <stdint.h>. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <signal.h> +#include <stddef.h> +#include <stdint.h> +#include <stdio.h> +#include <wchar.h> + +#define CHECK_WIDTH(TYPE, MAX, WIDTH) \ + do \ + { \ + if ((MAX >> ((TYPE) -1 < 0 ? (WIDTH - 2) : (WIDTH - 1))) != 1) \ + { \ + puts ("bad width of " #TYPE); \ + result = 1; \ + } \ + else \ + puts ("width of " #TYPE " OK"); \ + } \ + while (0) + +static int +do_test (void) +{ + int result = 0; + +#ifndef INT8_WIDTH +# error "missing INT8_WIDTH" +#endif + CHECK_WIDTH (int8_t, INT8_MAX, INT8_WIDTH); +#ifndef INT16_WIDTH +# error "missing INT16_WIDTH" +#endif + CHECK_WIDTH (int16_t, INT16_MAX, INT16_WIDTH); +#ifndef INT32_WIDTH +# error "missing INT32_WIDTH" +#endif + CHECK_WIDTH (int32_t, INT32_MAX, INT32_WIDTH); +#ifndef INT64_WIDTH +# error "missing INT64_WIDTH" +#endif + CHECK_WIDTH (int64_t, INT64_MAX, INT64_WIDTH); +#ifndef UINT8_WIDTH +# error "missing UINT8_WIDTH" +#endif + CHECK_WIDTH (uint8_t, UINT8_MAX, UINT8_WIDTH); +#ifndef UINT16_WIDTH +# error "missing UINT16_WIDTH" +#endif + CHECK_WIDTH (uint16_t, UINT16_MAX, UINT16_WIDTH); +#ifndef UINT32_WIDTH +# error "missing UINT32_WIDTH" +#endif + CHECK_WIDTH (uint32_t, UINT32_MAX, UINT32_WIDTH); +#ifndef UINT64_WIDTH +# error "missing UINT64_WIDTH" +#endif + CHECK_WIDTH (uint64_t, UINT64_MAX, UINT64_WIDTH); + +#ifndef INT_LEAST8_WIDTH +# error "missing INT_LEAST8_WIDTH" +#endif + CHECK_WIDTH (int_least8_t, INT_LEAST8_MAX, INT_LEAST8_WIDTH); +#ifndef INT_LEAST16_WIDTH +# error "missing INT_LEAST16_WIDTH" +#endif + CHECK_WIDTH (int_least16_t, INT_LEAST16_MAX, INT_LEAST16_WIDTH); +#ifndef INT_LEAST32_WIDTH +# error "missing INT_LEAST32_WIDTH" +#endif + CHECK_WIDTH (int_least32_t, INT_LEAST32_MAX, INT_LEAST32_WIDTH); +#ifndef INT_LEAST64_WIDTH +# error "missing INT_LEAST64_WIDTH" +#endif + CHECK_WIDTH (int_least64_t, INT_LEAST64_MAX, INT_LEAST64_WIDTH); +#ifndef UINT_LEAST8_WIDTH +# error "missing UINT_LEAST8_WIDTH" +#endif + CHECK_WIDTH (uint_least8_t, UINT_LEAST8_MAX, UINT_LEAST8_WIDTH); +#ifndef UINT_LEAST16_WIDTH +# error "missing UINT_LEAST16_WIDTH" +#endif + CHECK_WIDTH (uint_least16_t, UINT_LEAST16_MAX, UINT_LEAST16_WIDTH); +#ifndef UINT_LEAST32_WIDTH +# error "missing UINT_LEAST32_WIDTH" +#endif + CHECK_WIDTH (uint_least32_t, UINT_LEAST32_MAX, UINT_LEAST32_WIDTH); +#ifndef UINT_LEAST64_WIDTH +# error "missing UINT_LEAST64_WIDTH" +#endif + CHECK_WIDTH (uint_least64_t, UINT_LEAST64_MAX, UINT_LEAST64_WIDTH); + +#ifndef INT_FAST8_WIDTH +# error "missing INT_FAST8_WIDTH" +#endif + CHECK_WIDTH (int_fast8_t, INT_FAST8_MAX, INT_FAST8_WIDTH); +#ifndef INT_FAST16_WIDTH +# error "missing INT_FAST16_WIDTH" +#endif + CHECK_WIDTH (int_fast16_t, INT_FAST16_MAX, INT_FAST16_WIDTH); +#ifndef INT_FAST32_WIDTH +# error "missing INT_FAST32_WIDTH" +#endif + CHECK_WIDTH (int_fast32_t, INT_FAST32_MAX, INT_FAST32_WIDTH); +#ifndef INT_FAST64_WIDTH +# error "missing INT_FAST64_WIDTH" +#endif + CHECK_WIDTH (int_fast64_t, INT_FAST64_MAX, INT_FAST64_WIDTH); +#ifndef UINT_FAST8_WIDTH +# error "missing UINT_FAST8_WIDTH" +#endif + CHECK_WIDTH (uint_fast8_t, UINT_FAST8_MAX, UINT_FAST8_WIDTH); +#ifndef UINT_FAST16_WIDTH +# error "missing UINT_FAST16_WIDTH" +#endif + CHECK_WIDTH (uint_fast16_t, UINT_FAST16_MAX, UINT_FAST16_WIDTH); +#ifndef UINT_FAST32_WIDTH +# error "missing UINT_FAST32_WIDTH" +#endif + CHECK_WIDTH (uint_fast32_t, UINT_FAST32_MAX, UINT_FAST32_WIDTH); +#ifndef UINT_FAST64_WIDTH +# error "missing UINT_FAST64_WIDTH" +#endif + CHECK_WIDTH (uint_fast64_t, UINT_FAST64_MAX, UINT_FAST64_WIDTH); + +#ifndef INTPTR_WIDTH +# error "missing INTPTR_WIDTH" +#endif + CHECK_WIDTH (intptr_t, INTPTR_MAX, INTPTR_WIDTH); +#ifndef UINTPTR_WIDTH +# error "missing UINTPTR_WIDTH" +#endif + CHECK_WIDTH (uintptr_t, UINTPTR_MAX, UINTPTR_WIDTH); + +#ifndef INTMAX_WIDTH +# error "missing INTMAX_WIDTH" +#endif + CHECK_WIDTH (intmax_t, INTMAX_MAX, INTMAX_WIDTH); +#ifndef UINTMAX_WIDTH +# error "missing UINTMAX_WIDTH" +#endif + CHECK_WIDTH (uintmax_t, UINTMAX_MAX, UINTMAX_WIDTH); + +#ifndef PTRDIFF_WIDTH +# error "missing PTRDIFF_WIDTH" +#endif + CHECK_WIDTH (ptrdiff_t, PTRDIFF_MAX, PTRDIFF_WIDTH); +#ifndef SIG_ATOMIC_WIDTH +# error "missing SIG_ATOMIC_WIDTH" +#endif + CHECK_WIDTH (sig_atomic_t, SIG_ATOMIC_MAX, SIG_ATOMIC_WIDTH); +#ifndef SIZE_WIDTH +# error "missing SIZE_WIDTH" +#endif + CHECK_WIDTH (size_t, SIZE_MAX, SIZE_WIDTH); +#ifndef WCHAR_WIDTH +# error "missing WCHAR_WIDTH" +#endif + CHECK_WIDTH (wchar_t, WCHAR_MAX, WCHAR_WIDTH); +#ifndef WINT_WIDTH +# error "missing WINT_WIDTH" +#endif + CHECK_WIDTH (wint_t, WINT_MAX, WINT_WIDTH); + + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-width.c b/REORG.TODO/stdlib/tst-width.c new file mode 100644 index 0000000000..326bd9d37d --- /dev/null +++ b/REORG.TODO/stdlib/tst-width.c @@ -0,0 +1,87 @@ +/* Test integer width macros. + Copyright (C) 2016-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <limits.h> +#include <stdio.h> + +#define CHECK_WIDTH(TYPE, MAX, WIDTH) \ + do \ + { \ + if ((MAX >> ((TYPE) -1 < 0 ? (WIDTH - 2) : (WIDTH - 1))) != 1) \ + { \ + puts ("bad width of " #TYPE); \ + result = 1; \ + } \ + else \ + puts ("width of " #TYPE " OK"); \ + } \ + while (0) + +static int +do_test (void) +{ + int result = 0; +#ifndef CHAR_WIDTH +# error "missing CHAR_WIDTH" +#endif + CHECK_WIDTH (char, CHAR_MAX, CHAR_WIDTH); +#ifndef SCHAR_WIDTH +# error "missing SCHAR_WIDTH" +#endif + CHECK_WIDTH (signed char, SCHAR_MAX, SCHAR_WIDTH); +#ifndef UCHAR_WIDTH +# error "missing UCHAR_WIDTH" +#endif + CHECK_WIDTH (unsigned char, UCHAR_MAX, UCHAR_WIDTH); +#ifndef SHRT_WIDTH +# error "missing SHRT_WIDTH" +#endif + CHECK_WIDTH (signed short, SHRT_MAX, SHRT_WIDTH); +#ifndef USHRT_WIDTH +# error "missing USHRT_WIDTH" +#endif + CHECK_WIDTH (unsigned short, USHRT_MAX, USHRT_WIDTH); +#ifndef INT_WIDTH +# error "missing INT_WIDTH" +#endif + CHECK_WIDTH (signed int, INT_MAX, INT_WIDTH); +#ifndef UINT_WIDTH +# error "missing UINT_WIDTH" +#endif + CHECK_WIDTH (unsigned int, UINT_MAX, UINT_WIDTH); +#ifndef LONG_WIDTH +# error "missing LONG_WIDTH" +#endif + CHECK_WIDTH (signed long, LONG_MAX, LONG_WIDTH); +#ifndef ULONG_WIDTH +# error "missing ULONG_WIDTH" +#endif + CHECK_WIDTH (unsigned long, ULONG_MAX, ULONG_WIDTH); +#ifndef LLONG_WIDTH +# error "missing LLONG_WIDTH" +#endif + CHECK_WIDTH (signed long long, LLONG_MAX, LLONG_WIDTH); +#ifndef ULLONG_WIDTH +# error "missing ULLONG_WIDTH" +#endif + CHECK_WIDTH (unsigned long long, ULLONG_MAX, ULLONG_WIDTH); + return result; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/tst-xpg-basename.c b/REORG.TODO/stdlib/tst-xpg-basename.c new file mode 100644 index 0000000000..baf5361747 --- /dev/null +++ b/REORG.TODO/stdlib/tst-xpg-basename.c @@ -0,0 +1,69 @@ +/* Copyright (C) 1999-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Andreas Jaeger <aj@suse.de>, 1999. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <libgen.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +static struct +{ + const char *path; + const char *file; +} tests [] = +{ + { "/dir/file", "file" }, + { "file", "file"}, + { "/dir/file///", "file" }, + { "../file", "file" }, + { "/", "/" }, + { NULL, "."}, + { "", "."} +}; + + +static int +do_test (void) +{ + size_t i = 0; + int errors = 0; + char path[1024]; + char *file; + + for (i = 0; i < sizeof (tests) / sizeof (tests [0]); ++i) + { + if (tests [i].path == NULL) + file = __xpg_basename (NULL); + else + { + strcpy (path, tests [i].path); + file = __xpg_basename (path); + } + if (strcmp (file, tests [i].file)) + { + printf ("Test with `%s' failed: Result is: `%s'.\n", + (tests [i].path == NULL ? "NULL" : tests [i].path), file); + errors = 1; + } + } + + return errors; +} + +#define TEST_FUNCTION do_test () +#include "../test-skeleton.c" diff --git a/REORG.TODO/stdlib/ucontext.h b/REORG.TODO/stdlib/ucontext.h new file mode 100644 index 0000000000..2cef5f7869 --- /dev/null +++ b/REORG.TODO/stdlib/ucontext.h @@ -0,0 +1,52 @@ +/* Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +/* System V ABI compliant user-level context switching support. */ + +#ifndef _UCONTEXT_H +#define _UCONTEXT_H 1 + +#include <features.h> + +/* Get machine dependent definition of data structures. */ +#include <sys/ucontext.h> + +__BEGIN_DECLS + +/* Get user context and store it in variable pointed to by UCP. */ +extern int getcontext (ucontext_t *__ucp) __THROWNL; + +/* Set user context from information of variable pointed to by UCP. */ +extern int setcontext (const ucontext_t *__ucp) __THROWNL; + +/* Save current context in context variable pointed to by OUCP and set + context from variable pointed to by UCP. */ +extern int swapcontext (ucontext_t *__restrict __oucp, + const ucontext_t *__restrict __ucp) __THROWNL; + +/* Manipulate user context UCP to continue with calling functions FUNC + and the ARGC-1 parameters following ARGC when the context is used + the next time in `setcontext' or `swapcontext'. + + We cannot say anything about the parameters FUNC takes; `void' + is as good as any other choice. */ +extern void makecontext (ucontext_t *__ucp, void (*__func) (void), + int __argc, ...) __THROW; + +__END_DECLS + +#endif /* ucontext.h */ diff --git a/REORG.TODO/stdlib/udiv_qrnnd.c b/REORG.TODO/stdlib/udiv_qrnnd.c new file mode 100644 index 0000000000..d32796c04d --- /dev/null +++ b/REORG.TODO/stdlib/udiv_qrnnd.c @@ -0,0 +1,10 @@ +/* For some machines GNU MP needs to define an auxiliary function: + + udiv_qrnnd (quotient, remainder, high_numerator, low_numerator, denominator) + + Divides a two-word unsigned integer, composed by the integers + HIGH_NUMERATOR and LOW_NUMERATOR, by DENOMINATOR and places the quotient + in QUOTIENT and the remainder in REMAINDER. HIGH_NUMERATOR must be less + than DENOMINATOR for correct operation. If, in addition, the most + significant bit of DENOMINATOR must be 1, then the pre-processor symbol + UDIV_NEEDS_NORMALIZATION is defined to 1. */ diff --git a/REORG.TODO/stdlib/wcstoimax.c b/REORG.TODO/stdlib/wcstoimax.c new file mode 100644 index 0000000000..f1de70f320 --- /dev/null +++ b/REORG.TODO/stdlib/wcstoimax.c @@ -0,0 +1 @@ +#error "The correct implementation must be chosen based on the `intmax_t' type" diff --git a/REORG.TODO/stdlib/wcstombs.c b/REORG.TODO/stdlib/wcstombs.c new file mode 100644 index 0000000000..7e1667b4a1 --- /dev/null +++ b/REORG.TODO/stdlib/wcstombs.c @@ -0,0 +1,35 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <string.h> +#include <wchar.h> + + +/* Convert the `wchar_t' string in PWCS to a multibyte character string + in S, writing no more than N characters. Return the number of bytes + written, or (size_t) -1 if an invalid `wchar_t' was found. */ +size_t +wcstombs (char *s, const wchar_t *pwcs, size_t n) +{ + mbstate_t state; + + memset (&state, '\0', sizeof state); + + /* Return how many we wrote (or maybe an error). */ + return __wcsrtombs (s, &pwcs, n, &state); +} diff --git a/REORG.TODO/stdlib/wcstoumax.c b/REORG.TODO/stdlib/wcstoumax.c new file mode 100644 index 0000000000..508cb19f8c --- /dev/null +++ b/REORG.TODO/stdlib/wcstoumax.c @@ -0,0 +1 @@ +#error "The correct implementation must be chosen based on the `uintmax_t' type" diff --git a/REORG.TODO/stdlib/wctomb.c b/REORG.TODO/stdlib/wctomb.c new file mode 100644 index 0000000000..c14d4266ec --- /dev/null +++ b/REORG.TODO/stdlib/wctomb.c @@ -0,0 +1,57 @@ +/* Copyright (C) 1991-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <stdlib.h> +#include <string.h> +#include <wchar.h> +#include <gconv.h> +#include <wcsmbs/wcsmbsload.h> + + +/* Shared with __wctomb_chk. */ +mbstate_t __wctomb_state attribute_hidden; + +/* Convert WCHAR into its multibyte character representation, + putting this in S and returning its length. + + Attention: this function should NEVER be intentionally used. + The interface is completely stupid. The state is shared between + all conversion functions. You should use instead the restartable + version `wcrtomb'. */ +int +wctomb (char *s, wchar_t wchar) +{ + /* If S is NULL the function has to return null or not null + depending on the encoding having a state depending encoding or + not. */ + if (s == NULL) + { + const struct gconv_fcts *fcts; + + /* Get the conversion functions. */ + fcts = get_gconv_fcts (_NL_CURRENT_DATA (LC_CTYPE)); + + /* This is an extension in the Unix standard which does not directly + violate ISO C. */ + memset (&__wctomb_state, '\0', sizeof __wctomb_state); + + return fcts->tomb->__stateful; + } + + return __wcrtomb (s, wchar, &__wctomb_state); +} +libc_hidden_def (wctomb) diff --git a/REORG.TODO/stdlib/xpg_basename.c b/REORG.TODO/stdlib/xpg_basename.c new file mode 100644 index 0000000000..57120f9cb2 --- /dev/null +++ b/REORG.TODO/stdlib/xpg_basename.c @@ -0,0 +1,71 @@ +/* Return basename of given pathname according to the weird XPG specification. + Copyright (C) 1997-2017 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <string.h> +#include <libgen.h> + + +char * +__xpg_basename (char *filename) +{ + char *p; + + if (filename == NULL || filename[0] == '\0') + /* We return a pointer to a static string containing ".". */ + p = (char *) "."; + else + { + p = strrchr (filename, '/'); + + if (p == NULL) + /* There is no slash in the filename. Return the whole string. */ + p = filename; + else + { + if (p[1] == '\0') + { + /* We must remove trailing '/'. */ + while (p > filename && p[-1] == '/') + --p; + + /* Now we can be in two situations: + a) the string only contains '/' characters, so we return + '/' + b) p points past the last component, but we have to remove + the trailing slash. */ + if (p > filename) + { + *p-- = '\0'; + while (p > filename && p[-1] != '/') + --p; + } + else + /* The last slash we already found is the right position + to return. */ + while (p[1] != '\0') + ++p; + } + else + /* Go to the first character of the name. */ + ++p; + } + } + + return p; +} |