Commit 2bb93784c6
Changed files (504)
libc
mingw
complex
gdtoa
math
arm
arm64
x86
misc
stdio
src
libc/mingw/complex/_cabs.c
@@ -0,0 +1,61 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 <math.h>
+#include <complex.h>
+
+/* We implement this function to make sure we use always the C99 compatible
+ routine. By this we fix an issue about 32-bit and 64-bit version of
+ msvcrt, which differs in some corner-cases. */
+
+double __cdecl
+_cabs (struct _complex _ComplexA)
+{
+ double _Complex a;
+
+ __real__ a = _ComplexA.x;
+ __imag__ a = _ComplexA.y;
+
+ return cabs (a);
+}
libc/mingw/complex/cabs.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#include "complex_internal.h"
+#include "cabs.def.h"
libc/mingw/complex/cabs.def.h
@@ -0,0 +1,49 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __cdecl
+__FLT_ABI(cabs) (__FLT_TYPE __complex__ z)
+{
+ return __FLT_ABI(hypot) (__real__ z, __imag__ z);
+}
libc/mingw/complex/cabsf.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#include "complex_internal.h"
+#include "cabs.def.h"
libc/mingw/complex/cabsl.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "cabs.def.h"
libc/mingw/complex/cacos.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#include "complex_internal.h"
+
+#include "cacosh.def.h"
+#include "cacos.def.h"
libc/mingw/complex/cacos.def.h
@@ -0,0 +1,57 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(cacos) (__FLT_TYPE __complex__ z)
+{
+ __complex__ __FLT_TYPE x;
+ __complex__ __FLT_TYPE ret;
+
+ x = __FLT_ABI(casin) (z);
+
+ __real__ ret = (__FLT_TYPE) __FLT_PI_2 - __real__ x;
+ __imag__ ret = -__imag__ x;
+
+ return ret;
+}
libc/mingw/complex/cacosf.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#include "complex_internal.h"
+
+#include "cacosh.def.h"
+#include "cacos.def.h"
libc/mingw/complex/cacosh.def.h
@@ -0,0 +1,100 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(cacosh) (__FLT_TYPE __complex__ z)
+{
+ __complex__ __FLT_TYPE ret;
+ __complex__ __FLT_TYPE x;
+ int r_class = fpclassify (__real__ z);
+ int i_class = fpclassify (__imag__ z);
+
+ if (i_class == FP_INFINITE)
+ {
+ __real__ ret = __FLT_HUGE_VAL;
+ __imag__ ret = (r_class == FP_NAN ? __FLT_NAN : __FLT_ABI(copysign) (
+ (r_class == FP_INFINITE ? (__real__ z < __FLT_CST(0.0) ? __FLT_PI_3_4 : __FLT_PI_4) : __FLT_PI_2), __imag__ z));
+ return ret;
+ }
+
+ if (r_class == FP_INFINITE)
+ {
+ __real__ ret = __FLT_HUGE_VAL;
+ __imag__ ret = ((i_class != FP_NAN && i_class != FP_INFINITE)
+ ? __FLT_ABI(copysign) (signbit (__real__ z) ? __FLT_PI : __FLT_CST(0.0), __imag__ z) : __FLT_NAN);
+ return ret;
+ }
+
+ if (r_class == FP_NAN || i_class == FP_NAN)
+ {
+ __real__ ret = __FLT_NAN;
+ __imag__ ret = __FLT_NAN;
+ return ret;
+ }
+
+ if (r_class == FP_ZERO && i_class == FP_ZERO)
+ {
+ __real__ ret = __FLT_CST(0.0);
+ __imag__ ret = __FLT_ABI(copysign) (__FLT_PI_2, __imag__ z);
+ return ret;
+ }
+
+ __real__ x = (__real__ z - __imag__ z) * (__real__ z + __imag__ z) - __FLT_CST(1.0);
+ __imag__ x = __FLT_CST(2.0) * __real__ z * __imag__ z;
+
+ x = __FLT_ABI(csqrt) (x);
+
+ if (__real__ z < __FLT_CST(0.0))
+ x = -x;
+
+ __real__ x += __real__ z;
+ __imag__ x += __imag__ z;
+
+ ret = __FLT_ABI(clog) (x);
+
+ if (__real__ ret < __FLT_CST(0.0))
+ ret = -ret;
+
+ return ret;
+}
libc/mingw/complex/cacosl.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+
+#include "cacosh.def.h"
+#include "cacos.def.h"
libc/mingw/complex/carg.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#include "complex_internal.h"
+#include "carg.def.h"
libc/mingw/complex/carg.def.h
@@ -0,0 +1,49 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __cdecl
+__FLT_ABI(carg) (__FLT_TYPE __complex__ z)
+{
+ return __FLT_ABI(atan2) (__imag__ z, __real__ z);
+}
libc/mingw/complex/cargf.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#include "complex_internal.h"
+#include "carg.def.h"
libc/mingw/complex/cargl.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "carg.def.h"
libc/mingw/complex/casin.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#include "complex_internal.h"
+
+#include "casinh.def.h"
+#include "casin.def.h"
libc/mingw/complex/casin.def.h
@@ -0,0 +1,61 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(casin) (__FLT_TYPE __complex__ z)
+{
+ /* Annex G.6: casin(z) = -i casinh (iz) */
+ __complex__ __FLT_TYPE ret;
+ __complex__ __FLT_TYPE x;
+
+ __real__ x = -__imag__ z;
+ __imag__ x = __real__ z;
+
+ x = __FLT_ABI(casinh) (x);
+
+ __real__ ret = __imag__ x;
+ __imag__ ret = -__real__ x;
+
+ return ret;
+}
libc/mingw/complex/casinf.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#include "complex_internal.h"
+
+#include "casinh.def.h"
+#include "casin.def.h"
libc/mingw/complex/casinh.def.h
@@ -0,0 +1,99 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(casinh) (__FLT_TYPE __complex__ z)
+{
+ __complex__ __FLT_TYPE ret;
+ __complex__ __FLT_TYPE x;
+ int r_class = fpclassify (__real__ z);
+ int i_class = fpclassify (__imag__ z);
+
+ if (i_class == FP_INFINITE)
+ {
+ __real__ ret = __FLT_ABI(copysign) (__FLT_HUGE_VAL, __real__ z);
+ __imag__ ret = (r_class == FP_NAN
+ ? __FLT_NAN
+ : (__FLT_ABI(copysign) ((r_class != FP_NAN && r_class != FP_INFINITE) ? __FLT_PI_2 : __FLT_PI_4, __imag__ z)));
+ return ret;
+ }
+
+ if (r_class == FP_INFINITE)
+ {
+ __real__ ret = __real__ z;
+ __imag__ ret = (i_class != FP_NAN
+ ? __FLT_ABI(copysign) (__FLT_CST(0.0), __imag__ z)
+ : __FLT_NAN);
+ return ret;
+ }
+
+ if (r_class == FP_NAN)
+ {
+ __real__ ret = __real__ z;
+ __imag__ ret = (i_class == FP_ZERO
+ ? __FLT_ABI(copysign) (__FLT_CST(0.0), __imag__ z)
+ : __FLT_NAN);
+ return ret;
+ }
+
+ if (i_class == FP_NAN)
+ {
+ __real__ ret = __FLT_NAN;
+ __imag__ ret = __FLT_NAN;
+ return ret;
+ }
+
+ if (r_class == FP_ZERO && i_class == FP_ZERO)
+ return z;
+
+ __real__ x = (__real__ z - __imag__ z) * (__real__ z + __imag__ z) + __FLT_CST(1.0);
+ __imag__ x = __FLT_CST(2.0) * __real__ z * __imag__ z;
+
+ x = __FLT_ABI(csqrt) (x);
+
+ __real__ x += __real__ z;
+ __imag__ x += __imag__ z;
+
+ return __FLT_ABI(clog) (x);
+}
libc/mingw/complex/casinl.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+
+#include "casinh.def.h"
+#include "casin.def.h"
libc/mingw/complex/catan.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#include "complex_internal.h"
+
+#include "catanh.def.h"
+#include "catan.def.h"
libc/mingw/complex/catan.def.h
@@ -0,0 +1,61 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(catan) (__FLT_TYPE __complex__ z)
+{
+ /* Annex G.6: catan(z) = -i catanh (iz) */
+ __complex__ __FLT_TYPE ret;
+ __complex__ __FLT_TYPE x;
+
+ __real__ x = -__imag__ z;
+ __imag__ x = __real__ z;
+
+ x = __FLT_ABI(catanh) (x);
+
+ __real__ ret = __imag__ x;
+ __imag__ ret = -__real__ x;
+
+ return ret;
+}
libc/mingw/complex/catanf.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#include "complex_internal.h"
+
+#include "catanh.def.h"
+#include "catan.def.h"
libc/mingw/complex/catanh.def.h
@@ -0,0 +1,93 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(catanh) (__FLT_TYPE __complex__ z)
+{
+ __complex__ __FLT_TYPE ret;
+ __FLT_TYPE i2, n, d;
+ int r_class = fpclassify (__real__ z);
+ int i_class = fpclassify (__imag__ z);
+
+ if (r_class == FP_INFINITE || r_class == FP_NAN || i_class == FP_INFINITE || i_class == FP_NAN)
+ {
+ if (i_class == FP_INFINITE)
+ {
+ __real__ ret = __FLT_ABI(copysign) (__FLT_CST(0.0), __real__ z);
+ __imag__ ret = __FLT_ABI(copysign) (__FLT_PI_2, __imag__ z);
+ return ret;
+ }
+
+ if (r_class == FP_INFINITE || r_class == FP_ZERO)
+ {
+ __real__ ret = __FLT_ABI(copysign) (__FLT_CST(0.0), __real__ z);
+ __imag__ ret = ((i_class != FP_NAN && i_class != FP_INFINITE)
+ ? __FLT_ABI(copysign) (__FLT_PI_2, __imag__ z) : __FLT_NAN);
+ return ret;
+ }
+
+ __real__ ret = __FLT_NAN;
+ __imag__ ret = __FLT_NAN;
+ return ret;
+ }
+
+ if (r_class == FP_ZERO && i_class == FP_ZERO)
+ return z;
+
+ i2 = __imag__ z * __imag__ z;
+
+ n = __FLT_CST(1.0) + __real__ z;
+ n = i2 + n * n;
+
+ d = __FLT_CST(1.0) - __real__ z;
+ d = i2 + d * d;
+
+ __real__ ret = __FLT_CST(0.25) * (__FLT_ABI(log) (n) - __FLT_ABI(log) (d));
+
+ d = 1 - __real__ z * __real__ z - i2;
+
+ __imag__ ret = __FLT_CST(0.5) * __FLT_ABI(atan2) (__FLT_CST(2.0) * __imag__ z, d);
+
+ return ret;
+}
libc/mingw/complex/catanl.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+
+#include "catanh.def.h"
+#include "catan.def.h"
libc/mingw/complex/ccos.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#include "complex_internal.h"
+
+#include "ccosh.def.h"
+#include "ccos.def.h"
libc/mingw/complex/ccos.def.h
@@ -0,0 +1,54 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(ccos) (__FLT_TYPE __complex__ z)
+{
+ /* Annex G.6, ccos(z) = ccosh(iz) */
+ __complex__ __FLT_TYPE x;
+ __real__ x = -__imag__ z;
+ __imag__ x = __real__ z;
+
+ return __FLT_ABI(ccosh) (x);
+}
libc/mingw/complex/ccosf.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#include "complex_internal.h"
+
+#include "ccosh.def.h"
+#include "ccos.def.h"
libc/mingw/complex/ccosh.def.h
@@ -0,0 +1,95 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(ccosh) (__FLT_TYPE __complex__ z)
+{
+ __complex__ __FLT_TYPE ret;
+ __FLT_TYPE s_x, c_x;
+ int r_class = fpclassify (__real__ z);
+ int i_class = fpclassify (__imag__ z);
+
+ if (r_class == FP_NAN)
+ {
+ __real__ ret = __FLT_NAN;
+ __imag__ ret = __imag__ z == __FLT_CST(0.0) ? __imag__ z : __FLT_NAN;
+ return ret;
+ }
+
+ if (r_class == FP_INFINITE)
+ {
+ if (i_class == FP_ZERO)
+ {
+ __real__ ret = __FLT_HUGE_VAL;
+ __imag__ ret = __imag__ z * __FLT_ABI(copysign) (__FLT_CST(1.0), __real__ z);
+ return ret;
+ }
+
+ if (i_class == FP_NAN || i_class == FP_INFINITE)
+ {
+ __real__ ret = __FLT_HUGE_VAL;
+ __imag__ ret = __FLT_NAN + __FLT_NAN;
+ return ret;
+ }
+
+ __FLT_ABI(sincos) (__imag__ z, &s_x, &c_x);
+
+ __real__ ret = __FLT_ABI(copysign) (__FLT_HUGE_VAL, c_x);
+ __imag__ ret = (__FLT_ABI(copysign) (__FLT_HUGE_VAL, s_x) * __FLT_ABI(copysign) (__FLT_CST(1.0), __real__ z));
+ return ret;
+ }
+
+ if (i_class == FP_NAN || i_class == FP_INFINITE)
+ {
+ __imag__ ret = __real__ z == __FLT_CST(0.0) ? __FLT_CST(0.0) : __FLT_NAN;
+ __real__ ret = __FLT_NAN + __FLT_NAN;
+ return ret;
+ }
+
+ __FLT_ABI(sincos) (__imag__ z, &s_x, &c_x);
+
+ __real__ ret = __FLT_ABI(cosh) (__real__ z) * c_x;
+ __imag__ ret = __FLT_ABI(sinh) (__real__ z) * s_x;
+ return ret;
+}
libc/mingw/complex/ccosl.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+
+#include "ccosh.def.h"
+#include "ccos.def.h"
libc/mingw/complex/cexp.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#include "complex_internal.h"
+#include "cexp.def.h"
libc/mingw/complex/cexp.def.h
@@ -0,0 +1,111 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(cexp) (__FLT_TYPE __complex__ z)
+{
+ __complex__ __FLT_TYPE ret;
+ __FLT_TYPE s_x, c_x, exp_val, v;
+ int r_class = fpclassify (__real__ z);
+ int i_class = fpclassify (__imag__ z);
+
+ if (r_class == FP_INFINITE)
+ {
+ if (i_class != FP_NAN && i_class != FP_INFINITE)
+ {
+ v = signbit (__real__ z) ? __FLT_CST(0.0) : __FLT_HUGE_VAL;
+
+ if (i_class == FP_ZERO)
+ {
+ __real__ ret = v;
+ __imag__ ret = __imag__ z;
+ return ret;
+ }
+
+ __FLT_ABI(sincos) (__imag__ z, &s_x, &c_x);
+
+ __real__ ret = __FLT_ABI(copysign) (v, c_x);
+ __imag__ ret = __FLT_ABI(copysign) (v, s_x);
+ return ret;
+ }
+
+ if (signbit (__real__ z) == 0)
+ {
+ __real__ ret = __FLT_HUGE_VAL;
+ __imag__ ret = __FLT_NAN;
+ }
+ else
+ {
+ __real__ ret = __FLT_CST(0.0);
+ __imag__ ret = __FLT_ABI(copysign) (__FLT_CST(0.0), __imag__ z);
+ }
+ return ret;
+ }
+
+ if (r_class == FP_NAN || i_class == FP_NAN || i_class == FP_INFINITE)
+ {
+ __real__ ret = __FLT_NAN;
+ if (i_class == FP_ZERO)
+ __imag__ ret = __FLT_ABI(copysign) (__FLT_CST(0.0), __imag__ z);
+ else
+ __imag__ ret = __FLT_NAN;
+ return ret;
+ }
+
+ exp_val = __FLT_ABI(exp) (__real__ z);
+
+ __FLT_ABI(sincos) (__imag__ z, &s_x, &c_x);
+
+ if (isfinite (exp_val))
+ {
+ __real__ ret = exp_val * c_x;
+ __imag__ ret = exp_val * s_x;
+ }
+ else
+ {
+ __real__ ret = __FLT_ABI(copysign) (exp_val, c_x);
+ __imag__ ret = __FLT_ABI(copysign) (exp_val, s_x);
+ }
+ return ret;
+}
libc/mingw/complex/cexpf.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#include "complex_internal.h"
+#include "cexp.def.h"
libc/mingw/complex/cexpl.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "cexp.def.h"
libc/mingw/complex/cimag.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#include "complex_internal.h"
+#include "cimag.def.h"
libc/mingw/complex/cimag.def.h
@@ -0,0 +1,49 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __cdecl
+__FLT_ABI(cimag) (__FLT_TYPE __complex z)
+{
+ return __imag__ z;
+}
libc/mingw/complex/cimagf.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#include "complex_internal.h"
+#include "cimag.def.h"
libc/mingw/complex/cimagl.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "cimag.def.h"
libc/mingw/complex/clog.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#include "complex_internal.h"
+#include "clog.def.h"
libc/mingw/complex/clog.def.h
@@ -0,0 +1,71 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(clog) (__FLT_TYPE __complex__ z)
+{
+ __complex__ __FLT_TYPE ret;
+ int r_class = fpclassify (__real__ z);
+ int i_class = fpclassify (__imag__ z);
+
+ if (r_class == FP_ZERO && i_class == FP_ZERO)
+ {
+ __imag__ ret = signbit (__real__ z) ? __FLT_PI : __FLT_CST(0.0);
+ __imag__ ret = __FLT_ABI(copysign) (__imag__ ret, __imag__ z);
+ __real__ ret = -__FLT_CST(1.0) / __FLT_ABI(fabs) (__real__ z);
+ return ret;
+ }
+
+ if (r_class == FP_NAN || i_class == FP_NAN)
+ {
+ __imag__ ret = __FLT_NAN;
+ __real__ ret = ((r_class == FP_INFINITE || i_class == FP_INFINITE) ? __FLT_HUGE_VAL : __FLT_NAN);
+
+ return ret;
+ }
+
+ __real__ ret = __FLT_ABI(log) (__FLT_ABI(hypot) (__real__ z, __imag__ z));
+ __imag__ ret = __FLT_ABI(atan2) (__imag__ z, __real__ z);
+ return ret;
+}
libc/mingw/complex/clog10.c
@@ -0,0 +1,49 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#define _GNU_SOURCE
+#include "complex_internal.h"
+#include "clog10.def.h"
libc/mingw/complex/clog10.def.h
@@ -0,0 +1,71 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(clog10) (__FLT_TYPE __complex__ z)
+{
+ __complex__ __FLT_TYPE ret;
+ int r_class = fpclassify (__real__ z);
+ int i_class = fpclassify (__imag__ z);
+
+ if (r_class == FP_ZERO && i_class == FP_ZERO)
+ {
+ __imag__ ret = signbit (__real__ z) ? __FLT_PI : __FLT_CST(0.0);
+ __imag__ ret = __FLT_ABI(copysign) (__imag__ ret, __imag__ z);
+ __real__ ret = -__FLT_CST(1.0) / __FLT_ABI(fabs) (__real__ z);
+ return ret;
+ }
+
+ if (r_class == FP_NAN || i_class == FP_NAN)
+ {
+ __imag__ ret = __FLT_NAN;
+ __real__ ret = ((r_class == FP_INFINITE || i_class == FP_INFINITE) ? __FLT_HUGE_VAL : __FLT_NAN);
+
+ return ret;
+ }
+
+ __real__ ret = __FLT_ABI(log10) (__FLT_ABI(hypot) (__real__ z, __imag__ z));
+ __imag__ ret = __FLT_LOG10E * __FLT_ABI(atan2) (__imag__ z, __real__ z);
+ return ret;
+}
libc/mingw/complex/clog10f.c
@@ -0,0 +1,49 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#define _GNU_SOURCE
+#include "complex_internal.h"
+#include "clog10.def.h"
libc/mingw/complex/clog10l.c
@@ -0,0 +1,49 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#define _GNU_SOURCE
+#include "complex_internal.h"
+#include "clog10.def.h"
libc/mingw/complex/clogf.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#include "complex_internal.h"
+#include "clog.def.h"
libc/mingw/complex/clogl.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "clog.def.h"
libc/mingw/complex/complex_internal.h
@@ -0,0 +1,128 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 <math.h>
+#include <complex.h>
+
+/* Define some PI constants for long double, as they are not defined in math.h */
+#ifndef M_PI_4l
+#define M_PI_4l 0.7853981633974483096156608458198757L
+#define M_PI_2l 1.5707963267948966192313216916397514L
+#define M_PIl 3.1415926535897932384626433832795029L
+#endif
+
+/* NAN builtins for gcc, as they are not part of math.h */
+#ifndef NANF
+#define NANF __builtin_nanf ("")
+#endif
+#ifndef NANL
+#define NANL __builtin_nanl ("")
+#endif
+
+/* Some more helpers. */
+#define M_PI_3_4 (M_PI - M_PI_4)
+#define M_PI_3_4l (M_PIl - M_PI_4l)
+
+#if defined(_NEW_COMPLEX_FLOAT)
+# define __FLT_TYPE float
+# define __FLT_ABI(N) N##f
+# define __FLT_CST(N) N##F
+# define __FLT_EPSILON __FLT_EPSILON__
+# define __FLT_NAN NANF
+# define __FLT_HUGE_VAL HUGE_VALF
+# define __FLT_PI M_PI
+# define __FLT_PI_2 M_PI_2
+# define __FLT_PI_4 M_PI_4
+# define __FLT_PI_3_4 M_PI_3_4
+# define __FLT_MAXLOG 88.72283905206835F
+# define __FLT_MINLOG -103.278929903431851103F
+# define __FLT_LOGE2 0.693147180559945309F
+# define __FLT_LOG10E 0.434294481903251828F
+# define __FLT_REPORT(NAME) NAME "f"
+#elif defined(_NEW_COMPLEX_DOUBLE)
+# define __FLT_TYPE double
+# define __FLT_ABI(N) N
+# define __FLT_EPSILON __DBL_EPSILON__
+# define __FLT_CST(N) N
+# define __FLT_NAN NAN
+# define __FLT_HUGE_VAL HUGE_VAL
+# define __FLT_PI M_PI
+# define __FLT_PI_2 M_PI_2
+# define __FLT_PI_4 M_PI_4
+# define __FLT_PI_3_4 M_PI_3_4
+# define __FLT_MAXLOG 7.09782712893383996843E2
+# define __FLT_MINLOG -7.45133219101941108420E2
+# define __FLT_LOGE2 6.93147180559945309417E-1
+# define __FLT_LOG10E 4.34294481903251827651E-1
+# define __FLT_REPORT(NAME) NAME
+#elif defined(_NEW_COMPLEX_LDOUBLE)
+# define __FLT_TYPE long double
+# define __FLT_ABI(N) N##l
+# define __FLT_CST(N) N##L
+# define __FLT_EPSILON __LDBL_EPSILON__
+# define __FLT_NAN NANL
+# define __FLT_HUGE_VAL HUGE_VALL
+# define __FLT_PI M_PIl
+# define __FLT_PI_2 M_PI_2l
+# define __FLT_PI_4 M_PI_4l
+# define __FLT_PI_3_4 M_PI_3_4l
+# define __FLT_MAXLOG 1.1356523406294143949492E4L
+# define __FLT_MINLOG -1.1355137111933024058873E4L
+# define __FLT_LOGE2 6.9314718055994530941723E-1L
+# define __FLT_LOG10E 4.3429448190325182765113E-1L
+# define __FLT_REPORT(NAME) NAME "l"
+#else
+# error "Unknown complex number type"
+#endif
+
+#define __FLT_RPT_DOMAIN(NAME, ARG1, ARG2, RSLT) \
+ errno = EDOM, \
+ __mingw_raise_matherr (_DOMAIN, __FLT_REPORT(NAME), (double) (ARG1), \
+ (double) (ARG2), (double) (RSLT))
+#define __FLT_RPT_ERANGE(NAME, ARG1, ARG2, RSLT, OVL) \
+ errno = ERANGE, \
+ __mingw_raise_matherr (((OVL) ? _OVERFLOW : _UNDERFLOW), \
+ __FLT_REPORT(NAME), (double) (ARG1), \
+ (double) (ARG2), (double) (RSLT))
+
libc/mingw/complex/conj.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#include "complex_internal.h"
+#include "conj.def.h"
libc/mingw/complex/conj.def.h
@@ -0,0 +1,49 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(conj) (__FLT_TYPE __complex__ z)
+{
+ return ~z;
+}
libc/mingw/complex/conjf.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#include "complex_internal.h"
+#include "conj.def.h"
libc/mingw/complex/conjl.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "conj.def.h"
libc/mingw/complex/cpow.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#include "complex_internal.h"
+#include "cpow.def.h"
libc/mingw/complex/cpow.def.h
@@ -0,0 +1,49 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(cpow) (__FLT_TYPE __complex__ z, __FLT_TYPE __complex__ x)
+{
+ return __FLT_ABI(cexp) (x * __FLT_ABI(clog) (z));
+}
libc/mingw/complex/cpowf.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#include "complex_internal.h"
+#include "cpow.def.h"
libc/mingw/complex/cpowl.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "cpow.def.h"
libc/mingw/complex/cproj.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#include "complex_internal.h"
+#include "cproj.def.h"
libc/mingw/complex/cproj.def.h
@@ -0,0 +1,58 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(cproj) (__FLT_TYPE __complex__ z)
+{
+ __complex__ __FLT_TYPE ret;
+
+ if (isinf (__real__ z) || isinf (__imag__ z))
+ {
+ __real__ ret = INFINITY;
+ __imag__ ret = __FLT_ABI(copysign) (__FLT_CST(0.0), __imag__ z);
+ return ret;
+ }
+
+ return z;
+}
libc/mingw/complex/cprojf.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#include "complex_internal.h"
+#include "cproj.def.h"
libc/mingw/complex/cprojl.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "cproj.def.h"
libc/mingw/complex/creal.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#include "complex_internal.h"
+#include "creal.def.h"
libc/mingw/complex/creal.def.h
@@ -0,0 +1,49 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE
+__FLT_ABI(creal) (__FLT_TYPE __complex__ z)
+{
+ return __real__ z;
+}
libc/mingw/complex/crealf.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#include "complex_internal.h"
+#include "creal.def.h"
libc/mingw/complex/creall.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "creal.def.h"
libc/mingw/complex/csin.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#include "complex_internal.h"
+
+#include "csinh.def.h"
+#include "csin.def.h"
libc/mingw/complex/csin.def.h
@@ -0,0 +1,61 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(csin) (__FLT_TYPE __complex__ z)
+{
+ /* Annex G.6: csin(z) = -i csinh (iz) */
+ __complex__ __FLT_TYPE ret;
+ __complex__ __FLT_TYPE x;
+
+ __real__ x = -__imag__ z;
+ __imag__ x = __real__ z;
+
+ x = __FLT_ABI(csinh) (x);
+
+ __real__ ret = __imag__ x;
+ __imag__ ret = -__real__ x;
+
+ return ret;
+}
libc/mingw/complex/csinf.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#include "complex_internal.h"
+
+#include "csinh.def.h"
+#include "csin.def.h"
libc/mingw/complex/csinh.def.h
@@ -0,0 +1,107 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(csinh) (__FLT_TYPE __complex__ z)
+{
+ __complex__ __FLT_TYPE ret;
+ __FLT_TYPE s_x, c_x;
+ int negate = signbit (__real__ z);
+ int r_class = fpclassify (__real__ z);
+ int i_class = fpclassify (__imag__ z);
+
+ __real__ z = __FLT_ABI(fabs) (__real__ z);
+
+ if (r_class == FP_NAN)
+ {
+ __real__ ret = __FLT_NAN;
+ __imag__ ret = __imag__ z == __FLT_CST(0.0) ? __imag__ z : __FLT_NAN;
+
+ return ret;
+ }
+
+ if (r_class == FP_INFINITE)
+ {
+ if (i_class == FP_ZERO)
+ {
+ __real__ ret = negate ? -__FLT_HUGE_VAL : __FLT_HUGE_VAL;
+ __imag__ ret = __imag__ z;
+ return ret;
+ }
+
+ if (i_class == FP_NAN || i_class == FP_INFINITE)
+ {
+ __real__ ret = __FLT_HUGE_VAL;
+ __imag__ ret = __FLT_NAN + __FLT_NAN;
+
+ return ret;
+ }
+ __FLT_ABI(sincos) (__imag__ z, &s_x, &c_x);
+
+ __real__ ret = __FLT_ABI(copysign) (__FLT_HUGE_VAL, c_x);
+ __imag__ ret = __FLT_ABI(copysign) (__FLT_HUGE_VAL, s_x);
+
+ if (negate)
+ __real__ ret = -__real__ ret;
+ return ret;
+ }
+
+ if (i_class == FP_NAN || i_class == FP_INFINITE)
+ {
+ __real__ ret = (r_class == FP_ZERO
+ ? (__FLT_ABI(copysign) (__FLT_CST(0.0), negate ? -__FLT_CST(1.0) : __FLT_CST(1.0))) : __FLT_NAN);
+ __imag__ ret = (r_class == FP_ZERO ? (__FLT_NAN + __FLT_NAN) : __FLT_NAN);
+
+ return ret;
+ }
+
+ __FLT_ABI(sincos) (__imag__ z, &s_x, &c_x);
+
+ __real__ ret = __FLT_ABI(sinh) (__real__ z) * c_x;
+ __imag__ ret = __FLT_ABI(cosh) (__real__ z) * s_x;
+
+ if (negate)
+ __real__ ret = -__real__ ret;
+ return ret;
+}
libc/mingw/complex/csinl.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+
+#include "csinh.def.h"
+#include "csin.def.h"
libc/mingw/complex/csqrt.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#include "complex_internal.h"
+#include "csqrt.def.h"
libc/mingw/complex/csqrt.def.h
@@ -0,0 +1,122 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(csqrt) (__FLT_TYPE __complex__ z)
+{
+ __complex__ __FLT_TYPE ret;
+ __FLT_TYPE d, r, s;
+ int r_class = fpclassify (__real__ z);
+ int i_class = fpclassify (__imag__ z);
+
+ if (r_class == FP_INFINITE || r_class == FP_NAN || i_class == FP_INFINITE || i_class == FP_NAN)
+ {
+ if (i_class == FP_INFINITE)
+ {
+ __real__ ret = __FLT_HUGE_VAL;
+ __imag__ ret = __imag__ z;
+ return ret;
+ }
+
+ if (r_class == FP_INFINITE)
+ {
+ if (__real__ z < __FLT_CST(0.0))
+ {
+ __real__ ret = i_class == FP_NAN ? __FLT_NAN : __FLT_CST(0.0);
+ __imag__ ret = __FLT_ABI(copysign) (__FLT_HUGE_VAL, __imag__ z);
+ return ret;
+ }
+
+ __real__ ret = __real__ z;
+ __imag__ ret = (i_class == FP_NAN
+ ? __FLT_NAN : __FLT_ABI(copysign) (__FLT_CST(0.0), __imag__ z));
+ return ret;
+ }
+
+ __real__ ret = __FLT_NAN;
+ __imag__ ret = __FLT_NAN;
+ return ret;
+ }
+
+ if (i_class == FP_ZERO)
+ {
+ if (__real__ z < __FLT_CST(0.0))
+ {
+ __real__ ret = __FLT_CST(0.0);
+ __imag__ ret = __FLT_ABI(copysign) (__FLT_ABI(sqrt) (-__real__ z), __imag__ z);
+ }
+ else
+ {
+ __real__ ret = __FLT_ABI(fabs) (__FLT_ABI(sqrt) (__real__ z));
+ __imag__ ret = __FLT_ABI(copysign) (__FLT_CST(0.0), __imag__ z);
+ }
+ return ret;
+ }
+
+ if (r_class == FP_ZERO)
+ {
+ r = __FLT_ABI(sqrt) (__FLT_CST(0.5) * __FLT_ABI(fabs) (__imag__ z));
+
+ __real__ ret = r;
+ __imag__ ret = __FLT_ABI(copysign) (r, __imag__ z);
+ return ret;
+ }
+
+ d = __FLT_ABI(hypot) (__real__ z, __imag__ z);
+ if (__real__ z > __FLT_CST(0.0))
+ {
+ r = __FLT_ABI(sqrt) (__FLT_CST(0.5) * d + __FLT_CST(0.5) * __real__ z);
+ s = (__FLT_CST(0.5) * __imag__ z) / r;
+ }
+ else
+ {
+ s = __FLT_ABI(sqrt) (__FLT_CST(0.5) * d - __FLT_CST(0.5) * __real__ z);
+ r = __FLT_ABI(fabs) ((__FLT_CST(0.5) * __imag__ z) / s);
+ }
+
+ __real__ ret = r;
+ __imag__ ret = __FLT_ABI(copysign) (s, __imag__ z);
+
+ return ret;
+}
libc/mingw/complex/csqrtf.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#include "complex_internal.h"
+#include "csqrt.def.h"
libc/mingw/complex/csqrtl.c
@@ -0,0 +1,48 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+#include "csqrt.def.h"
libc/mingw/complex/ctan.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* double version of the functions. */
+#define _NEW_COMPLEX_DOUBLE 1
+#include "complex_internal.h"
+
+#include "ctanh.def.h"
+#include "ctan.def.h"
libc/mingw/complex/ctan.def.h
@@ -0,0 +1,61 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(ctan) (__FLT_TYPE __complex__ z)
+{
+ /* Annex G.6: ctan(z) = -i ctanh (iz) */
+ __complex__ __FLT_TYPE ret;
+ __complex__ __FLT_TYPE x;
+
+ __real__ x = -__imag__ z;
+ __imag__ x = __real__ z;
+
+ x = __FLT_ABI(ctanh) (x);
+
+ __real__ ret = __imag__ x;
+ __imag__ ret = -__real__ x;
+
+ return ret;
+}
libc/mingw/complex/ctanf.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* Float version of the functions. */
+#define _NEW_COMPLEX_FLOAT 1
+#include "complex_internal.h"
+
+#include "ctanh.def.h"
+#include "ctan.def.h"
libc/mingw/complex/ctanh.def.h
@@ -0,0 +1,94 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+__FLT_TYPE __complex__ __cdecl
+__FLT_ABI(ctanh) (__FLT_TYPE __complex__ z)
+{
+ __complex__ __FLT_TYPE ret;
+ __FLT_TYPE s, c, d;
+
+ if (!isfinite (__real__ z) || !isfinite (__imag__ z))
+ {
+ if (isinf (__real__ z))
+ {
+ __real__ ret = __FLT_ABI(copysign) (__FLT_CST(1.0), __real__ z);
+
+ /* fmod will return NaN if __imag__ z is infinity. This is actually
+ OK, because imaginary infinity returns a + or - zero (unspecified).
+ For +x, sin (x) is negative if fmod (x, 2pi) > pi.
+ For -x, sin (x) is positive if fmod (x, 2pi) < pi.
+ We use epsilon to ensure that the zeros are detected properly with
+ float and long double comparisons. */
+ s = __FLT_ABI(fmod) (__imag__ z, __FLT_PI);
+ if (signbit (__imag__ z))
+ __imag__ ret = s + __FLT_PI_2 < -__FLT_EPSILON ? 0.0 : -0.0;
+ else
+ __imag__ ret = s - __FLT_PI_2 > __FLT_EPSILON ? -0.0 : 0.0;
+ return ret;
+ }
+
+ if (__imag__ z == __FLT_CST(0.0))
+ return z;
+
+ __real__ ret = __FLT_NAN;
+ __imag__ ret = __FLT_NAN;
+ return ret;
+ }
+
+ __FLT_ABI(sincos) (__FLT_CST(2.0) * __imag__ z, &s, &c);
+
+ d = (__FLT_ABI(cosh) (__FLT_CST(2.0) * __real__ z) + c);
+
+ if (d == __FLT_CST(0.0))
+ {
+ __complex__ __FLT_TYPE ez = __FLT_ABI(cexp) (z);
+ __complex__ __FLT_TYPE emz = __FLT_ABI(cexp) (-z);
+
+ return (ez - emz) / (ez + emz);
+ }
+
+ __real__ ret = __FLT_ABI(sinh) (__FLT_CST(2.0) * __real__ z) / d;
+ __imag__ ret = s / d;
+ return ret;
+}
libc/mingw/complex/ctanl.c
@@ -0,0 +1,50 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* long double version of the functions. */
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "complex_internal.h"
+
+#include "ctanh.def.h"
+#include "ctan.def.h"
libc/mingw/crt/dllentry.c
@@ -0,0 +1,18 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <oscalls.h>
+#define _DECL_DLLMAIN
+#include <process.h>
+
+BOOL WINAPI DllEntryPoint (HANDLE, DWORD, LPVOID);
+
+BOOL WINAPI DllEntryPoint (HANDLE __UNUSED_PARAM(hDllHandle),
+ DWORD __UNUSED_PARAM(dwReason),
+ LPVOID __UNUSED_PARAM(lpreserved))
+{
+ return TRUE;
+}
libc/mingw/crt/dllmain.c
@@ -0,0 +1,10 @@
+#include <oscalls.h>
+#define _DECL_DLLMAIN
+#include <process.h>
+
+BOOL WINAPI DllMain (HANDLE __UNUSED_PARAM(hDllHandle),
+ DWORD __UNUSED_PARAM(dwReason),
+ LPVOID __UNUSED_PARAM(lpreserved))
+{
+ return TRUE;
+}
libc/mingw/gdtoa/arithchk.c
@@ -0,0 +1,186 @@
+/****************************************************************
+Copyright (C) 1997, 1998 Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+****************************************************************/
+
+/* Try to deduce arith.h from arithmetic properties. */
+#ifdef MINGW_BUILD_GEN
+
+#include <stdio.h>
+
+ static int dalign;
+ typedef struct
+Akind {
+ char *name;
+ int kind;
+ } Akind;
+
+ static Akind
+IEEE_8087 = { "IEEE_8087", 1 },
+IEEE_MC68k = { "IEEE_MC68k", 2 },
+IBM = { "IBM", 3 },
+VAX = { "VAX", 4 },
+CRAY = { "CRAY", 5};
+
+ static Akind *
+Lcheck()
+{
+ union {
+ double d;
+ long L[2];
+ } u;
+ struct {
+ double d;
+ long L;
+ } x[2];
+
+ if (sizeof(x) > 2*(sizeof(double) + sizeof(long)))
+ dalign = 1;
+ u.L[0] = u.L[1] = 0;
+ u.d = 1e13;
+ if (u.L[0] == 1117925532 && u.L[1] == -448790528)
+ return &IEEE_MC68k;
+ if (u.L[1] == 1117925532 && u.L[0] == -448790528)
+ return &IEEE_8087;
+ if (u.L[0] == -2065213935 && u.L[1] == 10752)
+ return &VAX;
+ if (u.L[0] == 1267827943 && u.L[1] == 704643072)
+ return &IBM;
+ return 0;
+ }
+
+ static Akind *
+icheck()
+{
+ union {
+ double d;
+ int L[2];
+ } u;
+ struct {
+ double d;
+ int L;
+ } x[2];
+
+ if (sizeof(x) > 2*(sizeof(double) + sizeof(int)))
+ dalign = 1;
+ u.L[0] = u.L[1] = 0;
+ u.d = 1e13;
+ if (u.L[0] == 1117925532 && u.L[1] == -448790528)
+ return &IEEE_MC68k;
+ if (u.L[1] == 1117925532 && u.L[0] == -448790528)
+ return &IEEE_8087;
+ if (u.L[0] == -2065213935 && u.L[1] == 10752)
+ return &VAX;
+ if (u.L[0] == 1267827943 && u.L[1] == 704643072)
+ return &IBM;
+ return 0;
+ }
+
+char *emptyfmt = ""; /* avoid possible warning message with printf("") */
+
+ static Akind *
+ccheck()
+{
+ union {
+ double d;
+ long L;
+ } u;
+ long Cray1;
+
+ /* Cray1 = 4617762693716115456 -- without overflow on non-Crays */
+ Cray1 = printf(emptyfmt) < 0 ? 0 : 4617762;
+ if (printf(emptyfmt, Cray1) >= 0)
+ Cray1 = 1000000*Cray1 + 693716;
+ if (printf(emptyfmt, Cray1) >= 0)
+ Cray1 = 1000000*Cray1 + 115456;
+ u.d = 1e13;
+ if (u.L == Cray1)
+ return &CRAY;
+ return 0;
+ }
+
+ static int
+fzcheck()
+{
+ double a, b;
+ int i;
+
+ a = 1.;
+ b = .1;
+ for(i = 155;; b *= b, i >>= 1) {
+ if (i & 1) {
+ a *= b;
+ if (i == 1)
+ break;
+ }
+ }
+ b = a * a;
+ return b == 0.;
+ }
+
+ int
+main()
+{
+ Akind *a = 0;
+ int Ldef = 0;
+ FILE *f;
+
+#ifdef WRITE_ARITH_H /* for Symantec's buggy "make" */
+ f = fopen("arith.h", "w");
+ if (!f) {
+ printf("Cannot open arith.h\n");
+ return 1;
+ }
+#else
+ f = stdout;
+#endif
+
+ if (sizeof(double) == 2*sizeof(long))
+ a = Lcheck();
+ else if (sizeof(double) == 2*sizeof(int)) {
+ Ldef = 1;
+ a = icheck();
+ }
+ else if (sizeof(double) == sizeof(long))
+ a = ccheck();
+ if (a) {
+ fprintf(f, "#define %s\n#define Arith_Kind_ASL %d\n",
+ a->name, a->kind);
+ if (Ldef)
+ fprintf(f, "#define Long int\n#define Intcast (int)(long)\n");
+ if (dalign)
+ fprintf(f, "#define Double_Align\n");
+ if (sizeof(char*) == 8)
+ fprintf(f, "#define X64_bit_pointers\n");
+#ifndef NO_LONG_LONG
+ if (sizeof(long long) < 8)
+#endif
+ fprintf(f, "#define NO_LONG_LONG\n");
+ if (a->kind <= 2 && fzcheck())
+ fprintf(f, "#define Sudden_Underflow\n");
+ return 0;
+ }
+ fprintf(f, "/* Unknown arithmetic */\n");
+ return 1;
+ }
+#endif /* MINGW_BUILD_GEN */
+
libc/mingw/gdtoa/dmisc.c
@@ -0,0 +1,196 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+#ifndef MULTIPLE_THREADS
+char *dtoa_result;
+#endif
+
+char *rv_alloc (int i)
+{
+ int j, k, *r;
+
+ j = sizeof(ULong);
+ for(k = 0;
+ (int) (sizeof(Bigint) - sizeof(ULong) - sizeof(int)) + j <= i;
+ j <<= 1)
+ k++;
+ r = (int*)Balloc(k);
+ *r = k;
+ return
+#ifndef MULTIPLE_THREADS
+ dtoa_result =
+#endif
+ (char *)(r+1);
+}
+
+char *nrv_alloc (char *s, char **rve, int n)
+{
+ char *rv, *t;
+
+ t = rv = rv_alloc(n);
+ while((*t = *s++) !=0)
+ t++;
+ if (rve)
+ *rve = t;
+ return rv;
+}
+
+/* freedtoa(s) must be used to free values s returned by dtoa
+ * when MULTIPLE_THREADS is #defined. It should be used in all cases,
+ * but for consistency with earlier versions of dtoa, it is optional
+ * when MULTIPLE_THREADS is not defined.
+ */
+
+void __freedtoa (char *s)
+{
+ Bigint *b = (Bigint *)((int *)s - 1);
+ b->maxwds = 1 << (b->k = *(int*)b);
+ Bfree(b);
+#ifndef MULTIPLE_THREADS
+ if (s == dtoa_result)
+ dtoa_result = 0;
+#endif
+}
+
+int quorem (Bigint *b, Bigint *S)
+{
+ int n;
+ ULong *bx, *bxe, q, *sx, *sxe;
+#ifdef ULLong
+ ULLong borrow, carry, y, ys;
+#else
+ ULong borrow, carry, y, ys;
+#ifdef Pack_32
+ ULong si, z, zs;
+#endif
+#endif
+
+ n = S->wds;
+#ifdef DEBUG
+ /*debug*/ if (b->wds > n)
+ /*debug*/ Bug("oversize b in quorem");
+#endif
+ if (b->wds < n)
+ return 0;
+ sx = S->x;
+ sxe = sx + --n;
+ bx = b->x;
+ bxe = bx + n;
+ q = *bxe / (*sxe + 1); /* ensure q <= true quotient */
+#ifdef DEBUG
+ /*debug*/ if (q > 9)
+ /*debug*/ Bug("oversized quotient in quorem");
+#endif
+ if (q) {
+ borrow = 0;
+ carry = 0;
+ do {
+#ifdef ULLong
+ ys = *sx++ * (ULLong)q + carry;
+ carry = ys >> 32;
+ y = *bx - (ys & 0xffffffffUL) - borrow;
+ borrow = y >> 32 & 1UL;
+ *bx++ = y & 0xffffffffUL;
+#else
+#ifdef Pack_32
+ si = *sx++;
+ ys = (si & 0xffff) * q + carry;
+ zs = (si >> 16) * q + (ys >> 16);
+ carry = zs >> 16;
+ y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
+ borrow = (y & 0x10000) >> 16;
+ z = (*bx >> 16) - (zs & 0xffff) - borrow;
+ borrow = (z & 0x10000) >> 16;
+ Storeinc(bx, z, y);
+#else
+ ys = *sx++ * q + carry;
+ carry = ys >> 16;
+ y = *bx - (ys & 0xffff) - borrow;
+ borrow = (y & 0x10000) >> 16;
+ *bx++ = y & 0xffff;
+#endif
+#endif
+ } while(sx <= sxe);
+
+ if (!*bxe) {
+ bx = b->x;
+ while(--bxe > bx && !*bxe)
+ --n;
+ b->wds = n;
+ }
+ }
+
+ if (cmp(b, S) >= 0) {
+ q++;
+ borrow = 0;
+ carry = 0;
+ bx = b->x;
+ sx = S->x;
+ do {
+#ifdef ULLong
+ ys = *sx++ + carry;
+ carry = ys >> 32;
+ y = *bx - (ys & 0xffffffffUL) - borrow;
+ borrow = y >> 32 & 1UL;
+ *bx++ = y & 0xffffffffUL;
+#else
+#ifdef Pack_32
+ si = *sx++;
+ ys = (si & 0xffff) + carry;
+ zs = (si >> 16) + (ys >> 16);
+ carry = zs >> 16;
+ y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
+ borrow = (y & 0x10000) >> 16;
+ z = (*bx >> 16) - (zs & 0xffff) - borrow;
+ borrow = (z & 0x10000) >> 16;
+ Storeinc(bx, z, y);
+#else
+ ys = *sx++ + carry;
+ carry = ys >> 16;
+ y = *bx - (ys & 0xffff) - borrow;
+ borrow = (y & 0x10000) >> 16;
+ *bx++ = y & 0xffff;
+#endif
+#endif
+ } while(sx <= sxe);
+
+ bx = b->x;
+ bxe = bx + n;
+ if (!*bxe) {
+ while(--bxe > bx && !*bxe)
+ --n;
+ b->wds = n;
+ }
+ }
+ return q;
+}
libc/mingw/gdtoa/dtoa.c
@@ -0,0 +1,750 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998, 1999 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
+ *
+ * Inspired by "How to Print Floating-Point Numbers Accurately" by
+ * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
+ *
+ * Modifications:
+ * 1. Rather than iterating, we use a simple numeric overestimate
+ * to determine k = floor(log10(d)). We scale relevant
+ * quantities using O(log2(k)) rather than O(k) multiplications.
+ * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
+ * try to generate digits strictly left to right. Instead, we
+ * compute with fewer bits and propagate the carry if necessary
+ * when rounding the final digit up. This is often faster.
+ * 3. Under the assumption that input will be rounded nearest,
+ * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
+ * That is, we allow equality in stopping tests when the
+ * round-nearest rule will give the same floating-point value
+ * as would satisfaction of the stopping test with strict
+ * inequality.
+ * 4. We remove common factors of powers of 2 from relevant
+ * quantities.
+ * 5. When converting floating-point integers less than 1e16,
+ * we use floating-point arithmetic rather than resorting
+ * to multiple-precision integers.
+ * 6. When asked to produce fewer than 15 digits, we first try
+ * to get by with floating-point arithmetic; we resort to
+ * multiple-precision integer arithmetic only if we cannot
+ * guarantee that the floating-point calculation has given
+ * the correctly rounded result. For k requested digits and
+ * "uniformly" distributed input, the probability is
+ * something like 10^(k-15) that we must resort to the Long
+ * calculation.
+ */
+
+#ifdef Honor_FLT_ROUNDS
+#undef Check_FLT_ROUNDS
+#define Check_FLT_ROUNDS
+#else
+#define Rounding Flt_Rounds
+#endif
+
+char *__dtoa (double d0, int mode, int ndigits, int *decpt, int *sign, char **rve)
+{
+ /* Arguments ndigits, decpt, sign are similar to those
+ of ecvt and fcvt; trailing zeros are suppressed from
+ the returned string. If not null, *rve is set to point
+ to the end of the return value. If d is +-Infinity or NaN,
+ then *decpt is set to 9999.
+
+ mode:
+ 0 ==> shortest string that yields d when read in
+ and rounded to nearest.
+ 1 ==> like 0, but with Steele & White stopping rule;
+ e.g. with IEEE P754 arithmetic , mode 0 gives
+ 1e23 whereas mode 1 gives 9.999999999999999e22.
+ 2 ==> max(1,ndigits) significant digits. This gives a
+ return value similar to that of ecvt, except
+ that trailing zeros are suppressed.
+ 3 ==> through ndigits past the decimal point. This
+ gives a return value similar to that from fcvt,
+ except that trailing zeros are suppressed, and
+ ndigits can be negative.
+ 4,5 ==> similar to 2 and 3, respectively, but (in
+ round-nearest mode) with the tests of mode 0 to
+ possibly return a shorter string that rounds to d.
+ With IEEE arithmetic and compilation with
+ -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same
+ as modes 2 and 3 when FLT_ROUNDS != 1.
+ 6-9 ==> Debugging modes similar to mode - 4: don't try
+ fast floating-point estimate (if applicable).
+
+ Values of mode other than 0-9 are treated as mode 0.
+
+ Sufficient space is allocated to the return value
+ to hold the suppressed trailing zeros.
+ */
+
+ int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,
+ j, j2, k, k0, k_check, leftright, m2, m5, s2, s5,
+ spec_case, try_quick;
+ Long L;
+#ifndef Sudden_Underflow
+ int denorm;
+ ULong x;
+#endif
+ Bigint *b, *b1, *delta, *mlo, *mhi, *S;
+ union _dbl_union d, d2, eps;
+ double ds;
+ char *s, *s0;
+#ifdef SET_INEXACT
+ int inexact, oldinexact;
+#endif
+#ifdef Honor_FLT_ROUNDS /*{*/
+ int Rounding;
+#ifdef Trust_FLT_ROUNDS /*{{ only define this if FLT_ROUNDS really works! */
+ Rounding = Flt_Rounds;
+#else /*}{*/
+ Rounding = 1;
+ switch(fegetround()) {
+ case FE_TOWARDZERO: Rounding = 0; break;
+ case FE_UPWARD: Rounding = 2; break;
+ case FE_DOWNWARD: Rounding = 3;
+ }
+#endif /*}}*/
+#endif /*}*/
+
+#ifndef MULTIPLE_THREADS
+ if (dtoa_result) {
+ __freedtoa(dtoa_result);
+ dtoa_result = 0;
+ }
+#endif
+ d.d = d0;
+ if (word0(&d) & Sign_bit) {
+ /* set sign for everything, including 0's and NaNs */
+ *sign = 1;
+ word0(&d) &= ~Sign_bit; /* clear sign bit */
+ }
+ else
+ *sign = 0;
+
+ if ((word0(&d) & Exp_mask) == Exp_mask)
+ {
+ /* Infinity or NaN */
+ *decpt = 9999;
+ if (!word1(&d) && !(word0(&d) & 0xfffff))
+ return nrv_alloc("Infinity", rve, 8);
+ return nrv_alloc("NaN", rve, 3);
+ }
+ if (!dval(&d)) {
+ *decpt = 1;
+ return nrv_alloc("0", rve, 1);
+ }
+
+#ifdef SET_INEXACT
+ try_quick = oldinexact = get_inexact();
+ inexact = 1;
+#endif
+#ifdef Honor_FLT_ROUNDS
+ if (Rounding >= 2) {
+ if (*sign)
+ Rounding = Rounding == 2 ? 0 : 2;
+ else
+ if (Rounding != 2)
+ Rounding = 0;
+ }
+#endif
+
+ b = d2b(dval(&d), &be, &bbits);
+#ifdef Sudden_Underflow
+ i = (int)(word0(&d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
+#else
+ if (( i = (int)(word0(&d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)) )!=0) {
+#endif
+ dval(&d2) = dval(&d);
+ word0(&d2) &= Frac_mask1;
+ word0(&d2) |= Exp_11;
+
+ /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
+ * log10(x) = log(x) / log(10)
+ * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
+ * log10(&d) = (i-Bias)*log(2)/log(10) + log10(&d2)
+ *
+ * This suggests computing an approximation k to log10(&d) by
+ *
+ * k = (i - Bias)*0.301029995663981
+ * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
+ *
+ * We want k to be too large rather than too small.
+ * The error in the first-order Taylor series approximation
+ * is in our favor, so we just round up the constant enough
+ * to compensate for any error in the multiplication of
+ * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
+ * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
+ * adding 1e-13 to the constant term more than suffices.
+ * Hence we adjust the constant term to 0.1760912590558.
+ * (We could get a more accurate k by invoking log10,
+ * but this is probably not worthwhile.)
+ */
+
+ i -= Bias;
+#ifndef Sudden_Underflow
+ denorm = 0;
+ }
+ else {
+ /* d is denormalized */
+
+ i = bbits + be + (Bias + (P-1) - 1);
+ x = i > 32 ? word0(&d) << (64 - i) | word1(&d) >> (i - 32)
+ : word1(&d) << (32 - i);
+ dval(&d2) = x;
+ word0(&d2) -= 31*Exp_msk1; /* adjust exponent */
+ i -= (Bias + (P-1) - 1) + 1;
+ denorm = 1;
+ }
+#endif
+ ds = (dval(&d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
+ k = (int)ds;
+ if (ds < 0. && ds != k)
+ k--; /* want k = floor(ds) */
+ k_check = 1;
+ if (k >= 0 && k <= Ten_pmax) {
+ if (dval(&d) < tens[k])
+ k--;
+ k_check = 0;
+ }
+ j = bbits - i - 1;
+ if (j >= 0) {
+ b2 = 0;
+ s2 = j;
+ }
+ else {
+ b2 = -j;
+ s2 = 0;
+ }
+ if (k >= 0) {
+ b5 = 0;
+ s5 = k;
+ s2 += k;
+ }
+ else {
+ b2 -= k;
+ b5 = -k;
+ s5 = 0;
+ }
+ if (mode < 0 || mode > 9)
+ mode = 0;
+
+#ifndef SET_INEXACT
+#ifdef Check_FLT_ROUNDS
+ try_quick = Rounding == 1;
+#else
+ try_quick = 1;
+#endif
+#endif /*SET_INEXACT*/
+
+ if (mode > 5) {
+ mode -= 4;
+ try_quick = 0;
+ }
+ leftright = 1;
+ ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */
+ /* silence erroneous "gcc -Wall" warning. */
+ switch(mode) {
+ case 0:
+ case 1:
+ i = 18;
+ ndigits = 0;
+ break;
+ case 2:
+ leftright = 0;
+ /* no break */
+ case 4:
+ if (ndigits <= 0)
+ ndigits = 1;
+ ilim = ilim1 = i = ndigits;
+ break;
+ case 3:
+ leftright = 0;
+ /* no break */
+ case 5:
+ i = ndigits + k + 1;
+ ilim = i;
+ ilim1 = i - 1;
+ if (i <= 0)
+ i = 1;
+ }
+ s = s0 = rv_alloc(i);
+
+#ifdef Honor_FLT_ROUNDS
+ if (mode > 1 && Rounding != 1)
+ leftright = 0;
+#endif
+
+ if (ilim >= 0 && ilim <= Quick_max && try_quick) {
+
+ /* Try to get by with floating-point arithmetic. */
+
+ i = 0;
+ dval(&d2) = dval(&d);
+ k0 = k;
+ ilim0 = ilim;
+ ieps = 2; /* conservative */
+ if (k > 0) {
+ ds = tens[k&0xf];
+ j = k >> 4;
+ if (j & Bletch) {
+ /* prevent overflows */
+ j &= Bletch - 1;
+ dval(&d) /= bigtens[n_bigtens-1];
+ ieps++;
+ }
+ for(; j; j >>= 1, i++)
+ if (j & 1) {
+ ieps++;
+ ds *= bigtens[i];
+ }
+ dval(&d) /= ds;
+ }
+ else if (( j2 = -k )!=0) {
+ dval(&d) *= tens[j2 & 0xf];
+ for(j = j2 >> 4; j; j >>= 1, i++)
+ if (j & 1) {
+ ieps++;
+ dval(&d) *= bigtens[i];
+ }
+ }
+ if (k_check && dval(&d) < 1. && ilim > 0) {
+ if (ilim1 <= 0)
+ goto fast_failed;
+ ilim = ilim1;
+ k--;
+ dval(&d) *= 10.;
+ ieps++;
+ }
+ dval(&eps) = ieps*dval(&d) + 7.;
+ word0(&eps) -= (P-1)*Exp_msk1;
+ if (ilim == 0) {
+ S = mhi = 0;
+ dval(&d) -= 5.;
+ if (dval(&d) > dval(&eps))
+ goto one_digit;
+ if (dval(&d) < -dval(&eps))
+ goto no_digits;
+ goto fast_failed;
+ }
+#ifndef No_leftright
+ if (leftright) {
+ /* Use Steele & White method of only
+ * generating digits needed.
+ */
+ dval(&eps) = 0.5/tens[ilim-1] - dval(&eps);
+ for(i = 0;;) {
+ L = dval(&d);
+ dval(&d) -= L;
+ *s++ = '0' + (int)L;
+ if (dval(&d) < dval(&eps))
+ goto ret1;
+ if (1. - dval(&d) < dval(&eps))
+ goto bump_up;
+ if (++i >= ilim)
+ break;
+ dval(&eps) *= 10.;
+ dval(&d) *= 10.;
+ }
+ }
+ else {
+#endif
+ /* Generate ilim digits, then fix them up. */
+ dval(&eps) *= tens[ilim-1];
+ for(i = 1;; i++, dval(&d) *= 10.) {
+ L = (Long)(dval(&d));
+ if (!(dval(&d) -= L))
+ ilim = i;
+ *s++ = '0' + (int)L;
+ if (i == ilim) {
+ if (dval(&d) > 0.5 + dval(&eps))
+ goto bump_up;
+ else if (dval(&d) < 0.5 - dval(&eps)) {
+ while(*--s == '0');
+ s++;
+ goto ret1;
+ }
+ break;
+ }
+ }
+#ifndef No_leftright
+ }
+#endif
+ fast_failed:
+ s = s0;
+ dval(&d) = dval(&d2);
+ k = k0;
+ ilim = ilim0;
+ }
+
+ /* Do we have a "small" integer? */
+
+ if (be >= 0 && k <= Int_max) {
+ /* Yes. */
+ ds = tens[k];
+ if (ndigits < 0 && ilim <= 0) {
+ S = mhi = 0;
+ if (ilim < 0 || dval(&d) <= 5*ds)
+ goto no_digits;
+ goto one_digit;
+ }
+ for(i = 1;; i++, dval(&d) *= 10.) {
+ L = (Long)(dval(&d) / ds);
+ dval(&d) -= L*ds;
+#ifdef Check_FLT_ROUNDS
+ /* If FLT_ROUNDS == 2, L will usually be high by 1 */
+ if (dval(&d) < 0) {
+ L--;
+ dval(&d) += ds;
+ }
+#endif
+ *s++ = '0' + (int)L;
+ if (!dval(&d)) {
+#ifdef SET_INEXACT
+ inexact = 0;
+#endif
+ break;
+ }
+ if (i == ilim) {
+#ifdef Honor_FLT_ROUNDS
+ if (mode > 1)
+ switch(Rounding) {
+ case 0: goto ret1;
+ case 2: goto bump_up;
+ }
+#endif
+ dval(&d) += dval(&d);
+#ifdef ROUND_BIASED
+ if (dval(&d) >= ds)
+#else
+ if (dval(&d) > ds || (dval(&d) == ds && L & 1))
+#endif
+ {
+ bump_up:
+ while(*--s == '9')
+ if (s == s0) {
+ k++;
+ *s = '0';
+ break;
+ }
+ ++*s++;
+ }
+ break;
+ }
+ }
+ goto ret1;
+ }
+
+ m2 = b2;
+ m5 = b5;
+ mhi = mlo = 0;
+ if (leftright) {
+ i =
+#ifndef Sudden_Underflow
+ denorm ? be + (Bias + (P-1) - 1 + 1) :
+#endif
+ 1 + P - bbits;
+ b2 += i;
+ s2 += i;
+ mhi = i2b(1);
+ }
+ if (m2 > 0 && s2 > 0) {
+ i = m2 < s2 ? m2 : s2;
+ b2 -= i;
+ m2 -= i;
+ s2 -= i;
+ }
+ if (b5 > 0) {
+ if (leftright) {
+ if (m5 > 0) {
+ mhi = pow5mult(mhi, m5);
+ b1 = mult(mhi, b);
+ Bfree(b);
+ b = b1;
+ }
+ if (( j = b5 - m5 )!=0)
+ b = pow5mult(b, j);
+ }
+ else
+ b = pow5mult(b, b5);
+ }
+ S = i2b(1);
+ if (s5 > 0)
+ S = pow5mult(S, s5);
+
+ /* Check for special case that d is a normalized power of 2. */
+
+ spec_case = 0;
+ if ((mode < 2 || leftright)
+#ifdef Honor_FLT_ROUNDS
+ && Rounding == 1
+#endif
+ ) {
+ if (!word1(&d) && !(word0(&d) & Bndry_mask)
+#ifndef Sudden_Underflow
+ && word0(&d) & (Exp_mask & ~Exp_msk1)
+#endif
+ ) {
+ /* The special case */
+ b2 += Log2P;
+ s2 += Log2P;
+ spec_case = 1;
+ }
+ }
+
+ /* Arrange for convenient computation of quotients:
+ * shift left if necessary so divisor has 4 leading 0 bits.
+ *
+ * Perhaps we should just compute leading 28 bits of S once
+ * and for all and pass them and a shift to quorem, so it
+ * can do shifts and ors to compute the numerator for q.
+ */
+#ifdef Pack_32
+ if (( i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f )!=0)
+ i = 32 - i;
+#else
+ if (( i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf )!=0)
+ i = 16 - i;
+#endif
+ if (i > 4) {
+ i -= 4;
+ b2 += i;
+ m2 += i;
+ s2 += i;
+ }
+ else if (i < 4) {
+ i += 28;
+ b2 += i;
+ m2 += i;
+ s2 += i;
+ }
+ if (b2 > 0)
+ b = lshift(b, b2);
+ if (s2 > 0)
+ S = lshift(S, s2);
+ if (k_check) {
+ if (cmp(b,S) < 0) {
+ k--;
+ b = multadd(b, 10, 0); /* we botched the k estimate */
+ if (leftright)
+ mhi = multadd(mhi, 10, 0);
+ ilim = ilim1;
+ }
+ }
+ if (ilim <= 0 && (mode == 3 || mode == 5)) {
+ if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) {
+ /* no digits, fcvt style */
+ no_digits:
+ k = -1 - ndigits;
+ goto ret;
+ }
+ one_digit:
+ *s++ = '1';
+ k++;
+ goto ret;
+ }
+ if (leftright) {
+ if (m2 > 0)
+ mhi = lshift(mhi, m2);
+
+ /* Compute mlo -- check for special case
+ * that d is a normalized power of 2.
+ */
+
+ mlo = mhi;
+ if (spec_case) {
+ mhi = Balloc(mhi->k);
+ Bcopy(mhi, mlo);
+ mhi = lshift(mhi, Log2P);
+ }
+
+ for(i = 1;;i++) {
+ dig = quorem(b,S) + '0';
+ /* Do we yet have the shortest decimal string
+ * that will round to d?
+ */
+ j = cmp(b, mlo);
+ delta = diff(S, mhi);
+ j2 = delta->sign ? 1 : cmp(b, delta);
+ Bfree(delta);
+#ifndef ROUND_BIASED
+ if (j2 == 0 && mode != 1 && !(word1(&d) & 1)
+#ifdef Honor_FLT_ROUNDS
+ && Rounding >= 1
+#endif
+ ) {
+ if (dig == '9')
+ goto round_9_up;
+ if (j > 0)
+ dig++;
+#ifdef SET_INEXACT
+ else if (!b->x[0] && b->wds <= 1)
+ inexact = 0;
+#endif
+ *s++ = dig;
+ goto ret;
+ }
+#endif
+ if (j < 0 || (j == 0 && mode != 1
+#ifndef ROUND_BIASED
+ && !(word1(&d) & 1)
+#endif
+ )) {
+ if (!b->x[0] && b->wds <= 1) {
+#ifdef SET_INEXACT
+ inexact = 0;
+#endif
+ goto accept_dig;
+ }
+#ifdef Honor_FLT_ROUNDS
+ if (mode > 1)
+ switch(Rounding) {
+ case 0: goto accept_dig;
+ case 2: goto keep_dig;
+ }
+#endif /*Honor_FLT_ROUNDS*/
+ if (j2 > 0) {
+ b = lshift(b, 1);
+ j2 = cmp(b, S);
+#ifdef ROUND_BIASED
+ if (j2 >= 0 /*)*/
+#else
+ if ((j2 > 0 || (j2 == 0 && dig & 1))
+#endif
+ && dig++ == '9')
+ goto round_9_up;
+ }
+ accept_dig:
+ *s++ = dig;
+ goto ret;
+ }
+ if (j2 > 0) {
+#ifdef Honor_FLT_ROUNDS
+ if (!Rounding)
+ goto accept_dig;
+#endif
+ if (dig == '9') { /* possible if i == 1 */
+ round_9_up:
+ *s++ = '9';
+ goto roundoff;
+ }
+ *s++ = dig + 1;
+ goto ret;
+ }
+#ifdef Honor_FLT_ROUNDS
+ keep_dig:
+#endif
+ *s++ = dig;
+ if (i == ilim)
+ break;
+ b = multadd(b, 10, 0);
+ if (mlo == mhi)
+ mlo = mhi = multadd(mhi, 10, 0);
+ else {
+ mlo = multadd(mlo, 10, 0);
+ mhi = multadd(mhi, 10, 0);
+ }
+ }
+ }
+ else
+ for(i = 1;; i++) {
+ *s++ = dig = quorem(b,S) + '0';
+ if (!b->x[0] && b->wds <= 1) {
+#ifdef SET_INEXACT
+ inexact = 0;
+#endif
+ goto ret;
+ }
+ if (i >= ilim)
+ break;
+ b = multadd(b, 10, 0);
+ }
+
+ /* Round off last digit */
+
+#ifdef Honor_FLT_ROUNDS
+ switch(Rounding) {
+ case 0: goto trimzeros;
+ case 2: goto roundoff;
+ }
+#endif
+ b = lshift(b, 1);
+ j = cmp(b, S);
+#ifdef ROUND_BIASED
+ if (j >= 0)
+#else
+ if (j > 0 || (j == 0 && dig & 1))
+#endif
+ {
+ roundoff:
+ while(*--s == '9')
+ if (s == s0) {
+ k++;
+ *s++ = '1';
+ goto ret;
+ }
+ ++*s++;
+ }
+ else {
+#ifdef Honor_FLT_ROUNDS
+ trimzeros:
+#endif
+ while(*--s == '0');
+ s++;
+ }
+ ret:
+ Bfree(S);
+ if (mhi) {
+ if (mlo && mlo != mhi)
+ Bfree(mlo);
+ Bfree(mhi);
+ }
+ ret1:
+#ifdef SET_INEXACT
+ if (inexact) {
+ if (!oldinexact) {
+ word0(&d) = Exp_1 + (70 << Exp_shift);
+ word1(&d) = 0;
+ dval(&d) += 1.;
+ }
+ }
+ else if (!oldinexact)
+ clear_inexact();
+#endif
+ Bfree(b);
+ *s = 0;
+ *decpt = k + 1;
+ if (rve)
+ *rve = s;
+ return s0;
+}
libc/mingw/gdtoa/g__fmt.c
@@ -0,0 +1,142 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+#ifdef USE_LOCALE
+#include "locale.h"
+#endif
+
+char *__g__fmt (char *b, char *s, char *se, int decpt, ULong sign, size_t blen)
+{
+ int i, j, k;
+ char *be, *s0;
+ size_t len;
+#ifdef USE_LOCALE
+#ifdef NO_LOCALE_CACHE
+ char *decimalpoint = localeconv()->decimal_point;
+ size_t dlen = strlen(decimalpoint);
+#else
+ char *decimalpoint;
+ static char *decimalpoint_cache;
+ static size_t dlen;
+ if (!(s0 = decimalpoint_cache)) {
+ s0 = localeconv()->decimal_point;
+ dlen = strlen(s0);
+ if ((decimalpoint_cache = (char*)MALLOC(strlen(s0) + 1))) {
+ strcpy(decimalpoint_cache, s0);
+ s0 = decimalpoint_cache;
+ }
+ }
+ decimalpoint = s0;
+#endif
+#else
+#define dlen 0
+#endif
+ s0 = s;
+ len = (se-s) + dlen + 6; /* 6 = sign + e+dd + trailing null */
+ if (blen < len)
+ goto ret0;
+ be = b + blen - 1;
+ if (sign)
+ *b++ = '-';
+ if (decpt <= -4 || decpt > se - s + 5) {
+ *b++ = *s++;
+ if (*s) {
+#ifdef USE_LOCALE
+ while((*b = *decimalpoint++))
+ ++b;
+#else
+ *b++ = '.';
+#endif
+ while((*b = *s++) !=0)
+ b++;
+ }
+ *b++ = 'e';
+ /* sprintf(b, "%+.2d", decpt - 1); */
+ if (--decpt < 0) {
+ *b++ = '-';
+ decpt = -decpt;
+ }
+ else
+ *b++ = '+';
+ for(j = 2, k = 10; 10*k <= decpt; j++, k *= 10){}
+ for(;;) {
+ i = decpt / k;
+ if (b >= be)
+ goto ret0;
+ *b++ = i + '0';
+ if (--j <= 0)
+ break;
+ decpt -= i*k;
+ decpt *= 10;
+ }
+ *b = 0;
+ }
+ else if (decpt <= 0) {
+#ifdef USE_LOCALE
+ while((*b = *decimalpoint++))
+ ++b;
+#else
+ *b++ = '.';
+#endif
+ if (be < b - decpt + (se - s))
+ goto ret0;
+ for(; decpt < 0; decpt++)
+ *b++ = '0';
+ while((*b = *s++) != 0)
+ b++;
+ }
+ else {
+ while((*b = *s++) != 0) {
+ b++;
+ if (--decpt == 0 && *s) {
+#ifdef USE_LOCALE
+ while((*b = *decimalpoint++))
+ ++b;
+#else
+ *b++ = '.';
+#endif
+ }
+ }
+ if (b + decpt > be) {
+ ret0:
+ b = 0;
+ goto ret;
+ }
+ for(; decpt > 0; decpt--)
+ *b++ = '0';
+ *b = 0;
+ }
+ ret:
+ __freedtoa(s0);
+ return b;
+}
libc/mingw/gdtoa/g_dfmt.c
@@ -0,0 +1,90 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+char *__g_dfmt (char *buf, double *d, int ndig, size_t bufsize)
+{
+ static FPI fpi0 = { 53, 1-1023-53+1, 2046-1023-53+1, 1, 0, Int_max };
+ char *b, *s, *se;
+ ULong bits[2], *L, sign;
+ int decpt, ex, i, mode;
+#ifdef Honor_FLT_ROUNDS
+#include "gdtoa_fltrnds.h"
+#else
+#define fpi &fpi0
+#endif
+
+ if (ndig < 0)
+ ndig = 0;
+ if ((int) bufsize < ndig + 10)
+ return 0;
+
+ L = (ULong*)d;
+ sign = L[_0] & 0x80000000L;
+ if ((L[_0] & 0x7ff00000) == 0x7ff00000) {
+ /* Infinity or NaN */
+ if (bufsize < 10)
+ return 0;
+ if (L[_0] & 0xfffff || L[_1]) {
+ return strcp(buf, "NaN");
+ }
+ b = buf;
+ if (sign)
+ *b++ = '-';
+ return strcp(b, "Infinity");
+ }
+ if (L[_1] == 0 && (L[_0] ^ sign) == 0 /*d == 0.*/) {
+ b = buf;
+#ifndef IGNORE_ZERO_SIGN
+ if (L[_0] & 0x80000000L)
+ *b++ = '-';
+#endif
+ *b++ = '0';
+ *b = 0;
+ return b;
+ }
+ bits[0] = L[_1];
+ bits[1] = L[_0] & 0xfffff;
+ if ( (ex = (L[_0] >> 20) & 0x7ff) !=0)
+ bits[1] |= 0x100000;
+ else
+ ex = 1;
+ ex -= 0x3ff + 52;
+ mode = 2;
+ if (ndig <= 0)
+ mode = 0;
+ i = STRTOG_Normal;
+ if (sign)
+ i = STRTOG_Normal | STRTOG_Neg;
+ s = __gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se);
+ return __g__fmt(buf, s, se, decpt, sign, bufsize);
+}
libc/mingw/gdtoa/g_ffmt.c
@@ -0,0 +1,88 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+char *__g_ffmt (char *buf, float *f, int ndig, size_t bufsize)
+{
+ static FPI fpi0 = { 24, 1-127-24+1, 254-127-24+1, 1, 0, 6 };
+ char *b, *s, *se;
+ ULong bits[1], *L, sign;
+ int decpt, ex, i, mode;
+#ifdef Honor_FLT_ROUNDS
+#include "gdtoa_fltrnds.h"
+#else
+#define fpi &fpi0
+#endif
+
+ if (ndig < 0)
+ ndig = 0;
+ if ((int) bufsize < ndig + 10)
+ return 0;
+
+ L = (ULong*)f;
+ sign = L[0] & 0x80000000L;
+ if ((L[0] & 0x7f800000) == 0x7f800000) {
+ /* Infinity or NaN */
+ if (L[0] & 0x7fffff) {
+ return strcp(buf, "NaN");
+ }
+ b = buf;
+ if (sign)
+ *b++ = '-';
+ return strcp(b, "Infinity");
+ }
+ if (*f == 0.) {
+ b = buf;
+#ifndef IGNORE_ZERO_SIGN
+ if (L[0] & 0x80000000L)
+ *b++ = '-';
+#endif
+ *b++ = '0';
+ *b = 0;
+ return b;
+ }
+ bits[0] = L[0] & 0x7fffff;
+ if ( (ex = (L[0] >> 23) & 0xff) !=0)
+ bits[0] |= 0x800000;
+ else
+ ex = 1;
+ ex -= 0x7f + 23;
+ mode = 2;
+ if (ndig <= 0) {
+ if (bufsize < 16)
+ return 0;
+ mode = 0;
+ }
+ i = STRTOG_Normal;
+ s = __gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se);
+ return __g__fmt(buf, s, se, decpt, sign, bufsize);
+}
libc/mingw/gdtoa/g_xfmt.c
@@ -0,0 +1,143 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+#undef _0
+#undef _1
+
+/* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */
+
+#ifdef IEEE_MC68k
+#define _0 0
+#define _1 1
+#define _2 2
+#define _3 3
+#define _4 4
+#endif
+#ifdef IEEE_8087
+#define _0 4
+#define _1 3
+#define _2 2
+#define _3 1
+#define _4 0
+#endif
+
+char *__g_xfmt (char *buf, void *V, int ndig, size_t bufsize)
+{
+ static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, 0, Int_max };
+ char *b, *s, *se;
+ ULong bits[2], sign;
+ UShort *L;
+ int decpt, ex, i, mode;
+#if defined(__MINGW32__) || defined(__MINGW64__)
+ int fptype = __fpclassifyl (*(long double*) V);
+#endif /* MinGW */
+#ifdef Honor_FLT_ROUNDS
+#include "gdtoa_fltrnds.h"
+#else
+#define fpi &fpi0
+#endif
+
+ if (ndig < 0)
+ ndig = 0;
+ if ((int) bufsize < ndig + 10)
+ return 0;
+
+ L = (UShort *)V;
+ sign = L[_0] & 0x8000;
+ ex = L[_0] & 0x7fff;
+ bits[1] = (L[_1] << 16) | L[_2];
+ bits[0] = (L[_3] << 16) | L[_4];
+
+#if defined(__MINGW32__) || defined(__MINGW64__)
+ if (fptype & FP_NAN) {
+ /* NaN or Inf */
+ if (fptype & FP_NORMAL) {
+ b = buf;
+ *b++ = sign ? '-': '+';
+ strncpy (b, "Infinity", ndig ? ndig : 8);
+ return (buf + strlen (buf));
+ }
+ strncpy (buf, "NaN", ndig ? ndig : 3);
+ return (buf + strlen (buf));
+ }
+ else if (fptype & FP_NORMAL) {
+ /* Normal or subnormal */
+ if (fptype & FP_ZERO) {
+ i = STRTOG_Denormal;
+ ex = 1;
+ }
+ else
+ i = STRTOG_Normal;
+ }
+#else
+ if (ex != 0) {
+ if (ex == 0x7fff) {
+ /* Infinity or NaN */
+ if (bits[0] | bits[1])
+ b = strcp(buf, "NaN");
+ else {
+ b = buf;
+ if (sign)
+ *b++ = '-';
+ b = strcp(b, "Infinity");
+ }
+ return b;
+ }
+ i = STRTOG_Normal;
+ }
+ else if (bits[0] | bits[1]) {
+ i = STRTOG_Denormal;
+ ex = 1;
+ }
+#endif
+ else {
+ /* i = STRTOG_Zero; */
+ b = buf;
+#ifndef IGNORE_ZERO_SIGN
+ if (sign)
+ *b++ = '-';
+#endif
+ *b++ = '0';
+ *b = 0;
+ return b;
+ }
+ ex -= 0x3fff + 63;
+ mode = 2;
+ if (ndig <= 0) {
+ if (bufsize < 32)
+ return 0;
+ mode = 0;
+ }
+ s = __gdtoa(fpi, ex, bits, &i, mode, ndig, &decpt, &se);
+ return __g__fmt(buf, s, se, decpt, sign, bufsize);
+}
libc/mingw/gdtoa/gd_arith.h
@@ -0,0 +1,6 @@
+#define IEEE_8087
+#define Arith_Kind_ASL 1
+#define Double_Align
+#ifdef _WIN64
+#define X64_bit_pointers
+#endif /* w64 */
libc/mingw/gdtoa/gd_qnan.h
@@ -0,0 +1,12 @@
+#define f_QNAN 0x7fc00000
+#define d_QNAN0 0x0
+#define d_QNAN1 0x7ff80000
+#define ld_QNAN0 0x0
+#define ld_QNAN1 0xc0000000
+#define ld_QNAN2 0x7fff
+#define ld_QNAN3 0x0
+#define ldus_QNAN0 0x0
+#define ldus_QNAN1 0x0
+#define ldus_QNAN2 0x0
+#define ldus_QNAN3 0xc000
+#define ldus_QNAN4 0x7fff
libc/mingw/gdtoa/gdtoa.c
@@ -0,0 +1,733 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998, 1999 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+static Bigint *bitstob (ULong *bits, int nbits, int *bbits)
+{
+ int i, k;
+ Bigint *b;
+ ULong *be, *x, *x0;
+
+ i = ULbits;
+ k = 0;
+ while(i < nbits) {
+ i <<= 1;
+ k++;
+ }
+#ifndef Pack_32
+ if (!k)
+ k = 1;
+#endif
+ b = Balloc(k);
+ be = bits + ((nbits - 1) >> kshift);
+ x = x0 = b->x;
+ do {
+ *x++ = *bits & ALL_ON;
+#ifdef Pack_16
+ *x++ = (*bits >> 16) & ALL_ON;
+#endif
+ } while(++bits <= be);
+ i = x - x0;
+ while(!x0[--i])
+ if (!i) {
+ b->wds = 0;
+ *bbits = 0;
+ goto ret;
+ }
+ b->wds = i + 1;
+ *bbits = i*ULbits + 32 - hi0bits(b->x[i]);
+ ret:
+ return b;
+}
+
+/* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
+ *
+ * Inspired by "How to Print Floating-Point Numbers Accurately" by
+ * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
+ *
+ * Modifications:
+ * 1. Rather than iterating, we use a simple numeric overestimate
+ * to determine k = floor(log10(d)). We scale relevant
+ * quantities using O(log2(k)) rather than O(k) multiplications.
+ * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
+ * try to generate digits strictly left to right. Instead, we
+ * compute with fewer bits and propagate the carry if necessary
+ * when rounding the final digit up. This is often faster.
+ * 3. Under the assumption that input will be rounded nearest,
+ * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
+ * That is, we allow equality in stopping tests when the
+ * round-nearest rule will give the same floating-point value
+ * as would satisfaction of the stopping test with strict
+ * inequality.
+ * 4. We remove common factors of powers of 2 from relevant
+ * quantities.
+ * 5. When converting floating-point integers less than 1e16,
+ * we use floating-point arithmetic rather than resorting
+ * to multiple-precision integers.
+ * 6. When asked to produce fewer than 15 digits, we first try
+ * to get by with floating-point arithmetic; we resort to
+ * multiple-precision integer arithmetic only if we cannot
+ * guarantee that the floating-point calculation has given
+ * the correctly rounded result. For k requested digits and
+ * "uniformly" distributed input, the probability is
+ * something like 10^(k-15) that we must resort to the Long
+ * calculation.
+ */
+
+char *__gdtoa (FPI *fpi, int be, ULong *bits, int *kindp, int mode, int ndigits,
+ int *decpt, char **rve)
+{
+ /* Arguments ndigits and decpt are similar to the second and third
+ arguments of ecvt and fcvt; trailing zeros are suppressed from
+ the returned string. If not null, *rve is set to point
+ to the end of the return value. If d is +-Infinity or NaN,
+ then *decpt is set to 9999.
+ be = exponent: value = (integer represented by bits) * (2 to the power of be).
+
+ mode:
+ 0 ==> shortest string that yields d when read in
+ and rounded to nearest.
+ 1 ==> like 0, but with Steele & White stopping rule;
+ e.g. with IEEE P754 arithmetic , mode 0 gives
+ 1e23 whereas mode 1 gives 9.999999999999999e22.
+ 2 ==> max(1,ndigits) significant digits. This gives a
+ return value similar to that of ecvt, except
+ that trailing zeros are suppressed.
+ 3 ==> through ndigits past the decimal point. This
+ gives a return value similar to that from fcvt,
+ except that trailing zeros are suppressed, and
+ ndigits can be negative.
+ 4-9 should give the same return values as 2-3, i.e.,
+ 4 <= mode <= 9 ==> same return as mode
+ 2 + (mode & 1). These modes are mainly for
+ debugging; often they run slower but sometimes
+ faster than modes 2-3.
+ 4,5,8,9 ==> left-to-right digit generation.
+ 6-9 ==> don't try fast floating-point estimate
+ (if applicable).
+
+ Values of mode other than 0-9 are treated as mode 0.
+
+ Sufficient space is allocated to the return value
+ to hold the suppressed trailing zeros.
+ */
+
+ int bbits, b2, b5, be0, dig, i, ieps, ilim, ilim0, ilim1, inex;
+ int j, j2, k, k0, k_check, kind, leftright, m2, m5, nbits;
+ int rdir, s2, s5, spec_case, try_quick;
+ Long L;
+ Bigint *b, *b1, *delta, *mlo, *mhi, *mhi1, *S;
+ double d2, ds;
+ char *s, *s0;
+ union _dbl_union d, eps;
+
+#ifndef MULTIPLE_THREADS
+ if (dtoa_result) {
+ __freedtoa(dtoa_result);
+ dtoa_result = 0;
+ }
+#endif
+ inex = 0;
+ kind = *kindp &= ~STRTOG_Inexact;
+ switch(kind & STRTOG_Retmask) {
+ case STRTOG_Zero:
+ goto ret_zero;
+ case STRTOG_Normal:
+ case STRTOG_Denormal:
+ break;
+ case STRTOG_Infinite:
+ *decpt = -32768;
+ return nrv_alloc("Infinity", rve, 8);
+ case STRTOG_NaN:
+ *decpt = -32768;
+ return nrv_alloc("NaN", rve, 3);
+ default:
+ return 0;
+ }
+ b = bitstob(bits, nbits = fpi->nbits, &bbits);
+ be0 = be;
+ if ( (i = trailz(b)) !=0) {
+ rshift(b, i);
+ be += i;
+ bbits -= i;
+ }
+ if (!b->wds) {
+ Bfree(b);
+ ret_zero:
+ *decpt = 1;
+ return nrv_alloc("0", rve, 1);
+ }
+
+ dval(&d) = b2d(b, &i);
+ i = be + bbits - 1;
+ word0(&d) &= Frac_mask1;
+ word0(&d) |= Exp_11;
+
+ /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
+ * log10(x) = log(x) / log(10)
+ * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
+ * log10(&d) = (i-Bias)*log(2)/log(10) + log10(d2)
+ *
+ * This suggests computing an approximation k to log10(&d) by
+ *
+ * k = (i - Bias)*0.301029995663981
+ * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
+ *
+ * We want k to be too large rather than too small.
+ * The error in the first-order Taylor series approximation
+ * is in our favor, so we just round up the constant enough
+ * to compensate for any error in the multiplication of
+ * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
+ * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
+ * adding 1e-13 to the constant term more than suffices.
+ * Hence we adjust the constant term to 0.1760912590558.
+ * (We could get a more accurate k by invoking log10,
+ * but this is probably not worthwhile.)
+ */
+ ds = (dval(&d)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
+
+ /* correct assumption about exponent range */
+ if ((j = i) < 0)
+ j = -j;
+ if ((j -= 1077) > 0)
+ ds += j * 7e-17;
+
+ k = (int)ds;
+ if (ds < 0. && ds != k)
+ k--; /* want k = floor(ds) */
+ k_check = 1;
+ word0(&d) += (be + bbits - 1) << Exp_shift;
+ if (k >= 0 && k <= Ten_pmax) {
+ if (dval(&d) < tens[k])
+ k--;
+ k_check = 0;
+ }
+ j = bbits - i - 1;
+ if (j >= 0) {
+ b2 = 0;
+ s2 = j;
+ }
+ else {
+ b2 = -j;
+ s2 = 0;
+ }
+ if (k >= 0) {
+ b5 = 0;
+ s5 = k;
+ s2 += k;
+ }
+ else {
+ b2 -= k;
+ b5 = -k;
+ s5 = 0;
+ }
+ if (mode < 0 || mode > 9)
+ mode = 0;
+ try_quick = 1;
+ if (mode > 5) {
+ mode -= 4;
+ try_quick = 0;
+ }
+ else if (i >= -4 - Emin || i < Emin)
+ try_quick = 0;
+ leftright = 1;
+ ilim = ilim1 = -1; /* Values for cases 0 and 1; done here to */
+ /* silence erroneous "gcc -Wall" warning. */
+ switch(mode) {
+ case 0:
+ case 1:
+ i = (int)(nbits * .30103) + 3;
+ ndigits = 0;
+ break;
+ case 2:
+ leftright = 0;
+ /* no break */
+ case 4:
+ if (ndigits <= 0)
+ ndigits = 1;
+ ilim = ilim1 = i = ndigits;
+ break;
+ case 3:
+ leftright = 0;
+ /* no break */
+ case 5:
+ i = ndigits + k + 1;
+ ilim = i;
+ ilim1 = i - 1;
+ if (i <= 0)
+ i = 1;
+ }
+ s = s0 = rv_alloc(i);
+
+ if ( (rdir = fpi->rounding - 1) !=0) {
+ if (rdir < 0)
+ rdir = 2;
+ if (kind & STRTOG_Neg)
+ rdir = 3 - rdir;
+ }
+
+ /* Now rdir = 0 ==> round near, 1 ==> round up, 2 ==> round down. */
+
+ if (ilim >= 0 && ilim <= Quick_max && try_quick && !rdir
+#ifndef IMPRECISE_INEXACT
+ && k == 0
+#endif
+ ) {
+
+ /* Try to get by with floating-point arithmetic. */
+
+ i = 0;
+ d2 = dval(&d);
+ k0 = k;
+ ilim0 = ilim;
+ ieps = 2; /* conservative */
+ if (k > 0) {
+ ds = tens[k&0xf];
+ j = k >> 4;
+ if (j & Bletch) {
+ /* prevent overflows */
+ j &= Bletch - 1;
+ dval(&d) /= bigtens[n_bigtens-1];
+ ieps++;
+ }
+ for(; j; j >>= 1, i++)
+ if (j & 1) {
+ ieps++;
+ ds *= bigtens[i];
+ }
+ }
+ else {
+ ds = 1.;
+ if ( (j2 = -k) !=0) {
+ dval(&d) *= tens[j2 & 0xf];
+ for(j = j2 >> 4; j; j >>= 1, i++)
+ if (j & 1) {
+ ieps++;
+ dval(&d) *= bigtens[i];
+ }
+ }
+ }
+ if (k_check && dval(&d) < 1. && ilim > 0) {
+ if (ilim1 <= 0)
+ goto fast_failed;
+ ilim = ilim1;
+ k--;
+ dval(&d) *= 10.;
+ ieps++;
+ }
+ dval(&eps) = ieps*dval(&d) + 7.;
+ word0(&eps) -= (P-1)*Exp_msk1;
+ if (ilim == 0) {
+ S = mhi = 0;
+ dval(&d) -= 5.;
+ if (dval(&d) > dval(&eps))
+ goto one_digit;
+ if (dval(&d) < -dval(&eps))
+ goto no_digits;
+ goto fast_failed;
+ }
+#ifndef No_leftright
+ if (leftright) {
+ /* Use Steele & White method of only
+ * generating digits needed.
+ */
+ dval(&eps) = ds*0.5/tens[ilim-1] - dval(&eps);
+ for(i = 0;;) {
+ L = (Long)(dval(&d)/ds);
+ dval(&d) -= L*ds;
+ *s++ = '0' + (int)L;
+ if (dval(&d) < dval(&eps)) {
+ if (dval(&d))
+ inex = STRTOG_Inexlo;
+ goto ret1;
+ }
+ if (ds - dval(&d) < dval(&eps))
+ goto bump_up;
+ if (++i >= ilim)
+ break;
+ dval(&eps) *= 10.;
+ dval(&d) *= 10.;
+ }
+ }
+ else {
+#endif
+ /* Generate ilim digits, then fix them up. */
+ dval(&eps) *= tens[ilim-1];
+ for(i = 1;; i++, dval(&d) *= 10.) {
+ if ( (L = (Long)(dval(&d)/ds)) !=0)
+ dval(&d) -= L*ds;
+ *s++ = '0' + (int)L;
+ if (i == ilim) {
+ ds *= 0.5;
+ if (dval(&d) > ds + dval(&eps))
+ goto bump_up;
+ else if (dval(&d) < ds - dval(&eps)) {
+ if (dval(&d))
+ inex = STRTOG_Inexlo;
+ goto clear_trailing0;
+ }
+ break;
+ }
+ }
+#ifndef No_leftright
+ }
+#endif
+ fast_failed:
+ s = s0;
+ dval(&d) = d2;
+ k = k0;
+ ilim = ilim0;
+ }
+
+ /* Do we have a "small" integer? */
+
+ if (be >= 0 && k <= fpi->int_max) {
+ /* Yes. */
+ ds = tens[k];
+ if (ndigits < 0 && ilim <= 0) {
+ S = mhi = 0;
+ if (ilim < 0 || dval(&d) <= 5*ds)
+ goto no_digits;
+ goto one_digit;
+ }
+ for(i = 1;; i++, dval(&d) *= 10.) {
+ L = dval(&d) / ds;
+ dval(&d) -= L*ds;
+#ifdef Check_FLT_ROUNDS
+ /* If FLT_ROUNDS == 2, L will usually be high by 1 */
+ if (dval(&d) < 0) {
+ L--;
+ dval(&d) += ds;
+ }
+#endif
+ *s++ = '0' + (int)L;
+ if (dval(&d) == 0.)
+ break;
+ if (i == ilim) {
+ if (rdir) {
+ if (rdir == 1)
+ goto bump_up;
+ inex = STRTOG_Inexlo;
+ goto ret1;
+ }
+ dval(&d) += dval(&d);
+#ifdef ROUND_BIASED
+ if (dval(&d) >= ds)
+#else
+ if (dval(&d) > ds || (dval(&d) == ds && L & 1))
+#endif
+ {
+ bump_up:
+ inex = STRTOG_Inexhi;
+ while(*--s == '9')
+ if (s == s0) {
+ k++;
+ *s = '0';
+ break;
+ }
+ ++*s++;
+ }
+ else {
+ inex = STRTOG_Inexlo;
+ clear_trailing0:
+ while(*--s == '0'){}
+ ++s;
+ }
+ break;
+ }
+ }
+ goto ret1;
+ }
+
+ m2 = b2;
+ m5 = b5;
+ mhi = mlo = 0;
+ if (leftright) {
+ i = nbits - bbits;
+ if (be - i++ < fpi->emin && mode != 3 && mode != 5) {
+ /* denormal */
+ i = be - fpi->emin + 1;
+ if (mode >= 2 && ilim > 0 && ilim < i)
+ goto small_ilim;
+ }
+ else if (mode >= 2) {
+ small_ilim:
+ j = ilim - 1;
+ if (m5 >= j)
+ m5 -= j;
+ else {
+ s5 += j -= m5;
+ b5 += j;
+ m5 = 0;
+ }
+ if ((i = ilim) < 0) {
+ m2 -= i;
+ i = 0;
+ }
+ }
+ b2 += i;
+ s2 += i;
+ mhi = i2b(1);
+ }
+ if (m2 > 0 && s2 > 0) {
+ i = m2 < s2 ? m2 : s2;
+ b2 -= i;
+ m2 -= i;
+ s2 -= i;
+ }
+ if (b5 > 0) {
+ if (leftright) {
+ if (m5 > 0) {
+ mhi = pow5mult(mhi, m5);
+ b1 = mult(mhi, b);
+ Bfree(b);
+ b = b1;
+ }
+ if ( (j = b5 - m5) !=0)
+ b = pow5mult(b, j);
+ }
+ else
+ b = pow5mult(b, b5);
+ }
+ S = i2b(1);
+ if (s5 > 0)
+ S = pow5mult(S, s5);
+
+ /* Check for special case that d is a normalized power of 2. */
+
+ spec_case = 0;
+ if (mode < 2) {
+ if (bbits == 1 && be0 > fpi->emin + 1) {
+ /* The special case */
+ b2++;
+ s2++;
+ spec_case = 1;
+ }
+ }
+
+ /* Arrange for convenient computation of quotients:
+ * shift left if necessary so divisor has 4 leading 0 bits.
+ *
+ * Perhaps we should just compute leading 28 bits of S once
+ * and for all and pass them and a shift to quorem, so it
+ * can do shifts and ors to compute the numerator for q.
+ */
+ i = ((s5 ? hi0bits(S->x[S->wds-1]) : ULbits - 1) - s2 - 4) & kmask;
+ m2 += i;
+ if ((b2 += i) > 0)
+ b = lshift(b, b2);
+ if ((s2 += i) > 0)
+ S = lshift(S, s2);
+ if (k_check) {
+ if (cmp(b,S) < 0) {
+ k--;
+ b = multadd(b, 10, 0); /* we botched the k estimate */
+ if (leftright)
+ mhi = multadd(mhi, 10, 0);
+ ilim = ilim1;
+ }
+ }
+ if (ilim <= 0 && mode > 2) {
+ if (ilim < 0 || cmp(b,S = multadd(S,5,0)) <= 0) {
+ /* no digits, fcvt style */
+ no_digits:
+ k = -1 - ndigits;
+ inex = STRTOG_Inexlo;
+ goto ret;
+ }
+ one_digit:
+ inex = STRTOG_Inexhi;
+ *s++ = '1';
+ k++;
+ goto ret;
+ }
+ if (leftright) {
+ if (m2 > 0)
+ mhi = lshift(mhi, m2);
+
+ /* Compute mlo -- check for special case
+ * that d is a normalized power of 2.
+ */
+
+ mlo = mhi;
+ if (spec_case) {
+ mhi = Balloc(mhi->k);
+ Bcopy(mhi, mlo);
+ mhi = lshift(mhi, 1);
+ }
+
+ for(i = 1;;i++) {
+ dig = quorem(b,S) + '0';
+ /* Do we yet have the shortest decimal string
+ * that will round to d?
+ */
+ j = cmp(b, mlo);
+ delta = diff(S, mhi);
+ j2 = delta->sign ? 1 : cmp(b, delta);
+ Bfree(delta);
+#ifndef ROUND_BIASED
+ if (j2 == 0 && !mode && !(bits[0] & 1) && !rdir) {
+ if (dig == '9')
+ goto round_9_up;
+ if (j <= 0) {
+ if (b->wds > 1 || b->x[0])
+ inex = STRTOG_Inexlo;
+ }
+ else {
+ dig++;
+ inex = STRTOG_Inexhi;
+ }
+ *s++ = dig;
+ goto ret;
+ }
+#endif
+ if (j < 0 || (j == 0 && !mode
+#ifndef ROUND_BIASED
+ && !(bits[0] & 1)
+#endif
+ )) {
+ if (rdir && (b->wds > 1 || b->x[0])) {
+ if (rdir == 2) {
+ inex = STRTOG_Inexlo;
+ goto accept;
+ }
+ while (cmp(S,mhi) > 0) {
+ *s++ = dig;
+ mhi1 = multadd(mhi, 10, 0);
+ if (mlo == mhi)
+ mlo = mhi1;
+ mhi = mhi1;
+ b = multadd(b, 10, 0);
+ dig = quorem(b,S) + '0';
+ }
+ if (dig++ == '9')
+ goto round_9_up;
+ inex = STRTOG_Inexhi;
+ goto accept;
+ }
+ if (j2 > 0) {
+ b = lshift(b, 1);
+ j2 = cmp(b, S);
+#ifdef ROUND_BIASED
+ if (j2 >= 0 /*)*/
+#else
+ if ((j2 > 0 || (j2 == 0 && dig & 1))
+#endif
+ && dig++ == '9')
+ goto round_9_up;
+ inex = STRTOG_Inexhi;
+ }
+ if (b->wds > 1 || b->x[0])
+ inex = STRTOG_Inexlo;
+ accept:
+ *s++ = dig;
+ goto ret;
+ }
+ if (j2 > 0 && rdir != 2) {
+ if (dig == '9') { /* possible if i == 1 */
+ round_9_up:
+ *s++ = '9';
+ inex = STRTOG_Inexhi;
+ goto roundoff;
+ }
+ inex = STRTOG_Inexhi;
+ *s++ = dig + 1;
+ goto ret;
+ }
+ *s++ = dig;
+ if (i == ilim)
+ break;
+ b = multadd(b, 10, 0);
+ if (mlo == mhi)
+ mlo = mhi = multadd(mhi, 10, 0);
+ else {
+ mlo = multadd(mlo, 10, 0);
+ mhi = multadd(mhi, 10, 0);
+ }
+ }
+ }
+ else
+ for(i = 1;; i++) {
+ *s++ = dig = quorem(b,S) + '0';
+ if (i >= ilim)
+ break;
+ b = multadd(b, 10, 0);
+ }
+
+ /* Round off last digit */
+
+ if (rdir) {
+ if (rdir == 2 || (b->wds <= 1 && !b->x[0]))
+ goto chopzeros;
+ goto roundoff;
+ }
+ b = lshift(b, 1);
+ j = cmp(b, S);
+#ifdef ROUND_BIASED
+ if (j >= 0)
+#else
+ if (j > 0 || (j == 0 && dig & 1))
+#endif
+ {
+ roundoff:
+ inex = STRTOG_Inexhi;
+ while(*--s == '9')
+ if (s == s0) {
+ k++;
+ *s++ = '1';
+ goto ret;
+ }
+ ++*s++;
+ }
+ else {
+ chopzeros:
+ if (b->wds > 1 || b->x[0])
+ inex = STRTOG_Inexlo;
+ while(*--s == '0'){}
+ ++s;
+ }
+ ret:
+ Bfree(S);
+ if (mhi) {
+ if (mlo && mlo != mhi)
+ Bfree(mlo);
+ Bfree(mhi);
+ }
+ ret1:
+ Bfree(b);
+ *s = 0;
+ *decpt = k + 1;
+ if (rve)
+ *rve = s;
+ *kindp |= inex;
+ return s0;
+}
libc/mingw/gdtoa/gdtoa.h
@@ -0,0 +1,119 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+/* Modified by Danny Smith for inclusion in libmingwex.a
+ Aug 2006 */
+
+#ifndef GDTOA_H_INCLUDED
+#define GDTOA_H_INCLUDED
+
+#include "gd_arith.h"
+#include <stddef.h> /* for size_t */
+
+#if defined(__MINGW32__) || defined(__MINGW64__)
+/* keep the 'Long' definition as 'long' for compatibility
+ * with older/other software. long in w64 is 32 bits anyway..
+ */
+#define Long long /* Windows long is 32 bit */
+#undef NO_LONG_LONG /* we have long long type */
+#endif /* MinGW */
+
+#ifndef Long
+#define Long int
+#endif
+#ifndef ULong
+typedef unsigned Long ULong;
+#endif
+#ifndef UShort
+typedef unsigned short UShort;
+#endif
+
+enum { /* return values from strtodg */
+ STRTOG_Zero = 0,
+ STRTOG_Normal = 1,
+ STRTOG_Denormal = 2,
+ STRTOG_Infinite = 3,
+ STRTOG_NaN = 4,
+ STRTOG_NaNbits = 5,
+ STRTOG_NoNumber = 6,
+ STRTOG_Retmask = 7,
+
+ /* The following may be or-ed into one of the above values. */
+
+ STRTOG_Neg = 0x08, /* does not affect STRTOG_Inexlo or STRTOG_Inexhi */
+ STRTOG_Inexlo = 0x10, /* returned result rounded toward zero */
+ STRTOG_Inexhi = 0x20, /* returned result rounded away from zero */
+ STRTOG_Inexact = 0x30,
+ STRTOG_Underflow= 0x40,
+ STRTOG_Overflow = 0x80
+};
+
+typedef struct
+FPI {
+ int nbits;
+ int emin;
+ int emax;
+ int rounding;
+ int sudden_underflow;
+ int int_max;
+} FPI;
+
+enum { /* FPI.rounding values: same as FLT_ROUNDS */
+ FPI_Round_zero = 0,
+ FPI_Round_near = 1,
+ FPI_Round_up = 2,
+ FPI_Round_down = 3
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern char* __dtoa (double d, int mode, int ndigits, int *decpt,
+ int *sign, char **rve);
+extern char* __gdtoa (FPI *fpi, int be, ULong *bits, int *kindp,
+ int mode, int ndigits, int *decpt, char **rve);
+extern void __freedtoa (char *);
+
+extern float __strtof (const char *, char **);
+extern double __strtod (const char *, char **);
+extern long double __strtold (const char *, char **);
+extern int __strtodg (const char *, char **, FPI *, Long *, ULong *);
+
+extern char* __g__fmt (char*, char*, char*, int, ULong, size_t);
+extern char* __g_dfmt (char*, double*, int, size_t);
+extern char* __g_ffmt (char*, float*, int, size_t);
+extern char* __g_xfmt (char*, void*, int, size_t);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* GDTOA_H_INCLUDED */
libc/mingw/gdtoa/gdtoaimp.h
@@ -0,0 +1,641 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998-2000 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* This is a variation on dtoa.c that converts arbitary binary
+ floating-point formats to and from decimal notation. It uses
+ double-precision arithmetic internally, so there are still
+ various #ifdefs that adapt the calculations to the native
+ double-precision arithmetic (any of IEEE, VAX D_floating,
+ or IBM mainframe arithmetic).
+
+ Please send bug reports to David M. Gay (dmg at acm dot org,
+ with " at " changed at "@" and " dot " changed to ".").
+ */
+
+/* On a machine with IEEE extended-precision registers, it is
+ * necessary to specify double-precision (53-bit) rounding precision
+ * before invoking strtod or dtoa. If the machine uses (the equivalent
+ * of) Intel 80x87 arithmetic, the call
+ * _control87(PC_53, MCW_PC);
+ * does this with many compilers. Whether this or another call is
+ * appropriate depends on the compiler; for this to work, it may be
+ * necessary to #include "float.h" or another system-dependent header
+ * file.
+ */
+
+/* strtod for IEEE-, VAX-, and IBM-arithmetic machines.
+ *
+ * This strtod returns a nearest machine number to the input decimal
+ * string (or sets errno to ERANGE). With IEEE arithmetic, ties are
+ * broken by the IEEE round-even rule. Otherwise ties are broken by
+ * biased rounding (add half and chop).
+ *
+ * Inspired loosely by William D. Clinger's paper "How to Read Floating
+ * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 112-126].
+ *
+ * Modifications:
+ *
+ * 1. We only require IEEE, IBM, or VAX double-precision
+ * arithmetic (not IEEE double-extended).
+ * 2. We get by with floating-point arithmetic in a case that
+ * Clinger missed -- when we're computing d * 10^n
+ * for a small integer d and the integer n is not too
+ * much larger than 22 (the maximum integer k for which
+ * we can represent 10^k exactly), we may be able to
+ * compute (d*10^k) * 10^(e-k) with just one roundoff.
+ * 3. Rather than a bit-at-a-time adjustment of the binary
+ * result in the hard case, we use floating-point
+ * arithmetic to determine the adjustment to within
+ * one bit; only in really hard cases do we need to
+ * compute a second residual.
+ * 4. Because of 3., we don't need a large table of powers of 10
+ * for ten-to-e (just some small tables, e.g. of 10^k
+ * for 0 <= k <= 22).
+ */
+
+/*
+ * #define IEEE_8087 for IEEE-arithmetic machines where the least
+ * significant byte has the lowest address.
+ * #define IEEE_MC68k for IEEE-arithmetic machines where the most
+ * significant byte has the lowest address.
+ * #define Long int on machines with 32-bit ints and 64-bit longs.
+ * #define Sudden_Underflow for IEEE-format machines without gradual
+ * underflow (i.e., that flush to zero on underflow).
+ * #define IBM for IBM mainframe-style floating-point arithmetic.
+ * #define VAX for VAX-style floating-point arithmetic (D_floating).
+ * #define No_leftright to omit left-right logic in fast floating-point
+ * computation of dtoa and gdtoa. This will cause modes 4 and 5 to be
+ * treated the same as modes 2 and 3 for some inputs.
+ * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3.
+ * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
+ * that use extended-precision instructions to compute rounded
+ * products and quotients) with IBM.
+ * #define ROUND_BIASED for IEEE-format with biased rounding and arithmetic
+ * that rounds toward +Infinity.
+ * #define ROUND_BIASED_without_Round_Up for IEEE-format with biased
+ * rounding when the underlying floating-point arithmetic uses
+ * unbiased rounding. This prevent using ordinary floating-point
+ * arithmetic when the result could be computed with one rounding error.
+ * #define Inaccurate_Divide for IEEE-format with correctly rounded
+ * products but inaccurate quotients, e.g., for Intel i860.
+ * #define NO_LONG_LONG on machines that do not have a "long long"
+ * integer type (of >= 64 bits). On such machines, you can
+ * #define Just_16 to store 16 bits per 32-bit Long when doing
+ * high-precision integer arithmetic. Whether this speeds things
+ * up or slows things down depends on the machine and the number
+ * being converted. If long long is available and the name is
+ * something other than "long long", #define Llong to be the name,
+ * and if "unsigned Llong" does not work as an unsigned version of
+ * Llong, #define #ULLong to be the corresponding unsigned type.
+ * #define KR_headers for old-style C function headers.
+ * #define Bad_float_h if your system lacks a float.h or if it does not
+ * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
+ * FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
+ * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
+ * if memory is available and otherwise does something you deem
+ * appropriate. If MALLOC is undefined, malloc will be invoked
+ * directly -- and assumed always to succeed.
+ * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making
+ * memory allocations from a private pool of memory when possible.
+ * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes,
+ * unless #defined to be a different length. This default length
+ * suffices to get rid of MALLOC calls except for unusual cases,
+ * such as decimal-to-binary conversion of a very long string of
+ * digits. When converting IEEE double precision values, the
+ * longest string gdtoa can return is about 751 bytes long. For
+ * conversions by strtod of strings of 800 digits and all gdtoa
+ * conversions of IEEE doubles in single-threaded executions with
+ * 8-byte pointers, PRIVATE_MEM >= 7400 appears to suffice; with
+ * 4-byte pointers, PRIVATE_MEM >= 7112 appears adequate.
+ * #define NO_INFNAN_CHECK if you do not wish to have INFNAN_CHECK
+ * #defined automatically on IEEE systems. On such systems,
+ * when INFNAN_CHECK is #defined, strtod checks
+ * for Infinity and NaN (case insensitively).
+ * When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined,
+ * strtodg also accepts (case insensitively) strings of the form
+ * NaN(x), where x is a string of hexadecimal digits (optionally
+ * preceded by 0x or 0X) and spaces; if there is only one string
+ * of hexadecimal digits, it is taken for the fraction bits of the
+ * resulting NaN; if there are two or more strings of hexadecimal
+ * digits, each string is assigned to the next available sequence
+ * of 32-bit words of fractions bits (starting with the most
+ * significant), right-aligned in each sequence.
+ * Unless GDTOA_NON_PEDANTIC_NANCHECK is #defined, input "NaN(...)"
+ * is consumed even when ... has the wrong form (in which case the
+ * "(...)" is consumed but ignored).
+ * #define MULTIPLE_THREADS if the system offers preemptively scheduled
+ * multiple threads. In this case, you must provide (or suitably
+ * #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed
+ * by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed
+ * in pow5mult, ensures lazy evaluation of only one copy of high
+ * powers of 5; omitting this lock would introduce a small
+ * probability of wasting memory, but would otherwise be harmless.)
+ * You must also invoke freedtoa(s) to free the value s returned by
+ * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined.
+ * #define IMPRECISE_INEXACT if you do not care about the setting of
+ * the STRTOG_Inexact bits in the special case of doing IEEE double
+ * precision conversions (which could also be done by the strtog in
+ * dtoa.c).
+ * #define NO_HEX_FP to disable recognition of C9x's hexadecimal
+ * floating-point constants.
+ * #define -DNO_ERRNO to suppress setting errno (in strtod.c and
+ * strtodg.c).
+ * #define NO_STRING_H to use private versions of memcpy.
+ * On some K&R systems, it may also be necessary to
+ * #define DECLARE_SIZE_T in this case.
+ * #define USE_LOCALE to use the current locale's decimal_point value.
+ */
+
+#ifndef GDTOAIMP_H_INCLUDED
+#define GDTOAIMP_H_INCLUDED
+#include "gdtoa.h"
+#include "gd_qnan.h"
+
+#if defined(__MINGW32__) || defined(__MINGW64__)
+#define MULTIPLE_THREADS 1
+#define USE_LOCALE 1
+#define NO_LOCALE_CACHE 1
+#endif /* MinGW */
+
+#ifdef Honor_FLT_ROUNDS
+#include <fenv.h>
+#endif
+
+#ifdef DEBUG
+#include <stdio.h>
+#define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
+#endif
+
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef MALLOC
+extern void *MALLOC (size_t);
+#else
+#define MALLOC malloc
+#endif
+
+#undef IEEE_Arith
+#undef Avoid_Underflow
+#ifdef IEEE_MC68k
+#define IEEE_Arith
+#endif
+#ifdef IEEE_8087
+#define IEEE_Arith
+#endif
+
+#include <errno.h>
+
+#ifdef NO_ERRNO
+#define SET_ERRNO(x)
+#else
+#define SET_ERRNO(x) \
+ errno = (x)
+#endif
+
+#ifdef Bad_float_h
+
+#ifdef IEEE_Arith
+#define DBL_DIG 15
+#define DBL_MAX_10_EXP 308
+#define DBL_MAX_EXP 1024
+#define FLT_RADIX 2
+#define DBL_MAX 1.7976931348623157e+308
+#endif
+
+#ifdef IBM
+#define DBL_DIG 16
+#define DBL_MAX_10_EXP 75
+#define DBL_MAX_EXP 63
+#define FLT_RADIX 16
+#define DBL_MAX 7.2370055773322621e+75
+#endif
+
+#ifdef VAX
+#define DBL_DIG 16
+#define DBL_MAX_10_EXP 38
+#define DBL_MAX_EXP 127
+#define FLT_RADIX 2
+#define DBL_MAX 1.7014118346046923e+38
+#define n_bigtens 2
+#endif
+
+#ifndef LONG_MAX
+#define LONG_MAX 2147483647
+#endif
+
+#else /* ifndef Bad_float_h */
+#include <float.h>
+#endif /* Bad_float_h */
+
+#ifdef IEEE_Arith
+#define Scale_Bit 0x10
+#define n_bigtens 5
+#endif
+
+#ifdef IBM
+#define n_bigtens 3
+#endif
+
+#ifdef VAX
+#define n_bigtens 2
+#endif
+
+#ifndef __MATH_H__
+#include <math.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
+Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
+#endif
+
+typedef union _dbl_union { double d; ULong L[2]; } dbl_union;
+
+#ifdef IEEE_8087
+#define word0(x) (x)->L[1]
+#define word1(x) (x)->L[0]
+#else
+#define word0(x) (x)->L[0]
+#define word1(x) (x)->L[1]
+#endif
+#define dval(x) (x)->d
+
+/* The following definition of Storeinc is appropriate for MIPS processors.
+ * An alternative that might be better on some machines is
+ * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
+ */
+#if defined(IEEE_8087) + defined(VAX)
+#define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
+((unsigned short *)a)[0] = (unsigned short)c, a++)
+#else
+#define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
+((unsigned short *)a)[1] = (unsigned short)c, a++)
+#endif
+
+/* #define P DBL_MANT_DIG */
+/* Ten_pmax = floor(P*log(2)/log(5)) */
+/* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
+/* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
+/* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
+
+#ifdef IEEE_Arith
+#define Exp_shift 20
+#define Exp_shift1 20
+#define Exp_msk1 0x100000
+#define Exp_msk11 0x100000
+#define Exp_mask 0x7ff00000
+#define P 53
+#define Bias 1023
+#define Emin (-1022)
+#define Exp_1 0x3ff00000
+#define Exp_11 0x3ff00000
+#define Ebits 11
+#define Frac_mask 0xfffff
+#define Frac_mask1 0xfffff
+#define Ten_pmax 22
+#define Bletch 0x10
+#define Bndry_mask 0xfffff
+#define Bndry_mask1 0xfffff
+#define LSB 1
+#define Sign_bit 0x80000000
+#define Log2P 1
+#define Tiny0 0
+#define Tiny1 1
+#define Quick_max 14
+#define Int_max 14
+
+#ifndef Flt_Rounds
+#ifdef FLT_ROUNDS
+#define Flt_Rounds FLT_ROUNDS
+#else
+#define Flt_Rounds 1
+#endif
+#endif /*Flt_Rounds*/
+
+#else /* ifndef IEEE_Arith */
+#undef Sudden_Underflow
+#define Sudden_Underflow
+#ifdef IBM
+#undef Flt_Rounds
+#define Flt_Rounds 0
+#define Exp_shift 24
+#define Exp_shift1 24
+#define Exp_msk1 0x1000000
+#define Exp_msk11 0x1000000
+#define Exp_mask 0x7f000000
+#define P 14
+#define Bias 65
+#define Exp_1 0x41000000
+#define Exp_11 0x41000000
+#define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */
+#define Frac_mask 0xffffff
+#define Frac_mask1 0xffffff
+#define Bletch 4
+#define Ten_pmax 22
+#define Bndry_mask 0xefffff
+#define Bndry_mask1 0xffffff
+#define LSB 1
+#define Sign_bit 0x80000000
+#define Log2P 4
+#define Tiny0 0x100000
+#define Tiny1 0
+#define Quick_max 14
+#define Int_max 15
+#else /* VAX */
+#undef Flt_Rounds
+#define Flt_Rounds 1
+#define Exp_shift 23
+#define Exp_shift1 7
+#define Exp_msk1 0x80
+#define Exp_msk11 0x800000
+#define Exp_mask 0x7f80
+#define P 56
+#define Bias 129
+#define Exp_1 0x40800000
+#define Exp_11 0x4080
+#define Ebits 8
+#define Frac_mask 0x7fffff
+#define Frac_mask1 0xffff007f
+#define Ten_pmax 24
+#define Bletch 2
+#define Bndry_mask 0xffff007f
+#define Bndry_mask1 0xffff007f
+#define LSB 0x10000
+#define Sign_bit 0x8000
+#define Log2P 1
+#define Tiny0 0x80
+#define Tiny1 0
+#define Quick_max 15
+#define Int_max 15
+#endif /* IBM, VAX */
+#endif /* IEEE_Arith */
+
+#ifndef IEEE_Arith
+#define ROUND_BIASED
+#else
+#ifdef ROUND_BIASED_without_Round_Up
+#undef ROUND_BIASED
+#define ROUND_BIASED
+#endif
+#endif
+
+#ifdef RND_PRODQUOT
+#define rounded_product(a,b) a = rnd_prod(a, b)
+#define rounded_quotient(a,b) a = rnd_quot(a, b)
+extern double rnd_prod(double, double), rnd_quot(double, double);
+#else
+#define rounded_product(a,b) a *= b
+#define rounded_quotient(a,b) a /= b
+#endif
+
+#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
+#define Big1 0xffffffff
+
+#undef Pack_16
+#ifndef Pack_32
+#define Pack_32
+#endif
+
+#ifdef NO_LONG_LONG
+#undef ULLong
+#ifdef Just_16
+#undef Pack_32
+#define Pack_16
+/* When Pack_32 is not defined, we store 16 bits per 32-bit Long.
+ * This makes some inner loops simpler and sometimes saves work
+ * during multiplications, but it often seems to make things slightly
+ * slower. Hence the default is now to store 32 bits per Long.
+ */
+#endif
+#else /* long long available */
+#ifndef Llong
+#define Llong long long
+#endif
+#ifndef ULLong
+#define ULLong unsigned Llong
+#endif
+#endif /* NO_LONG_LONG */
+
+#ifdef Pack_32
+#define ULbits 32
+#define kshift 5
+#define kmask 31
+#define ALL_ON 0xffffffff
+#else
+#define ULbits 16
+#define kshift 4
+#define kmask 15
+#define ALL_ON 0xffff
+#endif
+
+#ifndef MULTIPLE_THREADS
+#define ACQUIRE_DTOA_LOCK(n) /*nothing*/
+#define FREE_DTOA_LOCK(n) /*nothing*/
+#endif
+
+#define Kmax 9
+
+#define Bigint __Bigint
+struct
+Bigint {
+ struct Bigint *next;
+ int k, maxwds, sign, wds;
+ ULong x[1];
+};
+typedef struct Bigint Bigint;
+
+#ifdef NO_STRING_H
+#ifdef DECLARE_SIZE_T
+typedef unsigned int size_t;
+#endif
+extern void memcpy_D2A (void*, const void*, size_t);
+#define Bcopy(x,y) memcpy_D2A(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int))
+#else /* !NO_STRING_H */
+#define Bcopy(x,y) memcpy(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int))
+#endif /* NO_STRING_H */
+
+#ifdef __GNUC__
+static inline int
+__lo0bits_D2A (ULong *y)
+{
+ int ret = __builtin_ctz(*y);
+ *y = *y >> ret;
+ return ret;
+}
+
+static inline int
+__hi0bits_D2A (ULong y)
+{
+ return __builtin_clz(y);
+}
+#endif
+
+#define Balloc __Balloc_D2A
+#define Bfree __Bfree_D2A
+#define ULtoQ __ULtoQ_D2A
+#define ULtof __ULtof_D2A
+#define ULtod __ULtod_D2A
+#define ULtodd __ULtodd_D2A
+#define ULtox __ULtox_D2A
+#define ULtoxL __ULtoxL_D2A
+#define any_on __any_on_D2A
+#define b2d __b2d_D2A
+#define bigtens __bigtens_D2A
+#define cmp __cmp_D2A
+#define copybits __copybits_D2A
+#define d2b __d2b_D2A
+#define decrement __decrement_D2A
+#define diff __diff_D2A
+#define dtoa_result __dtoa_result_D2A
+#define gethex __gethex_D2A
+#define hexdig __hexdig_D2A
+#define hexnan __hexnan_D2A
+#define hi0bits_D2A __hi0bits_D2A
+#define hi0bits(x) __hi0bits_D2A((ULong)(x))
+#define i2b __i2b_D2A
+#define increment __increment_D2A
+#define lo0bits __lo0bits_D2A
+#define lshift __lshift_D2A
+#define match __match_D2A
+#define mult __mult_D2A
+#define multadd __multadd_D2A
+#define nrv_alloc __nrv_alloc_D2A
+#define pow5mult __pow5mult_D2A
+#define quorem __quorem_D2A
+#define ratio __ratio_D2A
+#define rshift __rshift_D2A
+#define rv_alloc __rv_alloc_D2A
+#define s2b __s2b_D2A
+#define set_ones __set_ones_D2A
+#define strcp_D2A __strcp_D2A
+#define strcp __strcp_D2A
+#define strtoIg __strtoIg_D2A
+#define sum __sum_D2A
+#define tens __tens_D2A
+#define tinytens __tinytens_D2A
+#define tinytens __tinytens_D2A
+#define trailz __trailz_D2A
+#define ulp __ulp_D2A
+
+#define hexdig_init_D2A __mingw_hexdig_init_D2A
+
+extern char *dtoa_result;
+extern const double bigtens[], tens[], tinytens[];
+extern unsigned char hexdig[];
+
+extern Bigint *Balloc (int);
+extern void Bfree (Bigint*);
+extern void ULtof (ULong*, ULong*, Long, int);
+extern void ULtod (ULong*, ULong*, Long, int);
+extern void ULtodd (ULong*, ULong*, Long, int);
+extern void ULtoQ (ULong*, ULong*, Long, int);
+extern void ULtox (UShort*, ULong*, Long, int);
+extern void ULtoxL (ULong*, ULong*, Long, int);
+extern ULong any_on (Bigint*, int);
+extern double b2d (Bigint*, int*);
+extern int cmp (Bigint*, Bigint*);
+extern void copybits (ULong*, int, Bigint*);
+extern Bigint *d2b (double, int*, int*);
+extern void decrement (Bigint*);
+extern Bigint *diff (Bigint*, Bigint*);
+extern int gethex (const char**, FPI*, Long*, Bigint**, int);
+extern void hexdig_init_D2A(void);
+extern int hexnan (const char**, FPI*, ULong*);
+extern int hi0bits_D2A (ULong);
+extern Bigint *i2b (int);
+extern Bigint *increment (Bigint*);
+extern int lo0bits (ULong*);
+extern Bigint *lshift (Bigint*, int);
+extern int match (const char**, char*);
+extern Bigint *mult (Bigint*, Bigint*);
+extern Bigint *multadd (Bigint*, int, int);
+extern char *nrv_alloc (char*, char **, int);
+extern Bigint *pow5mult (Bigint*, int);
+extern int quorem (Bigint*, Bigint*);
+extern double ratio (Bigint*, Bigint*);
+extern void rshift (Bigint*, int);
+extern char *rv_alloc (int);
+extern Bigint *s2b (const char*, int, int, ULong, int);
+extern Bigint *set_ones (Bigint*, int);
+extern char *strcp (char*, const char*);
+extern Bigint *sum (Bigint*, Bigint*);
+extern int trailz (Bigint*);
+extern double ulp (dbl_union *);
+
+#ifdef __cplusplus
+}
+#endif
+/*
+ * NAN_WORD0 and NAN_WORD1 are only referenced in strtod.c. Prior to
+ * 20050115, they used to be hard-wired here (to 0x7ff80000 and 0,
+ * respectively), but now are determined by compiling and running
+ * qnan.c to generate gd_qnan.h, which specifies d_QNAN0 and d_QNAN1.
+ * Formerly gdtoaimp.h recommended supplying suitable -DNAN_WORD0=...
+ * and -DNAN_WORD1=... values if necessary. This should still work.
+ * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.)
+ */
+#ifdef IEEE_Arith
+#ifndef NO_INFNAN_CHECK
+#undef INFNAN_CHECK
+#define INFNAN_CHECK
+#endif
+#ifdef IEEE_MC68k
+#define _0 0
+#define _1 1
+#ifndef NAN_WORD0
+#define NAN_WORD0 d_QNAN0
+#endif
+#ifndef NAN_WORD1
+#define NAN_WORD1 d_QNAN1
+#endif
+#else
+#define _0 1
+#define _1 0
+#ifndef NAN_WORD0
+#define NAN_WORD0 d_QNAN1
+#endif
+#ifndef NAN_WORD1
+#define NAN_WORD1 d_QNAN0
+#endif
+#endif
+#else
+#undef INFNAN_CHECK
+#endif
+
+#undef SI
+#ifdef Sudden_Underflow
+#define SI 1
+#else
+#define SI 0
+#endif
+
+#endif /* GDTOAIMP_H_INCLUDED */
libc/mingw/gdtoa/gethex.c
@@ -0,0 +1,340 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+#ifdef USE_LOCALE
+#include "locale.h"
+#endif
+
+int gethex (const char **sp, FPI *fpi, Long *expo, Bigint **bp, int sign)
+{
+ Bigint *b;
+ const unsigned char *decpt, *s0, *s, *s1;
+ int big, esign, havedig, irv, j, k, n, n0, nbits, up, zret;
+ ULong L, lostbits, *x;
+ Long e, e1;
+#ifdef USE_LOCALE
+ int i;
+ const unsigned char *decimalpoint;
+#ifdef NO_LOCALE_CACHE
+ decimalpoint = (unsigned char *)localeconv()->decimal_point;
+#else
+ static unsigned char *decimalpoint_cache;
+ if (!(s0 = decimalpoint_cache)) {
+ s0 = (unsigned char *)localeconv()->decimal_point;
+ decimalpoint_cache = (unsigned char *)
+ MALLOC(strlen((char *)s0) + 1);
+ if (decimalpoint_cache) {
+ strcpy((char *)decimalpoint_cache, (char *)s0);
+ s0 = decimalpoint_cache;
+ }
+ }
+ decimalpoint = s0;
+#endif
+#endif
+
+ if (!hexdig['0'])
+ hexdig_init_D2A();
+ *bp = 0;
+ havedig = 0;
+ s0 = *(const unsigned char **)sp + 2;
+ while(s0[havedig] == '0')
+ havedig++;
+ s0 += havedig;
+ s = s0;
+ decpt = 0;
+ zret = 0;
+ e = 0;
+ if (hexdig[*s])
+ havedig++;
+ else {
+ zret = 1;
+#ifdef USE_LOCALE
+ for(i = 0; decimalpoint[i]; ++i) {
+ if (s[i] != decimalpoint[i])
+ goto pcheck;
+ }
+ decpt = s += i;
+#else
+ if (*s != '.')
+ goto pcheck;
+ decpt = ++s;
+#endif
+ if (!hexdig[*s])
+ goto pcheck;
+ while(*s == '0')
+ s++;
+ if (hexdig[*s])
+ zret = 0;
+ havedig = 1;
+ s0 = s;
+ }
+ while(hexdig[*s])
+ s++;
+#ifdef USE_LOCALE
+ if (*s == *decimalpoint && !decpt) {
+ for(i = 1; decimalpoint[i]; ++i) {
+ if (s[i] != decimalpoint[i])
+ goto pcheck;
+ }
+ decpt = s += i;
+#else
+ if (*s == '.' && !decpt) {
+ decpt = ++s;
+#endif
+ while(hexdig[*s])
+ s++;
+ }/*}*/
+ if (decpt)
+ e = -(((Long)(s-decpt)) << 2);
+ pcheck:
+ s1 = s;
+ big = esign = 0;
+ switch(*s) {
+ case 'p':
+ case 'P':
+ switch(*++s) {
+ case '-':
+ esign = 1;
+ /* no break */
+ case '+':
+ s++;
+ }
+ if ((n = hexdig[*s]) == 0 || n > 0x19) {
+ s = s1;
+ break;
+ }
+ e1 = n - 0x10;
+ while((n = hexdig[*++s]) !=0 && n <= 0x19) {
+ if (e1 & 0xf8000000)
+ big = 1;
+ e1 = 10*e1 + n - 0x10;
+ }
+ if (esign)
+ e1 = -e1;
+ e += e1;
+ }
+ *sp = (char*)s;
+ if (!havedig)
+ *sp = (char*)s0 - 1;
+ if (zret)
+ return STRTOG_Zero;
+ if (big) {
+ if (esign) {
+ switch(fpi->rounding) {
+ case FPI_Round_up:
+ if (sign)
+ break;
+ goto ret_tiny;
+ case FPI_Round_down:
+ if (!sign)
+ break;
+ goto ret_tiny;
+ }
+ goto retz;
+ ret_tiny:
+ b = Balloc(0);
+ b->wds = 1;
+ b->x[0] = 1;
+ goto dret;
+ }
+ switch(fpi->rounding) {
+ case FPI_Round_near:
+ goto ovfl1;
+ case FPI_Round_up:
+ if (!sign)
+ goto ovfl1;
+ goto ret_big;
+ case FPI_Round_down:
+ if (sign)
+ goto ovfl1;
+ goto ret_big;
+ }
+ ret_big:
+ nbits = fpi->nbits;
+ n0 = n = nbits >> kshift;
+ if (nbits & kmask)
+ ++n;
+ for(j = n, k = 0; j >>= 1; ++k);
+ *bp = b = Balloc(k);
+ b->wds = n;
+ for(j = 0; j < n0; ++j)
+ b->x[j] = ALL_ON;
+ if (n > n0)
+ b->x[j] = ULbits >> (ULbits - (nbits & kmask));
+ *expo = fpi->emin;
+ return STRTOG_Normal | STRTOG_Inexlo;
+ }
+ n = s1 - s0 - 1;
+ for(k = 0; n > (1 << (kshift-2)) - 1; n >>= 1)
+ k++;
+ b = Balloc(k);
+ x = b->x;
+ n = 0;
+ L = 0;
+#ifdef USE_LOCALE
+ for(i = 0; decimalpoint[i+1]; ++i);
+#endif
+ while(s1 > s0) {
+#ifdef USE_LOCALE
+ if (*--s1 == decimalpoint[i]) {
+ s1 -= i;
+ continue;
+ }
+#else
+ if (*--s1 == '.')
+ continue;
+#endif
+ if (n == ULbits) {
+ *x++ = L;
+ L = 0;
+ n = 0;
+ }
+ L |= (hexdig[*s1] & 0x0f) << n;
+ n += 4;
+ }
+ *x++ = L;
+ b->wds = n = x - b->x;
+ n = ULbits*n - hi0bits(L);
+ nbits = fpi->nbits;
+ lostbits = 0;
+ x = b->x;
+ if (n > nbits) {
+ n -= nbits;
+ if (any_on(b,n)) {
+ lostbits = 1;
+ k = n - 1;
+ if (x[k>>kshift] & 1 << (k & kmask)) {
+ lostbits = 2;
+ if (k > 0 && any_on(b,k))
+ lostbits = 3;
+ }
+ }
+ rshift(b, n);
+ e += n;
+ }
+ else if (n < nbits) {
+ n = nbits - n;
+ b = lshift(b, n);
+ e -= n;
+ x = b->x;
+ }
+ if (e > fpi->emax) {
+ ovfl:
+ Bfree(b);
+ ovfl1:
+ SET_ERRNO(ERANGE);
+ return STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi;
+ }
+ irv = STRTOG_Normal;
+ if (e < fpi->emin) {
+ irv = STRTOG_Denormal;
+ n = fpi->emin - e;
+ if (n >= nbits) {
+ switch (fpi->rounding) {
+ case FPI_Round_near:
+ if (n == nbits && (n < 2 || any_on(b,n-1)))
+ goto one_bit;
+ break;
+ case FPI_Round_up:
+ if (!sign)
+ goto one_bit;
+ break;
+ case FPI_Round_down:
+ if (sign) {
+ one_bit:
+ x[0] = b->wds = 1;
+ dret:
+ *bp = b;
+ *expo = fpi->emin;
+ SET_ERRNO(ERANGE);
+ return STRTOG_Denormal | STRTOG_Inexhi
+ | STRTOG_Underflow;
+ }
+ }
+ Bfree(b);
+ retz:
+ SET_ERRNO(ERANGE);
+ return STRTOG_Zero | STRTOG_Inexlo | STRTOG_Underflow;
+ }
+ k = n - 1;
+ if (lostbits)
+ lostbits = 1;
+ else if (k > 0)
+ lostbits = any_on(b,k);
+ if (x[k>>kshift] & 1 << (k & kmask))
+ lostbits |= 2;
+ nbits -= n;
+ rshift(b,n);
+ e = fpi->emin;
+ }
+ if (lostbits) {
+ up = 0;
+ switch(fpi->rounding) {
+ case FPI_Round_zero:
+ break;
+ case FPI_Round_near:
+ if (lostbits & 2
+ && (lostbits | x[0]) & 1)
+ up = 1;
+ break;
+ case FPI_Round_up:
+ up = 1 - sign;
+ break;
+ case FPI_Round_down:
+ up = sign;
+ }
+ if (up) {
+ k = b->wds;
+ b = increment(b);
+ x = b->x;
+ if (irv == STRTOG_Denormal) {
+ if (nbits == fpi->nbits - 1
+ && x[nbits >> kshift] & 1 << (nbits & kmask))
+ irv = STRTOG_Normal;
+ }
+ else if (b->wds > k
+ || ((n = nbits & kmask) !=0
+ && hi0bits(x[k-1]) < 32-n)) {
+ rshift(b,1);
+ if (++e > fpi->emax)
+ goto ovfl;
+ }
+ irv |= STRTOG_Inexhi;
+ }
+ else
+ irv |= STRTOG_Inexlo;
+ }
+ *bp = b;
+ *expo = e;
+ return irv;
+}
libc/mingw/gdtoa/gmisc.c
@@ -0,0 +1,76 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+void rshift (Bigint *b, int k)
+{
+ ULong *x, *x1, *xe, y;
+ int n;
+
+ x = x1 = b->x;
+ n = k >> kshift;
+ if (n < b->wds) {
+ xe = x + b->wds;
+ x += n;
+ if (k &= kmask) {
+ n = ULbits - k;
+ y = *x++ >> k;
+ while(x < xe) {
+ *x1++ = (y | (*x << n)) & ALL_ON;
+ y = *x++ >> k;
+ }
+ if ((*x1 = y) !=0)
+ x1++;
+ }
+ else
+ while(x < xe)
+ *x1++ = *x++;
+ }
+ if ((b->wds = x1 - b->x) == 0)
+ b->x[0] = 0;
+}
+
+int trailz (Bigint *b)
+{
+ ULong L, *x, *xe;
+ int n = 0;
+
+ x = b->x;
+ xe = x + b->wds;
+ for(n = 0; x < xe && !*x; x++)
+ n += ULbits;
+ if (x < xe) {
+ L = *x;
+ n += lo0bits(&L);
+ }
+ return n;
+}
libc/mingw/gdtoa/hd_init.c
@@ -0,0 +1,49 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 2000 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+unsigned char hexdig[256];
+
+static void htinit (unsigned char *h, unsigned char *s, int inc)
+{
+ int i, j;
+ for(i = 0; (j = s[i]) !=0; i++)
+ h[j] = i + inc;
+}
+
+void hexdig_init_D2A (void)
+{
+#define USC (unsigned char *)
+ htinit(hexdig, USC "0123456789", 0x10);
+ htinit(hexdig, USC "abcdef", 0x10 + 10);
+ htinit(hexdig, USC "ABCDEF", 0x10 + 10);
+}
libc/mingw/gdtoa/hexnan.c
@@ -0,0 +1,139 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 2000 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+static void L_shift (ULong *x, ULong *x1, int i)
+{
+ int j;
+
+ i = 8 - i;
+ i <<= 2;
+ j = ULbits - i;
+ do {
+ *x |= x[1] << j;
+ x[1] >>= i;
+ } while(++x < x1);
+}
+
+int hexnan (const char **sp, FPI *fpi, ULong *x0)
+{
+ ULong c, h, *x, *x1, *xe;
+ const char *s;
+ int havedig, hd0, i, nbits;
+
+ if (!hexdig['0'])
+ hexdig_init_D2A();
+ nbits = fpi->nbits;
+ x = x0 + (nbits >> kshift);
+ if (nbits & kmask)
+ x++;
+ *--x = 0;
+ x1 = xe = x;
+ havedig = hd0 = i = 0;
+ s = *sp;
+ /* allow optional initial 0x or 0X */
+ while((c = *(const unsigned char*)(s+1)) && c <= ' ')
+ ++s;
+ if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X')
+ && *(const unsigned char*)(s+3) > ' ')
+ s += 2;
+ while((c = *(const unsigned char*)++s)) {
+ if (!(h = hexdig[c])) {
+ if (c <= ' ') {
+ if (hd0 < havedig) {
+ if (x < x1 && i < 8)
+ L_shift(x, x1, i);
+ if (x <= x0) {
+ i = 8;
+ continue;
+ }
+ hd0 = havedig;
+ *--x = 0;
+ x1 = x;
+ i = 0;
+ }
+ while(*(const unsigned char*)(s+1) <= ' ')
+ ++s;
+ if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X')
+ && *(const unsigned char*)(s+3) > ' ')
+ s += 2;
+ continue;
+ }
+ if (/*(*/ c == ')' && havedig) {
+ *sp = s + 1;
+ break;
+ }
+#ifndef GDTOA_NON_PEDANTIC_NANCHECK
+ do {
+ if (/*(*/ c == ')') {
+ *sp = s + 1;
+ break;
+ }
+ } while((c = *++s));
+#endif
+ return STRTOG_NaN;
+ }
+ havedig++;
+ if (++i > 8) {
+ if (x <= x0)
+ continue;
+ i = 1;
+ *--x = 0;
+ }
+ *x = (*x << 4) | (h & 0xf);
+ }
+ if (!havedig)
+ return STRTOG_NaN;
+ if (x < x1 && i < 8)
+ L_shift(x, x1, i);
+ if (x > x0) {
+ x1 = x0;
+ do *x1++ = *x++;
+ while(x <= xe);
+ do *x1++ = 0;
+ while(x1 <= xe);
+ }
+ else {
+ /* truncate high-order word if necessary */
+ if ( (i = nbits & (ULbits-1)) !=0)
+ *xe &= ((ULong)0xffffffff) >> (ULbits - i);
+ }
+ for(x1 = xe;; --x1) {
+ if (*x1 != 0)
+ break;
+ if (x1 == x0) {
+ *x1 = 1;
+ break;
+ }
+ }
+ return STRTOG_NaNbits;
+}
libc/mingw/gdtoa/misc.c
@@ -0,0 +1,860 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998, 1999 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+
+#if defined(__MINGW32__) || defined(__MINGW64__)
+/* we have to include windows.h before gdtoa
+ headers, otherwise defines cause conflicts. */
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include <windows.h>
+
+#define NLOCKS 2
+
+#ifdef USE_WIN32_SL
+/* Use spin locks. */
+static long dtoa_sl[NLOCKS];
+
+#define ACQUIRE_DTOA_LOCK(n) \
+ while (InterlockedCompareExchange (&dtoa_sl[n], 1, 0) != 0) \
+ Sleep (0);
+#define FREE_DTOA_LOCK(n) InterlockedExchange (&dtoa_sl[n], 0);
+
+#else /* USE_WIN32_SL */
+
+#include <stdlib.h>
+static CRITICAL_SECTION dtoa_CritSec[NLOCKS];
+static long dtoa_CS_init = 0;
+/*
+ 1 = initializing
+ 2 = initialized
+ 3 = deleted
+*/
+static void dtoa_lock_cleanup (void)
+{
+ long last_CS_init = InterlockedExchange (&dtoa_CS_init,3);
+ if (2 == last_CS_init) {
+ int i;
+ for (i = 0; i < NLOCKS; i++)
+ DeleteCriticalSection (&dtoa_CritSec[i]);
+ }
+}
+
+static void dtoa_lock (int n)
+{
+ if (2 == dtoa_CS_init) {
+ EnterCriticalSection (&dtoa_CritSec[n]);
+ return;
+ }
+ else if (0 == dtoa_CS_init) {
+ long last_CS_init = InterlockedExchange (&dtoa_CS_init, 1);
+ if (0 == last_CS_init) {
+ int i;
+ for (i = 0; i < NLOCKS; i++)
+ InitializeCriticalSection (&dtoa_CritSec[i]);
+ atexit (dtoa_lock_cleanup);
+ dtoa_CS_init = 2;
+ }
+ else if (2 == last_CS_init)
+ dtoa_CS_init = 2;
+ }
+ /* Another thread is initializing. Wait. */
+ while (1 == dtoa_CS_init)
+ Sleep (1);
+
+ /* It had better be initialized now. */
+ if (2 == dtoa_CS_init)
+ EnterCriticalSection(&dtoa_CritSec[n]);
+}
+
+static void dtoa_unlock (int n)
+{
+ if (2 == dtoa_CS_init)
+ LeaveCriticalSection (&dtoa_CritSec[n]);
+}
+
+#define ACQUIRE_DTOA_LOCK(n) dtoa_lock(n)
+#define FREE_DTOA_LOCK(n) dtoa_unlock(n)
+#endif /* USE_WIN32_SL */
+
+#endif /* __MINGW32__ / __MINGW64__ */
+
+#include "gdtoaimp.h"
+
+static Bigint *freelist[Kmax+1];
+#ifndef Omit_Private_Memory
+#ifndef PRIVATE_MEM
+#define PRIVATE_MEM 2304
+#endif
+#define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))
+static double private_mem[PRIVATE_mem], *pmem_next = private_mem;
+#endif
+
+Bigint *Balloc (int k)
+{
+ int x;
+ Bigint *rv;
+#ifndef Omit_Private_Memory
+ unsigned int len;
+#endif
+
+ ACQUIRE_DTOA_LOCK(0);
+ /* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */
+ /* but this case seems very unlikely. */
+ if (k <= Kmax && (rv = freelist[k]) !=0) {
+ freelist[k] = rv->next;
+ }
+ else {
+ x = 1 << k;
+#ifdef Omit_Private_Memory
+ rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong));
+ if (rv == NULL)
+ return NULL;
+#else
+ len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
+ /sizeof(double);
+ if (k <= Kmax
+ && (size_t) (pmem_next - private_mem + len) <= PRIVATE_mem)
+ {
+ rv = (Bigint*)pmem_next;
+ pmem_next += len;
+ }
+ else
+ {
+ rv = (Bigint*)MALLOC(len*sizeof(double));
+ if (rv == NULL)
+ return NULL;
+ }
+#endif
+ rv->k = k;
+ rv->maxwds = x;
+ }
+ FREE_DTOA_LOCK(0);
+ rv->sign = rv->wds = 0;
+ return rv;
+}
+
+void Bfree (Bigint *v)
+{
+ if (v) {
+ if (v->k > Kmax)
+ free((void*)v);
+ else {
+ ACQUIRE_DTOA_LOCK(0);
+ v->next = freelist[v->k];
+ freelist[v->k] = v;
+ FREE_DTOA_LOCK(0);
+ }
+ }
+}
+
+/* lo0bits(): Shift y so lowest bit is 1 and return the
+ * number of bits y was shifted.
+ * With GCC, we use an inline wrapper for __builtin_clz()
+ */
+#ifndef __GNUC__
+int lo0bits (ULong *y)
+{
+ int k;
+ ULong x = *y;
+
+ if (x & 7) {
+ if (x & 1)
+ return 0;
+ if (x & 2) {
+ *y = x >> 1;
+ return 1;
+ }
+ *y = x >> 2;
+ return 2;
+ }
+ k = 0;
+ if (!(x & 0xffff)) {
+ k = 16;
+ x >>= 16;
+ }
+ if (!(x & 0xff)) {
+ k += 8;
+ x >>= 8;
+ }
+ if (!(x & 0xf)) {
+ k += 4;
+ x >>= 4;
+ }
+ if (!(x & 0x3)) {
+ k += 2;
+ x >>= 2;
+ }
+ if (!(x & 1)) {
+ k++;
+ x >>= 1;
+ if (!x)
+ return 32;
+ }
+ *y = x;
+ return k;
+}
+#endif /* __GNUC__ */
+
+Bigint *multadd (Bigint *b, int m, int a) /* multiply by m and add a */
+{
+ int i, wds;
+#ifdef ULLong
+ ULong *x;
+ ULLong carry, y;
+#else
+ ULong carry, *x, y;
+#ifdef Pack_32
+ ULong xi, z;
+#endif
+#endif
+ Bigint *b1;
+
+ wds = b->wds;
+ x = b->x;
+ i = 0;
+ carry = a;
+ do {
+#ifdef ULLong
+ y = *x * (ULLong)m + carry;
+ carry = y >> 32;
+ *x++ = y & 0xffffffffUL;
+#else
+#ifdef Pack_32
+ xi = *x;
+ y = (xi & 0xffff) * m + carry;
+ z = (xi >> 16) * m + (y >> 16);
+ carry = z >> 16;
+ *x++ = (z << 16) + (y & 0xffff);
+#else
+ y = *x * m + carry;
+ carry = y >> 16;
+ *x++ = y & 0xffff;
+#endif
+#endif
+ } while(++i < wds);
+ if (carry) {
+ if (wds >= b->maxwds) {
+ b1 = Balloc(b->k+1);
+ if (b1 == NULL)
+ return NULL;
+ Bcopy(b1, b);
+ Bfree(b);
+ b = b1;
+ }
+ b->x[wds++] = carry;
+ b->wds = wds;
+ }
+ return b;
+}
+
+/* hi0bits();
+ * With GCC, we use an inline wrapper for __builtin_clz()
+ */
+#ifndef __GNUC__
+int hi0bits_D2A (ULong x)
+{
+ int k = 0;
+
+ if (!(x & 0xffff0000)) {
+ k = 16;
+ x <<= 16;
+ }
+ if (!(x & 0xff000000)) {
+ k += 8;
+ x <<= 8;
+ }
+ if (!(x & 0xf0000000)) {
+ k += 4;
+ x <<= 4;
+ }
+ if (!(x & 0xc0000000)) {
+ k += 2;
+ x <<= 2;
+ }
+ if (!(x & 0x80000000)) {
+ k++;
+ if (!(x & 0x40000000))
+ return 32;
+ }
+ return k;
+}
+#endif /* __GNUC__ */
+
+Bigint *i2b (int i)
+{
+ Bigint *b;
+
+ b = Balloc(1);
+ if (b == NULL)
+ return NULL;
+ b->x[0] = i;
+ b->wds = 1;
+ return b;
+}
+
+Bigint *mult (Bigint *a, Bigint *b)
+{
+ Bigint *c;
+ int k, wa, wb, wc;
+ ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
+ ULong y;
+#ifdef ULLong
+ ULLong carry, z;
+#else
+ ULong carry, z;
+#ifdef Pack_32
+ ULong z2;
+#endif
+#endif
+
+ if (a->wds < b->wds) {
+ c = a;
+ a = b;
+ b = c;
+ }
+ k = a->k;
+ wa = a->wds;
+ wb = b->wds;
+ wc = wa + wb;
+ if (wc > a->maxwds)
+ k++;
+ c = Balloc(k);
+ if (c == NULL)
+ return NULL;
+ for(x = c->x, xa = x + wc; x < xa; x++)
+ *x = 0;
+ xa = a->x;
+ xae = xa + wa;
+ xb = b->x;
+ xbe = xb + wb;
+ xc0 = c->x;
+#ifdef ULLong
+ for(; xb < xbe; xc0++) {
+ if ( (y = *xb++) !=0) {
+ x = xa;
+ xc = xc0;
+ carry = 0;
+ do {
+ z = *x++ * (ULLong)y + *xc + carry;
+ carry = z >> 32;
+ *xc++ = z & 0xffffffffUL;
+ } while(x < xae);
+ *xc = carry;
+ }
+ }
+#else
+#ifdef Pack_32
+ for(; xb < xbe; xb++, xc0++) {
+ if ( (y = *xb & 0xffff) !=0) {
+ x = xa;
+ xc = xc0;
+ carry = 0;
+ do {
+ z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
+ carry = z >> 16;
+ z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
+ carry = z2 >> 16;
+ Storeinc(xc, z2, z);
+ } while(x < xae);
+ *xc = carry;
+ }
+ if ( (y = *xb >> 16) !=0) {
+ x = xa;
+ xc = xc0;
+ carry = 0;
+ z2 = *xc;
+ do {
+ z = (*x & 0xffff) * y + (*xc >> 16) + carry;
+ carry = z >> 16;
+ Storeinc(xc, z, z2);
+ z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
+ carry = z2 >> 16;
+ } while(x < xae);
+ *xc = z2;
+ }
+ }
+#else
+ for(; xb < xbe; xc0++) {
+ if ( (y = *xb++) !=0) {
+ x = xa;
+ xc = xc0;
+ carry = 0;
+ do {
+ z = *x++ * y + *xc + carry;
+ carry = z >> 16;
+ *xc++ = z & 0xffff;
+ } while(x < xae);
+ *xc = carry;
+ }
+ }
+#endif
+#endif
+ for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
+ c->wds = wc;
+ return c;
+}
+
+static Bigint *p5s;
+
+Bigint *pow5mult (Bigint *b, int k)
+{
+ Bigint *b1, *p5, *p51;
+ int i;
+ static int p05[3] = { 5, 25, 125 };
+
+ if ( (i = k & 3) !=0)
+ {
+ b = multadd(b, p05[i-1], 0);
+ if (b == NULL)
+ return NULL;
+ }
+ if (!(k >>= 2))
+ return b;
+ if ((p5 = p5s) == 0) {
+ /* first time */
+#ifdef MULTIPLE_THREADS
+ ACQUIRE_DTOA_LOCK(1);
+ if (!(p5 = p5s)) {
+ p5 = p5s = i2b(625);
+ if (p5 == NULL)
+ return NULL;
+ p5->next = 0;
+ }
+ FREE_DTOA_LOCK(1);
+#else
+ p5 = p5s = i2b(625);
+ if (p5 == NULL)
+ return NULL;
+ p5->next = 0;
+#endif
+ }
+ for(;;) {
+ if (k & 1) {
+ b1 = mult(b, p5);
+ if (b1 == NULL)
+ return NULL;
+ Bfree(b);
+ b = b1;
+ }
+ if (!(k >>= 1))
+ break;
+ if ((p51 = p5->next) == 0) {
+#ifdef MULTIPLE_THREADS
+ ACQUIRE_DTOA_LOCK(1);
+ if (!(p51 = p5->next)) {
+ p51 = p5->next = mult(p5,p5);
+ if (p51 == NULL)
+ return NULL;
+ p51->next = 0;
+ }
+ FREE_DTOA_LOCK(1);
+#else
+ p51 = p5->next = mult(p5,p5);
+ if (p51 == NULL)
+ return NULL;
+ p51->next = 0;
+#endif
+ }
+ p5 = p51;
+ }
+ return b;
+}
+
+Bigint *lshift (Bigint *b, int k)
+{
+ int i, k1, n, n1;
+ Bigint *b1;
+ ULong *x, *x1, *xe, z;
+
+ n = k >> kshift;
+ k1 = b->k;
+ n1 = n + b->wds + 1;
+ for(i = b->maxwds; n1 > i; i <<= 1)
+ k1++;
+ b1 = Balloc(k1);
+ if (b1 == NULL)
+ return NULL;
+ x1 = b1->x;
+ for(i = 0; i < n; i++)
+ *x1++ = 0;
+ x = b->x;
+ xe = x + b->wds;
+ if (k &= kmask) {
+#ifdef Pack_32
+ k1 = 32 - k;
+ z = 0;
+ do {
+ *x1++ = *x << k | z;
+ z = *x++ >> k1;
+ } while(x < xe);
+ if ((*x1 = z) !=0)
+ ++n1;
+#else
+ k1 = 16 - k;
+ z = 0;
+ do {
+ *x1++ = *x << k & 0xffff | z;
+ z = *x++ >> k1;
+ } while(x < xe);
+ if (*x1 = z)
+ ++n1;
+#endif
+ }
+ else do
+ *x1++ = *x++;
+ while(x < xe);
+ b1->wds = n1 - 1;
+ Bfree(b);
+ return b1;
+}
+
+int cmp (Bigint *a, Bigint *b)
+{
+ ULong *xa, *xa0, *xb, *xb0;
+ int i, j;
+
+ i = a->wds;
+ j = b->wds;
+#ifdef DEBUG
+ if (i > 1 && !a->x[i-1])
+ Bug("cmp called with a->x[a->wds-1] == 0");
+ if (j > 1 && !b->x[j-1])
+ Bug("cmp called with b->x[b->wds-1] == 0");
+#endif
+ if (i -= j)
+ return i;
+ xa0 = a->x;
+ xa = xa0 + j;
+ xb0 = b->x;
+ xb = xb0 + j;
+ for(;;) {
+ if (*--xa != *--xb)
+ return *xa < *xb ? -1 : 1;
+ if (xa <= xa0)
+ break;
+ }
+ return 0;
+}
+
+Bigint *diff (Bigint *a, Bigint *b)
+{
+ Bigint *c;
+ int i, wa, wb;
+ ULong *xa, *xae, *xb, *xbe, *xc;
+#ifdef ULLong
+ ULLong borrow, y;
+#else
+ ULong borrow, y;
+#ifdef Pack_32
+ ULong z;
+#endif
+#endif
+
+ i = cmp(a,b);
+ if (!i) {
+ c = Balloc(0);
+ if (c == NULL)
+ return NULL;
+ c->wds = 1;
+ c->x[0] = 0;
+ return c;
+ }
+ if (i < 0) {
+ c = a;
+ a = b;
+ b = c;
+ i = 1;
+ }
+ else
+ i = 0;
+ c = Balloc(a->k);
+ if (c == NULL)
+ return NULL;
+ c->sign = i;
+ wa = a->wds;
+ xa = a->x;
+ xae = xa + wa;
+ wb = b->wds;
+ xb = b->x;
+ xbe = xb + wb;
+ xc = c->x;
+ borrow = 0;
+#ifdef ULLong
+ do {
+ y = (ULLong)*xa++ - *xb++ - borrow;
+ borrow = y >> 32 & 1UL;
+ *xc++ = y & 0xffffffffUL;
+ } while(xb < xbe);
+ while(xa < xae) {
+ y = *xa++ - borrow;
+ borrow = y >> 32 & 1UL;
+ *xc++ = y & 0xffffffffUL;
+ }
+#else
+#ifdef Pack_32
+ do {
+ y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
+ borrow = (y & 0x10000) >> 16;
+ z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
+ borrow = (z & 0x10000) >> 16;
+ Storeinc(xc, z, y);
+ } while(xb < xbe);
+ while(xa < xae) {
+ y = (*xa & 0xffff) - borrow;
+ borrow = (y & 0x10000) >> 16;
+ z = (*xa++ >> 16) - borrow;
+ borrow = (z & 0x10000) >> 16;
+ Storeinc(xc, z, y);
+ }
+#else
+ do {
+ y = *xa++ - *xb++ - borrow;
+ borrow = (y & 0x10000) >> 16;
+ *xc++ = y & 0xffff;
+ } while(xb < xbe);
+ while(xa < xae) {
+ y = *xa++ - borrow;
+ borrow = (y & 0x10000) >> 16;
+ *xc++ = y & 0xffff;
+ }
+#endif
+#endif
+ while(!*--xc)
+ wa--;
+ c->wds = wa;
+ return c;
+}
+
+double b2d (Bigint *a, int *e)
+{
+ ULong *xa, *xa0, w, y, z;
+ int k;
+ union _dbl_union d;
+#define d0 word0(&d)
+#define d1 word1(&d)
+
+ xa0 = a->x;
+ xa = xa0 + a->wds;
+ y = *--xa;
+#ifdef DEBUG
+ if (!y) Bug("zero y in b2d");
+#endif
+ k = hi0bits(y);
+ *e = 32 - k;
+#ifdef Pack_32
+ if (k < Ebits) {
+ d0 = Exp_1 | y >> (Ebits - k);
+ w = xa > xa0 ? *--xa : 0;
+ d1 = y << ((32-Ebits) + k) | w >> (Ebits - k);
+ goto ret_d;
+ }
+ z = xa > xa0 ? *--xa : 0;
+ if (k -= Ebits) {
+ d0 = Exp_1 | y << k | z >> (32 - k);
+ y = xa > xa0 ? *--xa : 0;
+ d1 = z << k | y >> (32 - k);
+ }
+ else {
+ d0 = Exp_1 | y;
+ d1 = z;
+ }
+#else
+ if (k < Ebits + 16) {
+ z = xa > xa0 ? *--xa : 0;
+ d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k;
+ w = xa > xa0 ? *--xa : 0;
+ y = xa > xa0 ? *--xa : 0;
+ d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k;
+ goto ret_d;
+ }
+ z = xa > xa0 ? *--xa : 0;
+ w = xa > xa0 ? *--xa : 0;
+ k -= Ebits + 16;
+ d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k;
+ y = xa > xa0 ? *--xa : 0;
+ d1 = w << k + 16 | y << k;
+#endif
+ ret_d:
+ return dval(&d);
+#undef d0
+#undef d1
+}
+
+Bigint *d2b (double dd, int *e, int *bits)
+{
+ Bigint *b;
+ union _dbl_union d;
+#ifndef Sudden_Underflow
+ int i;
+#endif
+ int de, k;
+ ULong *x, y, z;
+#define d0 word0(&d)
+#define d1 word1(&d)
+ d.d = dd;
+
+#ifdef Pack_32
+ b = Balloc(1);
+#else
+ b = Balloc(2);
+#endif
+ if (b == NULL)
+ return NULL;
+ x = b->x;
+
+ z = d0 & Frac_mask;
+ d0 &= 0x7fffffff; /* clear sign bit, which we ignore */
+#ifdef Sudden_Underflow
+ de = (int)(d0 >> Exp_shift);
+ z |= Exp_msk11;
+#else
+ if ( (de = (int)(d0 >> Exp_shift)) !=0)
+ z |= Exp_msk1;
+#endif
+#ifdef Pack_32
+ if ( (y = d1) !=0) {
+ if ( (k = lo0bits(&y)) !=0) {
+ x[0] = y | z << (32 - k);
+ z >>= k;
+ }
+ else
+ x[0] = y;
+#ifndef Sudden_Underflow
+ i =
+#endif
+ b->wds = (x[1] = z) !=0 ? 2 : 1;
+ }
+ else {
+ k = lo0bits(&z);
+ x[0] = z;
+#ifndef Sudden_Underflow
+ i =
+#endif
+ b->wds = 1;
+ k += 32;
+ }
+#else
+ if ( (y = d1) !=0) {
+ if ( (k = lo0bits(&y)) !=0)
+ if (k >= 16) {
+ x[0] = y | z << 32 - k & 0xffff;
+ x[1] = z >> k - 16 & 0xffff;
+ x[2] = z >> k;
+ i = 2;
+ }
+ else {
+ x[0] = y & 0xffff;
+ x[1] = y >> 16 | z << 16 - k & 0xffff;
+ x[2] = z >> k & 0xffff;
+ x[3] = z >> k+16;
+ i = 3;
+ }
+ else {
+ x[0] = y & 0xffff;
+ x[1] = y >> 16;
+ x[2] = z & 0xffff;
+ x[3] = z >> 16;
+ i = 3;
+ }
+ }
+ else {
+#ifdef DEBUG
+ if (!z)
+ Bug("Zero passed to d2b");
+#endif
+ k = lo0bits(&z);
+ if (k >= 16) {
+ x[0] = z;
+ i = 0;
+ }
+ else {
+ x[0] = z & 0xffff;
+ x[1] = z >> 16;
+ i = 1;
+ }
+ k += 32;
+ }
+ while(!x[i])
+ --i;
+ b->wds = i + 1;
+#endif
+#ifndef Sudden_Underflow
+ if (de) {
+#endif
+ *e = de - Bias - (P-1) + k;
+ *bits = P - k;
+#ifndef Sudden_Underflow
+ }
+ else {
+ *e = de - Bias - (P-1) + 1 + k;
+#ifdef Pack_32
+ *bits = 32*i - hi0bits(x[i-1]);
+#else
+ *bits = (i+2)*16 - hi0bits(x[i]);
+#endif
+ }
+#endif
+ return b;
+#undef d0
+#undef d1
+}
+
+const double
+bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
+const double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128, 1e-256 };
+
+const double
+tens[] = {
+ 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
+ 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
+ 1e20, 1e21, 1e22
+};
+
+char *strcp_D2A (char *a, const char *b)
+{
+ while((*a = *b++))
+ a++;
+ return a;
+}
+
+#ifdef NO_STRING_H
+void *memcpy_D2A (void *a1, void *b1, size_t len)
+{
+ char *a = (char*)a1, *ae = a + len;
+ char *b = (char*)b1, *a0 = a;
+ while(a < ae)
+ *a++ = *b++;
+ return a0;
+}
+#endif /* NO_STRING_H */
+
libc/mingw/gdtoa/qnan.c
@@ -0,0 +1,116 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 2005 by David M. Gay
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that the copyright notice and this permission notice and warranty
+disclaimer appear in supporting documentation, and that the name of
+the author or any of his current or former employers not be used in
+advertising or publicity pertaining to distribution of the software
+without specific, written prior permission.
+
+THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
+NO EVENT SHALL THE AUTHOR OR ANY OF HIS CURRENT OR FORMER EMPLOYERS BE
+LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
+DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+/* Program to compute quiet NaNs of various precisions (float, */
+/* double, and perhaps long double) on the current system, */
+/* provided the system uses binary IEEE (P754) arithmetic. */
+/* Note that one system's quiet NaN may be a signaling NaN on */
+/* another system. The IEEE arithmetic standards (P754, P854) */
+/* do not specify how to distinguish signaling NaNs from quiet */
+/* ones, and this detail varies across systems. The computed */
+/* NaN values are encoded in #defines for values for an */
+/* unsigned 32-bit integer type, called Ulong below, and */
+/* (for long double) perhaps as unsigned short values. Once */
+/* upon a time, there were PC compilers for Intel CPUs that */
+/* had sizeof(long double) = 10. Are such compilers still */
+/* distributed? */
+
+#include <stdio.h>
+#include "gd_arith.h"
+
+#ifndef Long
+#define Long long
+#endif
+
+typedef unsigned Long Ulong;
+
+#undef HAVE_IEEE
+#ifdef IEEE_8087
+#define _0 1
+#define _1 0
+#define HAVE_IEEE
+#endif
+#ifdef IEEE_MC68k
+#define _0 0
+#define _1 1
+#define HAVE_IEEE
+#endif
+
+#define UL (unsigned long)
+
+#ifdef MINGW_BUILD_GEN
+ int
+main(void)
+{
+#ifdef HAVE_IEEE
+ typedef union {
+ float f;
+ double d;
+ Ulong L[4];
+#ifndef NO_LONG_LONG
+/* need u[8] instead of u[5] for 64 bit */
+ unsigned short u[8];
+ long double D;
+#endif
+ } U;
+ U a, b, c;
+ int i;
+ a.L[0]=a.L[1]=a.L[2]=a.L[3]=0;
+ b.L[0]=b.L[1]=b.L[2]=b.L[3]=0;
+ c.L[0]=c.L[1]=c.L[2]=c.L[3]=0;
+
+ a.L[0] = b.L[0] = 0x7f800000;
+ c.f = a.f - b.f;
+ printf("#define f_QNAN 0x%lx\n", UL c.L[0]);
+ a.L[_0] = b.L[_0] = 0x7ff00000;
+ a.L[_1] = b.L[_1] = 0;
+ c.d = a.d - b.d; /* quiet NaN */
+ printf("#define d_QNAN0 0x%lx\n", UL c.L[0]);
+ printf("#define d_QNAN1 0x%lx\n", UL c.L[1]);
+#ifdef NO_LONG_LONG
+ for(i = 0; i < 4; i++)
+ printf("#define ld_QNAN%d 0xffffffff\n", i);
+ for(i = 0; i < 5; i++)
+ printf("#define ldus_QNAN%d 0xffff\n", i);
+#else
+ b.D = c.D = a.d;
+ if (printf("") < 0)
+ c.D = 37; /* never executed; just defeat optimization */
+ a.L[2] = a.L[3] = 0;
+ a.D = b.D - c.D;
+ for(i = 0; i < 4; i++)
+ printf("#define ld_QNAN%d 0x%lx\n", i, UL a.L[i]);
+ for(i = 0; i < 5; i++)
+ printf("#define ldus_QNAN%d 0x%x\n", i, a.u[i]);
+#endif
+#endif /* HAVE_IEEE */
+ return 0;
+ }
+#endif
libc/mingw/gdtoa/smisc.c
@@ -0,0 +1,149 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998, 1999 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+Bigint *s2b (const char *s, int nd0, int nd, ULong y9, int dplen)
+{
+ Bigint *b;
+ int i, k;
+ Long x, y;
+
+ x = (nd + 8) / 9;
+ for(k = 0, y = 1; x > y; y <<= 1, k++) ;
+#ifdef Pack_32
+ b = Balloc(k);
+ b->x[0] = y9;
+ b->wds = 1;
+#else
+ b = Balloc(k+1);
+ b->x[0] = y9 & 0xffff;
+ b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
+#endif
+
+ i = 9;
+ if (9 < nd0) {
+ s += 9;
+ do b = multadd(b, 10, *s++ - '0');
+ while(++i < nd0);
+ s += dplen;
+ }
+ else
+ s += dplen + 9;
+ for(; i < nd; i++)
+ b = multadd(b, 10, *s++ - '0');
+ return b;
+}
+
+double ratio (Bigint *a, Bigint *b)
+{
+ union _dbl_union da, db;
+ int k, ka, kb;
+
+ dval(&da) = b2d(a, &ka);
+ dval(&db) = b2d(b, &kb);
+ k = ka - kb + ULbits*(a->wds - b->wds);
+ if (k > 0)
+ word0(&da) += k*Exp_msk1;
+ else {
+ k = -k;
+ word0(&db) += k*Exp_msk1;
+ }
+ return dval(&da) / dval(&db);
+}
+
+#ifdef INFNAN_CHECK
+
+int match (const char **sp, char *t)
+{
+ int c, d;
+ const char *s = *sp;
+
+ while( (d = *t++) !=0) {
+ if ((c = *++s) >= 'A' && c <= 'Z')
+ c += 'a' - 'A';
+ if (c != d)
+ return 0;
+ }
+ *sp = s + 1;
+ return 1;
+}
+#endif /* INFNAN_CHECK */
+
+void copybits (ULong *c, int n, Bigint *b)
+{
+ ULong *ce, *x, *xe;
+#ifdef Pack_16
+ int nw, nw1;
+#endif
+
+ ce = c + ((n-1) >> kshift) + 1;
+ x = b->x;
+#ifdef Pack_32
+ xe = x + b->wds;
+ while(x < xe)
+ *c++ = *x++;
+#else
+ nw = b->wds;
+ nw1 = nw & 1;
+ for(xe = x + (nw - nw1); x < xe; x += 2)
+ Storeinc(c, x[1], x[0]);
+ if (nw1)
+ *c++ = *x;
+#endif
+ while(c < ce)
+ *c++ = 0;
+}
+
+ULong any_on (Bigint *b, int k)
+{
+ int n, nwds;
+ ULong *x, *x0, x1, x2;
+
+ x = b->x;
+ nwds = b->wds;
+ n = k >> kshift;
+ if (n > nwds)
+ n = nwds;
+ else if (n < nwds && (k &= kmask)) {
+ x1 = x2 = x[n];
+ x1 >>= k;
+ x1 <<= k;
+ if (x1 != x2)
+ return 1;
+ }
+ x0 = x;
+ x += n;
+ while(x > x0)
+ if (*--x)
+ return 1;
+ return 0;
+}
libc/mingw/gdtoa/strtodg.c
@@ -0,0 +1,979 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998-2001 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+#ifdef USE_LOCALE
+#include "locale.h"
+#endif
+
+static const int
+fivesbits[] = { 0, 3, 5, 7, 10, 12, 14, 17, 19, 21,
+ 24, 26, 28, 31, 33, 35, 38, 40, 42, 45,
+ 47, 49, 52
+};
+
+Bigint *increment (Bigint *b)
+{
+ ULong *x, *xe;
+ Bigint *b1;
+#ifdef Pack_16
+ ULong carry = 1, y;
+#endif
+
+ x = b->x;
+ xe = x + b->wds;
+#ifdef Pack_32
+ do {
+ if (*x < (ULong)0xffffffffL) {
+ ++*x;
+ return b;
+ }
+ *x++ = 0;
+ } while(x < xe);
+#else
+ do {
+ y = *x + carry;
+ carry = y >> 16;
+ *x++ = y & 0xffff;
+ if (!carry)
+ return b;
+ } while(x < xe);
+ if (carry)
+#endif
+ {
+ if (b->wds >= b->maxwds) {
+ b1 = Balloc(b->k+1);
+ Bcopy(b1,b);
+ Bfree(b);
+ b = b1;
+ }
+ b->x[b->wds++] = 1;
+ }
+ return b;
+}
+
+void decrement (Bigint *b)
+{
+ ULong *x, *xe;
+#ifdef Pack_16
+ ULong borrow = 1, y;
+#endif
+
+ x = b->x;
+ xe = x + b->wds;
+#ifdef Pack_32
+ do {
+ if (*x) {
+ --*x;
+ break;
+ }
+ *x++ = 0xffffffffL;
+ } while(x < xe);
+#else
+ do {
+ y = *x - borrow;
+ borrow = (y & 0x10000) >> 16;
+ *x++ = y & 0xffff;
+ } while(borrow && x < xe);
+#endif
+}
+
+static int all_on (Bigint *b, int n)
+{
+ ULong *x, *xe;
+
+ x = b->x;
+ xe = x + (n >> kshift);
+ while(x < xe)
+ if ((*x++ & ALL_ON) != ALL_ON)
+ return 0;
+ if (n &= kmask)
+ return ((*x | (ALL_ON << n)) & ALL_ON) == ALL_ON;
+ return 1;
+}
+
+Bigint *set_ones (Bigint *b, int n)
+{
+ int k;
+ ULong *x, *xe;
+
+ k = (n + ((1 << kshift) - 1)) >> kshift;
+ if (b->k < k) {
+ Bfree(b);
+ b = Balloc(k);
+ }
+ k = n >> kshift;
+ if (n &= kmask)
+ k++;
+ b->wds = k;
+ x = b->x;
+ xe = x + k;
+ while(x < xe)
+ *x++ = ALL_ON;
+ if (n)
+ x[-1] >>= ULbits - n;
+ return b;
+}
+
+static int rvOK (dbl_union *d, FPI *fpi, Long *expo, ULong *bits,
+ int exact, int rd, int *irv)
+{
+ Bigint *b;
+ ULong carry, inex, lostbits;
+ int bdif, e, j, k, k1, nb, rv;
+
+ carry = rv = 0;
+ b = d2b(dval(d), &e, &bdif);
+ bdif -= nb = fpi->nbits;
+ e += bdif;
+ if (bdif <= 0) {
+ if (exact)
+ goto trunc;
+ goto ret;
+ }
+ if (P == nb) {
+ if (
+#ifndef IMPRECISE_INEXACT
+ exact &&
+#endif
+ fpi->rounding ==
+#ifdef RND_PRODQUOT
+ FPI_Round_near
+#else
+ Flt_Rounds
+#endif
+ ) goto trunc;
+ goto ret;
+ }
+ switch(rd) {
+ case 1: /* round down (toward -Infinity) */
+ goto trunc;
+ case 2: /* round up (toward +Infinity) */
+ break;
+ default: /* round near */
+ k = bdif - 1;
+ if (k < 0)
+ goto trunc;
+ if (!k) {
+ if (!exact)
+ goto ret;
+ if (b->x[0] & 2)
+ break;
+ goto trunc;
+ }
+ if (b->x[k>>kshift] & ((ULong)1 << (k & kmask)))
+ break;
+ goto trunc;
+ }
+ /* "break" cases: round up 1 bit, then truncate; bdif > 0 */
+ carry = 1;
+ trunc:
+ inex = lostbits = 0;
+ if (bdif > 0) {
+ if ( (lostbits = any_on(b, bdif)) !=0)
+ inex = STRTOG_Inexlo;
+ rshift(b, bdif);
+ if (carry) {
+ inex = STRTOG_Inexhi;
+ b = increment(b);
+ if ( (j = nb & kmask) !=0)
+ j = ULbits - j;
+ if (hi0bits(b->x[b->wds - 1]) != j) {
+ if (!lostbits)
+ lostbits = b->x[0] & 1;
+ rshift(b, 1);
+ e++;
+ }
+ }
+ }
+ else if (bdif < 0)
+ b = lshift(b, -bdif);
+ if (e < fpi->emin) {
+ k = fpi->emin - e;
+ e = fpi->emin;
+ if (k > nb || fpi->sudden_underflow) {
+ b->wds = inex = 0;
+ *irv = STRTOG_Underflow | STRTOG_Inexlo;
+ }
+ else {
+ k1 = k - 1;
+ if (k1 > 0 && !lostbits)
+ lostbits = any_on(b, k1);
+ if (!lostbits && !exact)
+ goto ret;
+ lostbits |=
+ carry = b->x[k1>>kshift] & (1 << (k1 & kmask));
+ rshift(b, k);
+ *irv = STRTOG_Denormal;
+ if (carry) {
+ b = increment(b);
+ inex = STRTOG_Inexhi | STRTOG_Underflow;
+ }
+ else if (lostbits)
+ inex = STRTOG_Inexlo | STRTOG_Underflow;
+ }
+ }
+ else if (e > fpi->emax) {
+ e = fpi->emax + 1;
+ *irv = STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi;
+ SET_ERRNO(ERANGE);
+ b->wds = inex = 0;
+ }
+ *expo = e;
+ copybits(bits, nb, b);
+ *irv |= inex;
+ rv = 1;
+ ret:
+ Bfree(b);
+ return rv;
+}
+
+static int mantbits (dbl_union *d)
+{
+ ULong L;
+ if ( (L = word1(d)) !=0)
+ return P - lo0bits(&L);
+ L = word0(d) | Exp_msk1;
+ return P - 32 - lo0bits(&L);
+}
+
+int __strtodg (const char *s00, char **se, FPI *fpi, Long *expo, ULong *bits)
+{
+ int abe, abits, asub;
+ int bb0, bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, decpt, denorm;
+ int dsign, e, e1, e2, emin, esign, finished, i, inex, irv;
+ int j, k, nbits, nd, nd0, nf, nz, nz0, rd, rvbits, rve, rve1, sign;
+ int sudden_underflow;
+ const char *s, *s0, *s1;
+ double adj0, tol;
+ Long L;
+ union _dbl_union adj, rv;
+ ULong *b, *be, y, z;
+ Bigint *ab, *bb, *bb1, *bd, *bd0, *bs, *delta, *rvb, *rvb0;
+#ifdef USE_LOCALE /*{{*/
+#ifdef NO_LOCALE_CACHE
+ char *decimalpoint = localeconv()->decimal_point;
+ int dplen = strlen(decimalpoint);
+#else
+ char *decimalpoint;
+ static char *decimalpoint_cache;
+ static int dplen;
+ if (!(s0 = decimalpoint_cache)) {
+ s0 = localeconv()->decimal_point;
+ if ((decimalpoint_cache = (char*)MALLOC(strlen(s0) + 1))) {
+ strcpy(decimalpoint_cache, s0);
+ s0 = decimalpoint_cache;
+ }
+ dplen = strlen(s0);
+ }
+ decimalpoint = (char*)s0;
+#endif /*NO_LOCALE_CACHE*/
+#else /*USE_LOCALE}{*/
+#define dplen 1
+#endif /*USE_LOCALE}}*/
+
+ irv = STRTOG_Zero;
+ denorm = sign = nz0 = nz = 0;
+ dval(&rv) = 0.;
+ rvb = 0;
+ nbits = fpi->nbits;
+ for(s = s00;;s++) switch(*s) {
+ case '-':
+ sign = 1;
+ /* no break */
+ case '+':
+ if (*++s)
+ goto break2;
+ /* no break */
+ case 0:
+ sign = 0;
+ irv = STRTOG_NoNumber;
+ s = s00;
+ goto ret;
+ case '\t':
+ case '\n':
+ case '\v':
+ case '\f':
+ case '\r':
+ case ' ':
+ continue;
+ default:
+ goto break2;
+ }
+ break2:
+ if (*s == '0') {
+#ifndef NO_HEX_FP
+ switch(s[1]) {
+ case 'x':
+ case 'X':
+ irv = gethex(&s, fpi, expo, &rvb, sign);
+ if (irv == STRTOG_NoNumber) {
+ s = s00;
+ sign = 0;
+ }
+ goto ret;
+ }
+#endif
+ nz0 = 1;
+ while(*++s == '0') ;
+ if (!*s)
+ goto ret;
+ }
+ sudden_underflow = fpi->sudden_underflow;
+ s0 = s;
+ y = z = 0;
+ for(decpt = nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
+ if (nd < 9)
+ y = 10*y + c - '0';
+ else if (nd < 16)
+ z = 10*z + c - '0';
+ nd0 = nd;
+#ifdef USE_LOCALE
+ if (c == *decimalpoint) {
+ for(i = 1; decimalpoint[i]; ++i)
+ if (s[i] != decimalpoint[i])
+ goto dig_done;
+ s += i;
+ c = *s;
+#else
+ if (c == '.') {
+ c = *++s;
+#endif
+ decpt = 1;
+ if (!nd) {
+ for(; c == '0'; c = *++s)
+ nz++;
+ if (c > '0' && c <= '9') {
+ s0 = s;
+ nf += nz;
+ nz = 0;
+ goto have_dig;
+ }
+ goto dig_done;
+ }
+ for(; c >= '0' && c <= '9'; c = *++s) {
+ have_dig:
+ nz++;
+ if (c -= '0') {
+ nf += nz;
+ for(i = 1; i < nz; i++)
+ if (nd++ < 9)
+ y *= 10;
+ else if (nd <= DBL_DIG + 1)
+ z *= 10;
+ if (nd++ < 9)
+ y = 10*y + c;
+ else if (nd <= DBL_DIG + 1)
+ z = 10*z + c;
+ nz = 0;
+ }
+ }
+ }/*}*/
+ dig_done:
+ e = 0;
+ if (c == 'e' || c == 'E') {
+ if (!nd && !nz && !nz0) {
+ irv = STRTOG_NoNumber;
+ s = s00;
+ goto ret;
+ }
+ s00 = s;
+ esign = 0;
+ switch(c = *++s) {
+ case '-':
+ esign = 1;
+ case '+':
+ c = *++s;
+ }
+ if (c >= '0' && c <= '9') {
+ while(c == '0')
+ c = *++s;
+ if (c > '0' && c <= '9') {
+ L = c - '0';
+ s1 = s;
+ while((c = *++s) >= '0' && c <= '9')
+ L = 10*L + c - '0';
+ if (s - s1 > 8 || L > 19999)
+ /* Avoid confusion from exponents
+ * so large that e might overflow.
+ */
+ e = 19999; /* safe for 16 bit ints */
+ else
+ e = (int)L;
+ if (esign)
+ e = -e;
+ }
+ else
+ e = 0;
+ }
+ else
+ s = s00;
+ }
+ if (!nd) {
+ if (!nz && !nz0) {
+#ifdef INFNAN_CHECK
+ /* Check for Nan and Infinity */
+ if (!decpt)
+ switch(c) {
+ case 'i':
+ case 'I':
+ if (match(&s,"nf")) {
+ --s;
+ if (!match(&s,"inity"))
+ ++s;
+ irv = STRTOG_Infinite;
+ goto infnanexp;
+ }
+ break;
+ case 'n':
+ case 'N':
+ if (match(&s, "an")) {
+ irv = STRTOG_NaN;
+ *expo = fpi->emax + 1;
+#ifndef No_Hex_NaN
+ if (*s == '(') /*)*/
+ irv = hexnan(&s, fpi, bits);
+#endif
+ goto infnanexp;
+ }
+ }
+#endif /* INFNAN_CHECK */
+ irv = STRTOG_NoNumber;
+ s = s00;
+ }
+ goto ret;
+ }
+
+ irv = STRTOG_Normal;
+ e1 = e -= nf;
+ rd = 0;
+ switch(fpi->rounding & 3) {
+ case FPI_Round_up:
+ rd = 2 - sign;
+ break;
+ case FPI_Round_zero:
+ rd = 1;
+ break;
+ case FPI_Round_down:
+ rd = 1 + sign;
+ }
+
+ /* Now we have nd0 digits, starting at s0, followed by a
+ * decimal point, followed by nd-nd0 digits. The number we're
+ * after is the integer represented by those digits times
+ * 10**e */
+
+ if (!nd0)
+ nd0 = nd;
+ k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
+ dval(&rv) = y;
+ if (k > 9)
+ dval(&rv) = tens[k - 9] * dval(&rv) + z;
+ bd0 = 0;
+ if (nbits <= P && nd <= DBL_DIG) {
+ if (!e) {
+ if (rvOK(&rv, fpi, expo, bits, 1, rd, &irv))
+ goto ret;
+ }
+ else if (e > 0) {
+ if (e <= Ten_pmax) {
+ i = fivesbits[e] + mantbits(&rv) <= P;
+ /* rv = */ rounded_product(dval(&rv), tens[e]);
+ if (rvOK(&rv, fpi, expo, bits, i, rd, &irv))
+ goto ret;
+ e1 -= e;
+ goto rv_notOK;
+ }
+ i = DBL_DIG - nd;
+ if (e <= Ten_pmax + i) {
+ /* A fancier test would sometimes let us do
+ * this for larger i values.
+ */
+ e2 = e - i;
+ e1 -= i;
+ dval(&rv) *= tens[i];
+ /* rv = */ rounded_product(dval(&rv), tens[e2]);
+ if (rvOK(&rv, fpi, expo, bits, 0, rd, &irv))
+ goto ret;
+ e1 -= e2;
+ }
+ }
+#ifndef Inaccurate_Divide
+ else if (e >= -Ten_pmax) {
+ /* rv = */ rounded_quotient(dval(&rv), tens[-e]);
+ if (rvOK(&rv, fpi, expo, bits, 0, rd, &irv))
+ goto ret;
+ e1 -= e;
+ }
+#endif
+ }
+ rv_notOK:
+ e1 += nd - k;
+
+ /* Get starting approximation = rv * 10**e1 */
+
+ e2 = 0;
+ if (e1 > 0) {
+ if ( (i = e1 & 15) !=0)
+ dval(&rv) *= tens[i];
+ if (e1 &= ~15) {
+ e1 >>= 4;
+ while(e1 >= (1 << (n_bigtens-1))) {
+ e2 += ((word0(&rv) & Exp_mask)
+ >> Exp_shift1) - Bias;
+ word0(&rv) &= ~Exp_mask;
+ word0(&rv) |= Bias << Exp_shift1;
+ dval(&rv) *= bigtens[n_bigtens-1];
+ e1 -= 1 << (n_bigtens-1);
+ }
+ e2 += ((word0(&rv) & Exp_mask) >> Exp_shift1) - Bias;
+ word0(&rv) &= ~Exp_mask;
+ word0(&rv) |= Bias << Exp_shift1;
+ for(j = 0; e1 > 0; j++, e1 >>= 1)
+ if (e1 & 1)
+ dval(&rv) *= bigtens[j];
+ }
+ }
+ else if (e1 < 0) {
+ e1 = -e1;
+ if ( (i = e1 & 15) !=0)
+ dval(&rv) /= tens[i];
+ if (e1 &= ~15) {
+ e1 >>= 4;
+ while(e1 >= (1 << (n_bigtens-1))) {
+ e2 += ((word0(&rv) & Exp_mask)
+ >> Exp_shift1) - Bias;
+ word0(&rv) &= ~Exp_mask;
+ word0(&rv) |= Bias << Exp_shift1;
+ dval(&rv) *= tinytens[n_bigtens-1];
+ e1 -= 1 << (n_bigtens-1);
+ }
+ e2 += ((word0(&rv) & Exp_mask) >> Exp_shift1) - Bias;
+ word0(&rv) &= ~Exp_mask;
+ word0(&rv) |= Bias << Exp_shift1;
+ for(j = 0; e1 > 0; j++, e1 >>= 1)
+ if (e1 & 1)
+ dval(&rv) *= tinytens[j];
+ }
+ }
+ rvb = d2b(dval(&rv), &rve, &rvbits); /* rv = rvb * 2^rve */
+ rve += e2;
+ if ((j = rvbits - nbits) > 0) {
+ rshift(rvb, j);
+ rvbits = nbits;
+ rve += j;
+ }
+ bb0 = 0; /* trailing zero bits in rvb */
+ e2 = rve + rvbits - nbits;
+ if (e2 > fpi->emax + 1)
+ goto huge;
+ rve1 = rve + rvbits - nbits;
+ if (e2 < (emin = fpi->emin)) {
+ denorm = 1;
+ j = rve - emin;
+ if (j > 0) {
+ rvb = lshift(rvb, j);
+ rvbits += j;
+ }
+ else if (j < 0) {
+ rvbits += j;
+ if (rvbits <= 0) {
+ if (rvbits < -1) {
+ ufl:
+ rvb->wds = 0;
+ rvb->x[0] = 0;
+ *expo = emin;
+ irv = STRTOG_Underflow | STRTOG_Inexlo;
+ goto ret;
+ }
+ rvb->x[0] = rvb->wds = rvbits = 1;
+ }
+ else
+ rshift(rvb, -j);
+ }
+ rve = rve1 = emin;
+ if (sudden_underflow && e2 + 1 < emin)
+ goto ufl;
+ }
+
+ /* Now the hard part -- adjusting rv to the correct value.*/
+
+ /* Put digits into bd: true value = bd * 10^e */
+
+ bd0 = s2b(s0, nd0, nd, y, dplen);
+
+ for(;;) {
+ bd = Balloc(bd0->k);
+ Bcopy(bd, bd0);
+ bb = Balloc(rvb->k);
+ Bcopy(bb, rvb);
+ bbbits = rvbits - bb0;
+ bbe = rve + bb0;
+ bs = i2b(1);
+
+ if (e >= 0) {
+ bb2 = bb5 = 0;
+ bd2 = bd5 = e;
+ }
+ else {
+ bb2 = bb5 = -e;
+ bd2 = bd5 = 0;
+ }
+ if (bbe >= 0)
+ bb2 += bbe;
+ else
+ bd2 -= bbe;
+ bs2 = bb2;
+ j = nbits + 1 - bbbits;
+ i = bbe + bbbits - nbits;
+ if (i < emin) /* denormal */
+ j += i - emin;
+ bb2 += j;
+ bd2 += j;
+ i = bb2 < bd2 ? bb2 : bd2;
+ if (i > bs2)
+ i = bs2;
+ if (i > 0) {
+ bb2 -= i;
+ bd2 -= i;
+ bs2 -= i;
+ }
+ if (bb5 > 0) {
+ bs = pow5mult(bs, bb5);
+ bb1 = mult(bs, bb);
+ Bfree(bb);
+ bb = bb1;
+ }
+ bb2 -= bb0;
+ if (bb2 > 0)
+ bb = lshift(bb, bb2);
+ else if (bb2 < 0)
+ rshift(bb, -bb2);
+ if (bd5 > 0)
+ bd = pow5mult(bd, bd5);
+ if (bd2 > 0)
+ bd = lshift(bd, bd2);
+ if (bs2 > 0)
+ bs = lshift(bs, bs2);
+ asub = 1;
+ inex = STRTOG_Inexhi;
+ delta = diff(bb, bd);
+ if (delta->wds <= 1 && !delta->x[0])
+ break;
+ dsign = delta->sign;
+ delta->sign = finished = 0;
+ L = 0;
+ i = cmp(delta, bs);
+ if (rd && i <= 0) {
+ irv = STRTOG_Normal;
+ if ( (finished = dsign ^ (rd&1)) !=0) {
+ if (dsign != 0) {
+ irv |= STRTOG_Inexhi;
+ goto adj1;
+ }
+ irv |= STRTOG_Inexlo;
+ if (rve1 == emin)
+ goto adj1;
+ for(i = 0, j = nbits; j >= ULbits;
+ i++, j -= ULbits) {
+ if (rvb->x[i] & ALL_ON)
+ goto adj1;
+ }
+ if (j > 1 && lo0bits(rvb->x + i) < j - 1)
+ goto adj1;
+ rve = rve1 - 1;
+ rvb = set_ones(rvb, rvbits = nbits);
+ break;
+ }
+ irv |= dsign ? STRTOG_Inexlo : STRTOG_Inexhi;
+ break;
+ }
+ if (i < 0) {
+ /* Error is less than half an ulp -- check for
+ * special case of mantissa a power of two.
+ */
+ irv = dsign
+ ? STRTOG_Normal | STRTOG_Inexlo
+ : STRTOG_Normal | STRTOG_Inexhi;
+ if (dsign || bbbits > 1 || denorm || rve1 == emin)
+ break;
+ delta = lshift(delta,1);
+ if (cmp(delta, bs) > 0) {
+ irv = STRTOG_Normal | STRTOG_Inexlo;
+ goto drop_down;
+ }
+ break;
+ }
+ if (i == 0) {
+ /* exactly half-way between */
+ if (dsign) {
+ if (denorm && all_on(rvb, rvbits)) {
+ /*boundary case -- increment exponent*/
+ rvb->wds = 1;
+ rvb->x[0] = 1;
+ rve = emin + nbits - (rvbits = 1);
+ irv = STRTOG_Normal | STRTOG_Inexhi;
+ denorm = 0;
+ break;
+ }
+ irv = STRTOG_Normal | STRTOG_Inexlo;
+ }
+ else if (bbbits == 1) {
+ irv = STRTOG_Normal;
+ drop_down:
+ /* boundary case -- decrement exponent */
+ if (rve1 == emin) {
+ irv = STRTOG_Normal | STRTOG_Inexhi;
+ if (rvb->wds == 1 && rvb->x[0] == 1)
+ sudden_underflow = 1;
+ break;
+ }
+ rve -= nbits;
+ rvb = set_ones(rvb, rvbits = nbits);
+ break;
+ }
+ else
+ irv = STRTOG_Normal | STRTOG_Inexhi;
+ if ((bbbits < nbits && !denorm) || !(rvb->x[0] & 1))
+ break;
+ if (dsign) {
+ rvb = increment(rvb);
+ j = kmask & (ULbits - (rvbits & kmask));
+ if (hi0bits(rvb->x[rvb->wds - 1]) != j)
+ rvbits++;
+ irv = STRTOG_Normal | STRTOG_Inexhi;
+ }
+ else {
+ if (bbbits == 1)
+ goto undfl;
+ decrement(rvb);
+ irv = STRTOG_Normal | STRTOG_Inexlo;
+ }
+ break;
+ }
+ if ((dval(&adj) = ratio(delta, bs)) <= 2.) {
+ adj1:
+ inex = STRTOG_Inexlo;
+ if (dsign) {
+ asub = 0;
+ inex = STRTOG_Inexhi;
+ }
+ else if (denorm && bbbits <= 1) {
+ undfl:
+ rvb->wds = 0;
+ rve = emin;
+ irv = STRTOG_Underflow | STRTOG_Inexlo;
+ break;
+ }
+ adj0 = dval(&adj) = 1.;
+ }
+ else {
+ adj0 = dval(&adj) *= 0.5;
+ if (dsign) {
+ asub = 0;
+ inex = STRTOG_Inexlo;
+ }
+ if (dval(&adj) < 2147483647.) {
+ L = adj0;
+ adj0 -= L;
+ switch(rd) {
+ case 0:
+ if (adj0 >= .5)
+ goto inc_L;
+ break;
+ case 1:
+ if (asub && adj0 > 0.)
+ goto inc_L;
+ break;
+ case 2:
+ if (!asub && adj0 > 0.) {
+ inc_L:
+ L++;
+ inex = STRTOG_Inexact - inex;
+ }
+ }
+ dval(&adj) = L;
+ }
+ }
+ y = rve + rvbits;
+
+ /* adj *= ulp(&rv); */
+ /* if (asub) rv -= adj; else rv += adj; */
+
+ if (!denorm && rvbits < nbits) {
+ rvb = lshift(rvb, j = nbits - rvbits);
+ rve -= j;
+ rvbits = nbits;
+ }
+ ab = d2b(dval(&adj), &abe, &abits);
+ if (abe < 0)
+ rshift(ab, -abe);
+ else if (abe > 0)
+ ab = lshift(ab, abe);
+ rvb0 = rvb;
+ if (asub) {
+ /* rv -= adj; */
+ j = hi0bits(rvb->x[rvb->wds-1]);
+ rvb = diff(rvb, ab);
+ k = rvb0->wds - 1;
+ if (denorm)
+ /* do nothing */;
+ else if (rvb->wds <= k
+ || hi0bits( rvb->x[k]) >
+ hi0bits(rvb0->x[k])) {
+ /* unlikely; can only have lost 1 high bit */
+ if (rve1 == emin) {
+ --rvbits;
+ denorm = 1;
+ }
+ else {
+ rvb = lshift(rvb, 1);
+ --rve;
+ --rve1;
+ L = finished = 0;
+ }
+ }
+ }
+ else {
+ rvb = sum(rvb, ab);
+ k = rvb->wds - 1;
+ if (k >= rvb0->wds
+ || hi0bits(rvb->x[k]) < hi0bits(rvb0->x[k])) {
+ if (denorm) {
+ if (++rvbits == nbits)
+ denorm = 0;
+ }
+ else {
+ rshift(rvb, 1);
+ rve++;
+ rve1++;
+ L = 0;
+ }
+ }
+ }
+ Bfree(ab);
+ Bfree(rvb0);
+ if (finished)
+ break;
+
+ z = rve + rvbits;
+ if (y == z && L) {
+ /* Can we stop now? */
+ tol = dval(&adj) * 5e-16; /* > max rel error */
+ dval(&adj) = adj0 - .5;
+ if (dval(&adj) < -tol) {
+ if (adj0 > tol) {
+ irv |= inex;
+ break;
+ }
+ }
+ else if (dval(&adj) > tol && adj0 < 1. - tol) {
+ irv |= inex;
+ break;
+ }
+ }
+ bb0 = denorm ? 0 : trailz(rvb);
+ Bfree(bb);
+ Bfree(bd);
+ Bfree(bs);
+ Bfree(delta);
+ }
+ if (!denorm && (j = nbits - rvbits)) {
+ if (j > 0)
+ rvb = lshift(rvb, j);
+ else
+ rshift(rvb, -j);
+ rve -= j;
+ }
+ *expo = rve;
+ Bfree(bb);
+ Bfree(bd);
+ Bfree(bs);
+ Bfree(bd0);
+ Bfree(delta);
+ if (rve > fpi->emax) {
+ switch(fpi->rounding & 3) {
+ case FPI_Round_near:
+ goto huge;
+ case FPI_Round_up:
+ if (!sign)
+ goto huge;
+ break;
+ case FPI_Round_down:
+ if (sign)
+ goto huge;
+ }
+ /* Round to largest representable magnitude */
+ Bfree(rvb);
+ rvb = 0;
+ irv = STRTOG_Normal | STRTOG_Inexlo;
+ *expo = fpi->emax;
+ b = bits;
+ be = b + ((fpi->nbits + 31) >> 5);
+ while(b < be)
+ *b++ = -1;
+ if ((j = fpi->nbits & 0x1f))
+ *--be >>= (32 - j);
+ goto ret;
+ huge:
+ rvb->wds = 0;
+ irv = STRTOG_Infinite | STRTOG_Overflow | STRTOG_Inexhi;
+ SET_ERRNO(ERANGE);
+ infnanexp:
+ *expo = fpi->emax + 1;
+ }
+ ret:
+ if (denorm) {
+ if (sudden_underflow) {
+ rvb->wds = 0;
+ irv = STRTOG_Underflow | STRTOG_Inexlo;
+ SET_ERRNO(ERANGE);
+ }
+ else {
+ irv = (irv & ~STRTOG_Retmask) |
+ (rvb->wds > 0 ? STRTOG_Denormal : STRTOG_Zero);
+ if (irv & STRTOG_Inexact) {
+ irv |= STRTOG_Underflow;
+ SET_ERRNO(ERANGE);
+ }
+ }
+ }
+ if (se)
+ *se = (char *)s;
+ if (sign)
+ irv |= STRTOG_Neg;
+ if (rvb) {
+ copybits(bits, nbits, rvb);
+ Bfree(rvb);
+ }
+ return irv;
+}
libc/mingw/gdtoa/strtodnrp.c
@@ -0,0 +1,87 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 2004 by David M. Gay.
+All Rights Reserved
+Based on material in the rest of /netlib/fp/gdota.tar.gz,
+which is copyright (C) 1998, 2000 by Lucent Technologies.
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* This is a variant of strtod that works on Intel ia32 systems */
+/* with the default extended-precision arithmetic -- it does not */
+/* require setting the precision control to 53 bits. */
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+double __strtod (const char *s, char **sp)
+{
+ static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI, Int_max };
+ ULong bits[2];
+ Long expo;
+ int k;
+ union { ULong L[2]; double d; } u;
+
+ k = __strtodg (s, sp, &fpi, &expo, bits);
+ switch(k & STRTOG_Retmask) {
+ case STRTOG_NoNumber:
+ case STRTOG_Zero:
+ u.L[0] = u.L[1] = 0;
+ break;
+
+ case STRTOG_Normal:
+ u.L[_1] = bits[0];
+ u.L[_0] = (bits[1] & ~0x100000) | ((expo + 0x3ff + 52) << 20);
+ break;
+
+ case STRTOG_Denormal:
+ u.L[_1] = bits[0];
+ u.L[_0] = bits[1];
+ break;
+
+ case STRTOG_Infinite:
+ u.L[_0] = 0x7ff00000;
+ u.L[_1] = 0;
+ break;
+
+ case STRTOG_NaN:
+ u.L[_1] = d_QNAN0;
+ u.L[_0] = d_QNAN1;
+ break;
+
+ case STRTOG_NaNbits:
+ u.L[_0] = 0x7ff00000 | bits[1];
+ u.L[_1] = bits[0];
+ }
+ if (k & STRTOG_Neg)
+ u.L[_0] |= 0x80000000L;
+ return u.d;
+}
+
+double __cdecl
+__mingw_strtod (const char * __restrict__ src, char ** __restrict__ endptr)
+ __attribute__((alias("__strtod")));
+
libc/mingw/gdtoa/strtof.c
@@ -0,0 +1,77 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998, 2000 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+float __strtof (const char *s, char **sp)
+{
+ static FPI fpi0 = { 24, 1-127-24+1, 254-127-24+1, 1, SI, Int_max };
+ ULong bits[1];
+ Long expo;
+ int k;
+ union { ULong L[1]; float f; } u = { { 0 } };
+#ifdef Honor_FLT_ROUNDS
+#include "gdtoa_fltrnds.h"
+#else
+#define fpi &fpi0
+#endif
+
+ k = __strtodg(s, sp, fpi, &expo, bits);
+ switch(k & STRTOG_Retmask) {
+ case STRTOG_NoNumber:
+ case STRTOG_Zero:
+ u.L[0] = 0;
+ break;
+
+ case STRTOG_Normal:
+ case STRTOG_NaNbits:
+ u.L[0] = (bits[0] & 0x7fffff) | ((expo + 0x7f + 23) << 23);
+ break;
+
+ case STRTOG_Denormal:
+ u.L[0] = bits[0];
+ break;
+
+ case STRTOG_Infinite:
+ u.L[0] = 0x7f800000;
+ break;
+
+ case STRTOG_NaN:
+ u.L[0] = f_QNAN;
+ }
+ if (k & STRTOG_Neg)
+ u.L[0] |= 0x80000000L;
+ return u.f;
+}
+
+float __cdecl
+__mingw_strtof (const char * __restrict__ src, char ** __restrict__ endptr)
+ __attribute__((alias("__strtof")));
libc/mingw/gdtoa/strtopx.c
@@ -0,0 +1,125 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998, 2000 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+#undef _0
+#undef _1
+
+/* one or the other of IEEE_MC68k or IEEE_8087 should be #defined */
+
+#ifdef IEEE_MC68k
+#define _0 0
+#define _1 1
+#define _2 2
+#define _3 3
+#define _4 4
+#endif
+#ifdef IEEE_8087
+#define _0 4
+#define _1 3
+#define _2 2
+#define _3 1
+#define _4 0
+#endif
+
+typedef union lD {
+ UShort L[5];
+ long double D;
+} lD;
+
+static int __strtopx (const char *s, char **sp, lD *V)
+{
+ static FPI fpi0 = { 64, 1-16383-64+1, 32766 - 16383 - 64 + 1, 1, SI,
+ Int_max };
+ ULong bits[2];
+ Long expo;
+ int k;
+ UShort *L = & (V->L[0]);
+#ifdef Honor_FLT_ROUNDS
+#include "gdtoa_fltrnds.h"
+#else
+#define fpi &fpi0
+#endif
+ V->D = 0.0L;
+
+ k = __strtodg(s, sp, fpi, &expo, bits);
+ switch(k & STRTOG_Retmask) {
+ case STRTOG_NoNumber:
+ case STRTOG_Zero:
+ L[0] = L[1] = L[2] = L[3] = L[4] = 0;
+ break;
+
+ case STRTOG_Denormal:
+ L[_0] = 0;
+ goto normal_bits;
+
+ case STRTOG_Normal:
+ case STRTOG_NaNbits:
+ L[_0] = expo + 0x3fff + 63;
+ normal_bits:
+ L[_4] = (UShort)bits[0];
+ L[_3] = (UShort)(bits[0] >> 16);
+ L[_2] = (UShort)bits[1];
+ L[_1] = (UShort)(bits[1] >> 16);
+ break;
+
+ case STRTOG_Infinite:
+ L[_0] = 0x7fff;
+ L[_1] = 0x8000;
+ L[_2] = L[_3] = L[_4] = 0;
+ break;
+
+ case STRTOG_NaN:
+ L[0] = ldus_QNAN0;
+ L[1] = ldus_QNAN1;
+ L[2] = ldus_QNAN2;
+ L[3] = ldus_QNAN3;
+ L[4] = ldus_QNAN4;
+ }
+ if (k & STRTOG_Neg)
+ L[_0] |= 0x8000;
+ return k;
+}
+
+long double __cdecl
+__strtold (const char * __restrict__ src, char ** __restrict__ endptr)
+{
+ lD ret;
+ ret.D = 0.0L;
+ __strtopx(src, endptr, &ret);
+ return ret.D;
+}
+
+long double __cdecl
+__mingw_strtold (const char * __restrict__ src, char ** __restrict__ endptr)
+ __attribute__((alias("__strtold")));
+
libc/mingw/gdtoa/sum.c
@@ -0,0 +1,91 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+Bigint *sum (Bigint *a, Bigint *b)
+{
+ Bigint *c;
+ ULong carry, *xc, *xa, *xb, *xe, y;
+#ifdef Pack_32
+ ULong z;
+#endif
+
+ if (a->wds < b->wds) {
+ c = b; b = a; a = c;
+ }
+ c = Balloc(a->k);
+ c->wds = a->wds;
+ carry = 0;
+ xa = a->x;
+ xb = b->x;
+ xc = c->x;
+ xe = xc + b->wds;
+#ifdef Pack_32
+ do {
+ y = (*xa & 0xffff) + (*xb & 0xffff) + carry;
+ carry = (y & 0x10000) >> 16;
+ z = (*xa++ >> 16) + (*xb++ >> 16) + carry;
+ carry = (z & 0x10000) >> 16;
+ Storeinc(xc, z, y);
+ } while(xc < xe);
+ xe += a->wds - b->wds;
+ while(xc < xe) {
+ y = (*xa & 0xffff) + carry;
+ carry = (y & 0x10000) >> 16;
+ z = (*xa++ >> 16) + carry;
+ carry = (z & 0x10000) >> 16;
+ Storeinc(xc, z, y);
+ }
+#else
+ do {
+ y = *xa++ + *xb++ + carry;
+ carry = (y & 0x10000) >> 16;
+ *xc++ = y & 0xffff;
+ } while(xc < xe);
+ xe += a->wds - b->wds;
+ while(xc < xe) {
+ y = *xa++ + carry;
+ carry = (y & 0x10000) >> 16;
+ *xc++ = y & 0xffff;
+ }
+#endif
+ if (carry) {
+ if (c->wds == c->maxwds) {
+ b = Balloc(c->k + 1);
+ Bcopy(b, c);
+ Bfree(c);
+ c = b;
+ }
+ c->x[c->wds++] = 1;
+ }
+ return c;
+}
libc/mingw/gdtoa/ulp.c
@@ -0,0 +1,61 @@
+/****************************************************************
+
+The author of this software is David M. Gay.
+
+Copyright (C) 1998, 1999 by Lucent Technologies
+All Rights Reserved
+
+Permission to use, copy, modify, and distribute this software and
+its documentation for any purpose and without fee is hereby
+granted, provided that the above copyright notice appear in all
+copies and that both that the copyright notice and this
+permission notice and warranty disclaimer appear in supporting
+documentation, and that the name of Lucent or any of its entities
+not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+THIS SOFTWARE.
+
+****************************************************************/
+
+/* Please send bug reports to David M. Gay (dmg at acm dot org,
+ * with " at " changed at "@" and " dot " changed to "."). */
+
+#include "gdtoaimp.h"
+
+double ulp (dbl_union *x)
+{
+ Long L;
+ union _dbl_union a;
+
+ L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
+#ifndef Sudden_Underflow
+ if (L > 0) {
+#endif
+ word0(&a) = L;
+ word1(&a) = 0;
+#ifndef Sudden_Underflow
+ }
+ else {
+ L = -L >> Exp_shift;
+ if (L < Exp_shift) {
+ word0(&a) = 0x80000 >> L;
+ word1(&a) = 0;
+ }
+ else {
+ word0(&a) = 0;
+ L -= Exp_shift;
+ word1(&a) = L >= 31 ? 1 : 1 << (31 - L);
+ }
+ }
+#endif
+ return dval(&a);
+}
libc/mingw/math/arm/_chgsignl.S
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <_mingw_mac.h>
+
+ .file "_chgignl.S"
+ .text
+ .align 4
+ .globl __MINGW_USYMBOL(_chgsignl)
+ .def __MINGW_USYMBOL(_chgsignl); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(_chgsignl):
+ vneg.f64 d0, d0
+ bx lr
libc/mingw/math/arm/ceil.S
@@ -0,0 +1,29 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "ceil.S"
+ .text
+ .align 4
+ .globl __MINGW_USYMBOL(ceil)
+ .def __MINGW_USYMBOL(ceil); .scl 2; .type 32; .endef
+
+__MINGW_USYMBOL(ceil):
+ vmov r2, r3, d0
+ lsr r3, r3, #20
+ bic r3, r3, #0x800
+ movw r2, #0x7ff
+ cmp r2, r3 /* Check for INF/NAN, just return the input in those cases */
+ it eq
+ bxeq lr
+ vmrs r1, fpscr
+ bic r0, r1, #0x00c00000
+ orr r0, r0, #0x00400000 /* Round towards Plus Infinity */
+ vmsr fpscr, r0
+ vcvtr.s32.f64 s0, d0
+ vcvt.f64.s32 d0, s0
+ vmsr fpscr, r1
+ bx lr
libc/mingw/math/arm/ceilf.S
@@ -0,0 +1,28 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "ceilf.S"
+ .text
+ .align 4
+ .globl __MINGW_USYMBOL(ceilf)
+ .def __MINGW_USYMBOL(ceilf); .scl 2; .type 32; .endef
+
+__MINGW_USYMBOL(ceilf):
+ vmov r2, s0
+ lsr r2, r2, #23
+ bic r2, r2, #0x100
+ cmp r2, #0xff /* Check for INF/NAN, just return the input in those cases */
+ it eq
+ bxeq lr
+ vmrs r1, fpscr
+ bic r0, r1, #0x00c00000
+ orr r0, r0, #0x00400000 /* Round towards Plus Infinity */
+ vmsr fpscr, r0
+ vcvtr.s32.f32 s0, s0
+ vcvt.f32.s32 s0, s0
+ vmsr fpscr, r1
+ bx lr
libc/mingw/math/arm/ceill.S
@@ -0,0 +1,28 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "ceill.S"
+ .text
+ .align 4
+ .globl __MINGW_USYMBOL(ceill)
+ .def __MINGW_USYMBOL(ceill); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(ceill):
+ vmov r2, r3, d0
+ lsr r3, r3, #20
+ bic r3, r3, #0x800
+ movw r2, #0x7ff
+ cmp r2, r3 /* Check for INF/NAN, just return the input in those cases */
+ it eq
+ bxeq lr
+ vmrs r1, fpscr
+ bic r0, r1, #0x00c00000
+ orr r0, r0, #0x00400000 /* Round towards Plus Infinity */
+ vmsr fpscr, r0
+ vcvtr.s32.f64 s0, d0
+ vcvt.f64.s32 d0, s0
+ vmsr fpscr, r1
+ bx lr
libc/mingw/math/arm/copysignl.c
@@ -0,0 +1,11 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long double copysignl(long double x, long double y)
+{
+ return copysign(x, y);
+}
libc/mingw/math/arm/exp2.c
@@ -0,0 +1,64 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2014 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 <math.h>
+
+double exp2(double x)
+{
+ return pow(2, x);
+}
+
+float exp2f(float x)
+{
+ return powf(2, x);
+}
+
+long double exp2l(long double x)
+{
+#if defined(__arm__) || defined(_ARM_)
+ return exp2(x);
+#else
+#error Not supported on your platform yet
+#endif
+}
libc/mingw/math/arm/floor.S
@@ -0,0 +1,28 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "floor.S"
+ .text
+ .p2align 4,,15
+ .globl __MINGW_USYMBOL(floor)
+ .def __MINGW_USYMBOL(floor); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(floor):
+ vmov r2, r3, d0
+ lsr r3, r3, #20
+ bic r3, r3, #0x800
+ movw r2, #0x7ff
+ cmp r2, r3 /* Check for INF/NAN, just return the input in those cases */
+ it eq
+ bxeq lr
+ vmrs r1, fpscr
+ bic r0, r1, #0x00c00000
+ orr r0, r0, #0x00800000 /* Round towards Minus Infinity */
+ vmsr fpscr, r0
+ vcvtr.s32.f64 s0, d0
+ vcvt.f64.s32 d0, s0
+ vmsr fpscr, r1
+ bx lr
libc/mingw/math/arm/floorf.S
@@ -0,0 +1,27 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+ #include <_mingw_mac.h>
+
+ .file "floorf.S"
+ .text
+ .p2align 4,,15
+ .globl __MINGW_USYMBOL(floorf)
+ .def __MINGW_USYMBOL(floorf); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(floorf):
+ vmov r2, s0
+ lsr r2, r2, #23
+ bic r2, r2, #0x100
+ cmp r2, #0xff /* Check for INF/NAN, just return the input in those cases */
+ it eq
+ bxeq lr
+ vmrs r1, fpscr
+ bic r0, r1, #0x00c00000
+ orr r0, r0, #0x00800000 /* Round towards Minus Infinity */
+ vmsr fpscr, r0
+ vcvtr.s32.f32 s0, s0
+ vcvt.f32.s32 s0, s0
+ vmsr fpscr, r1
+ bx lr
libc/mingw/math/arm/floorl.S
@@ -0,0 +1,28 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "floorl.S"
+ .text
+ .align 4
+ .globl __MINGW_USYMBOL(floorl)
+ .def __MINGW_USYMBOL(floorl); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(floorl):
+ vmov r2, r3, d0
+ lsr r3, r3, #20
+ bic r3, r3, #0x800
+ movw r2, #0x7ff
+ cmp r2, r3 /* Check for INF/NAN, just return the input in those cases */
+ it eq
+ bxeq lr
+ vmrs r1, fpscr
+ bic r0, r1, #0x00c00000
+ orr r0, r0, #0x00800000 /* Round towards Minus Infinity */
+ vmsr fpscr, r0
+ vcvtr.s32.f64 s0, d0
+ vcvt.f64.s32 d0, s0
+ vmsr fpscr, r1
+ bx lr
libc/mingw/math/arm/ldexpl.c
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+long double ldexpl(long double x, int n)
+{
+#if defined(__arm__) || defined(_ARM_)
+ return ldexp(x, n);
+#else
+#error Not supported on your platform yet
+#endif
+}
libc/mingw/math/arm/log2.c
@@ -0,0 +1,64 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2014 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 <math.h>
+
+double log2(double x)
+{
+ return log(x) / 0.69314718246459960938;
+}
+
+float log2f(float x)
+{
+ return logf(x) / 0.69314718246459960938f;
+}
+
+long double log2l(long double x)
+{
+#if defined(__arm__) || defined(_ARM_)
+ return log2(x);
+#else
+#error Not supported on your platform yet
+#endif
+}
libc/mingw/math/arm/nearbyint.S
@@ -0,0 +1,25 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "nearbyint.S"
+ .text
+ .align 4
+ .globl __MINGW_USYMBOL(nearbyint)
+ .def __MINGW_USYMBOL(nearbyint); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(nearbyint):
+ vmov r2, r3, d0
+ lsr r3, r3, #20
+ bic r3, r3, #0x800
+ movw r2, #0x7ff
+ cmp r2, r3 /* Check for INF/NAN, just return the input in those cases */
+ it eq
+ bxeq lr
+ vmrs r1, fpscr
+ vcvtr.s32.f64 s0, d0
+ vcvt.f64.s32 d0, s0
+ vmsr fpscr, r1
+ bx lr
libc/mingw/math/arm/nearbyintf.S
@@ -0,0 +1,25 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "nearbyintf.S"
+ .text
+ .align 4
+ .globl __MINGW_USYMBOL(nearbyintf)
+ .def __MINGW_USYMBOL(nearbyintf); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(nearbyintf):
+ vmov r2, r3, d0
+ lsr r3, r3, #20
+ bic r3, r3, #0x800
+ movw r2, #0x7ff
+ cmp r2, r3 /* Check for INF/NAN, just return the input in those cases */
+ it eq
+ bxeq lr
+ vmrs r1, fpscr
+ vcvtr.s32.f32 s0, s0
+ vcvt.f32.s32 s0, s0
+ vmsr fpscr, r1
+ bx lr
libc/mingw/math/arm/nearbyintl.S
@@ -0,0 +1,25 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "nearbyintl.S"
+ .text
+ .align 4
+ .globl __MINGW_USYMBOL(nearbyintl)
+ .def __MINGW_USYMBOL(nearbyintl); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(nearbyintl):
+ vmov r2, r3, d0
+ lsr r3, r3, #20
+ bic r3, r3, #0x800
+ movw r2, #0x7ff
+ cmp r2, r3 /* Check for INF/NAN, just return the input in those cases */
+ it eq
+ bxeq lr
+ vmrs r1, fpscr
+ vcvtr.s32.f64 s0, d0
+ vcvt.f64.s32 d0, s0
+ vmsr fpscr, r1
+ bx lr
libc/mingw/math/arm/scalbn.c
@@ -0,0 +1,64 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2014 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 <math.h>
+
+double scalbn(double x, int exp)
+{
+ return x * exp2(exp);
+}
+
+float scalbnf(float x, int exp)
+{
+ return x * exp2f(exp);
+}
+
+long double scalbnl(long double x, int exp)
+{
+#if defined(__arm__) || defined(_ARM_)
+ return scalbn(x, exp);
+#else
+#error Not supported on your platform yet
+#endif
+}
libc/mingw/math/arm/sincos.c
@@ -0,0 +1,29 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+void sincos (double __x, double *p_sin, double *p_cos)
+{
+ *p_sin = sin(__x);
+ *p_cos = cos(__x);
+}
+
+void sincosf (float __x, float *p_sin, float *p_cos)
+{
+ *p_sin = sinf(__x);
+ *p_cos = cosf(__x);
+}
+
+void sincosl (long double __x, long double *p_sin, long double *p_cos)
+{
+#if defined(__arm__) || defined(_ARM_)
+ *p_sin = sin(__x);
+ *p_cos = cos(__x);
+#else
+#error Not supported on your platform yet
+#endif
+}
libc/mingw/math/arm/trunc.S
@@ -0,0 +1,28 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "trunc.S"
+ .text
+ .p2align 4,,15
+ .globl __MINGW_USYMBOL(trunc)
+ .def __MINGW_USYMBOL(trunc); .scl 2; .type 32; .endef
+
+__MINGW_USYMBOL(trunc):
+ vmov r2, r3, d0
+ lsr r3, r3, #20
+ bic r3, r3, #0x800
+ movw r2, #0x7ff
+ cmp r2, r3 /* Check for INF/NAN, just return the input in those cases */
+ it eq
+ bxeq lr
+ vmrs r1, fpscr
+ orr r0, r1, #0x00c00000 /* Round towards Zero */
+ vmsr fpscr, r0
+ vcvtr.s32.f64 s0, d0
+ vcvt.f64.s32 d0, s0
+ vmsr fpscr, r1
+ bx lr
libc/mingw/math/arm/truncf.S
@@ -0,0 +1,28 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "truncf.S"
+ .text
+ .p2align 4,,15
+ .globl __MINGW_USYMBOL(truncf)
+ .def __MINGW_USYMBOL(truncf); .scl 2; .type 32; .endef
+
+__MINGW_USYMBOL(truncf):
+ vmov r2, r3, d0
+ lsr r3, r3, #20
+ bic r3, r3, #0x800
+ movw r2, #0x7ff
+ cmp r2, r3 /* Check for INF/NAN, just return the input in those cases */
+ it eq
+ bxeq lr
+ vmrs r1, fpscr
+ orr r0, r1, #0x00c00000 /* Round towards Zero */
+ vmsr fpscr, r0
+ vcvt.s32.f32 s0, s0
+ vcvt.f32.s32 s0, s0
+ vmsr fpscr, r1
+ bx lr
libc/mingw/math/arm64/_chgsignl.S
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <_mingw_mac.h>
+
+ .file "_chgignl.S"
+ .text
+ .align 2
+ .globl __MINGW_USYMBOL(_chgsignl)
+ .def __MINGW_USYMBOL(_chgsignl); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(_chgsignl):
+ fneg d0, d0
+ ret
libc/mingw/math/arm64/ceil.S
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "ceil.S"
+ .text
+ .align 2
+ .globl __MINGW_USYMBOL(ceil)
+ .def __MINGW_USYMBOL(ceil); .scl 2; .type 32; .endef
+
+__MINGW_USYMBOL(ceil):
+ frintp d0, d0
+ ret
libc/mingw/math/arm64/ceilf.S
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "ceilf.S"
+ .text
+ .align 2
+ .globl __MINGW_USYMBOL(ceilf)
+ .def __MINGW_USYMBOL(ceilf); .scl 2; .type 32; .endef
+
+__MINGW_USYMBOL(ceilf):
+ frintp s0, s0
+ ret
libc/mingw/math/arm64/ceill.S
@@ -0,0 +1,15 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "ceill.S"
+ .text
+ .align 2
+ .globl __MINGW_USYMBOL(ceill)
+ .def __MINGW_USYMBOL(ceill); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(ceill):
+ frintp d0, d0
+ ret
libc/mingw/math/arm64/copysignl.c
@@ -0,0 +1,11 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long double copysignl(long double x, long double y)
+{
+ return copysign(x, y);
+}
libc/mingw/math/arm64/exp2.S
@@ -0,0 +1,19 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "exp2.S"
+ .text
+ .align 2
+ .globl __MINGW_USYMBOL(exp2)
+ .globl __MINGW_USYMBOL(exp2l)
+ .def __MINGW_USYMBOL(exp2); .scl 2; .type 32; .endef
+ .def __MINGW_USYMBOL(exp2l); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(exp2):
+__MINGW_USYMBOL(exp2l):
+ fmov d1, d0
+ fmov d0, #2.0
+ b pow
libc/mingw/math/arm64/exp2f.S
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "exp2f.S"
+ .text
+ .align 2
+ .globl __MINGW_USYMBOL(exp2f)
+ .def __MINGW_USYMBOL(exp2f); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(exp2f):
+ fmov s1, s0
+ fmov s0, #2.0
+ b powf
libc/mingw/math/arm64/floor.S
@@ -0,0 +1,15 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "floor.S"
+ .text
+ .p2align 2
+ .globl __MINGW_USYMBOL(floor)
+ .def __MINGW_USYMBOL(floor); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(floor):
+ frintm d0, d0
+ ret
libc/mingw/math/arm64/floorf.S
@@ -0,0 +1,15 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+ #include <_mingw_mac.h>
+
+ .file "floorf.S"
+ .text
+ .p2align 2
+ .globl __MINGW_USYMBOL(floorf)
+ .def __MINGW_USYMBOL(floorf); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(floorf):
+ frintm s0, s0
+ ret
libc/mingw/math/arm64/floorl.S
@@ -0,0 +1,15 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "floorl.S"
+ .text
+ .align 2
+ .globl __MINGW_USYMBOL(floorl)
+ .def __MINGW_USYMBOL(floorl); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(floorl):
+ frintm d0, d0
+ ret
libc/mingw/math/arm64/ldexpl.c
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+long double ldexpl(long double x, int n)
+{
+#if defined(__aarch64__) || defined(_ARM64_)
+ return ldexp(x, n);
+#else
+#error Not supported on your platform yet
+#endif
+}
libc/mingw/math/arm64/log2.c
@@ -0,0 +1,26 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+double log2(double x)
+{
+ return log(x) / 0.69314718246459960938;
+}
+
+float log2f(float x)
+{
+ return logf(x) / 0.69314718246459960938f;
+}
+
+long double log2l(long double x)
+{
+#if defined(__aarch64__) || defined(_ARM64_)
+ return log2(x);
+#else
+#error Not supported on your platform yet
+#endif
+}
libc/mingw/math/arm64/nearbyint.S
@@ -0,0 +1,17 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "nearbyint.S"
+ .text
+ .align 2
+ .globl __MINGW_USYMBOL(nearbyint)
+ .def __MINGW_USYMBOL(nearbyint); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(nearbyint):
+ mrs x1, fpcr
+ frintx d0, d0
+ msr fpcr, x1
+ ret
libc/mingw/math/arm64/nearbyintf.S
@@ -0,0 +1,17 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "nearbyintf.S"
+ .text
+ .align 2
+ .globl __MINGW_USYMBOL(nearbyintf)
+ .def __MINGW_USYMBOL(nearbyintf); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(nearbyintf):
+ mrs x1, fpcr
+ frintx s0, s0
+ msr fpcr, x1
+ ret
libc/mingw/math/arm64/nearbyintl.S
@@ -0,0 +1,17 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "nearbyintl.S"
+ .text
+ .align 2
+ .globl __MINGW_USYMBOL(nearbyintl)
+ .def __MINGW_USYMBOL(nearbyintl); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(nearbyintl):
+ mrs x1, fpcr
+ frintx d0, d0
+ msr fpcr, x1
+ ret
libc/mingw/math/arm64/scalbn.c
@@ -0,0 +1,26 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+double scalbn(double x, int exp)
+{
+ return x * exp2(exp);
+}
+
+float scalbnf(float x, int exp)
+{
+ return x * exp2f(exp);
+}
+
+long double scalbnl(long double x, int exp)
+{
+#if defined(__aarch64__) || defined(_ARM64_)
+ return scalbn(x, exp);
+#else
+#error Not supported on your platform yet
+#endif
+}
libc/mingw/math/arm64/sincos.c
@@ -0,0 +1,29 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+void sincos (double __x, double *p_sin, double *p_cos)
+{
+ *p_sin = sin(__x);
+ *p_cos = cos(__x);
+}
+
+void sincosf (float __x, float *p_sin, float *p_cos)
+{
+ *p_sin = sinf(__x);
+ *p_cos = cosf(__x);
+}
+
+void sincosl (long double __x, long double *p_sin, long double *p_cos)
+{
+#if defined(__aarch64__) || defined(_ARM64_)
+ *p_sin = sin(__x);
+ *p_cos = cos(__x);
+#else
+#error Not supported on your platform yet
+#endif
+}
libc/mingw/math/arm64/trunc.S
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "trunc.S"
+ .text
+ .p2align 2
+ .globl __MINGW_USYMBOL(trunc)
+ .def __MINGW_USYMBOL(trunc); .scl 2; .type 32; .endef
+
+__MINGW_USYMBOL(trunc):
+ frintz d0, d0
+ ret
libc/mingw/math/arm64/truncf.S
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "truncf.S"
+ .text
+ .p2align 2
+ .globl __MINGW_USYMBOL(truncf)
+ .def __MINGW_USYMBOL(truncf); .scl 2; .type 32; .endef
+
+__MINGW_USYMBOL(truncf):
+ frintz s0, s0
+ ret
libc/mingw/math/x86/_chgsignl.S
@@ -0,0 +1,46 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ *
+ * IEEE 854 double-extended-precision format
+ * unsigned int mantissa1:32
+ * unsigned int mantissa0:32
+ * unsigned int exponent:15
+ * unsigned int negative:1
+ * unsigned int empty:16
+ *
+ * long double _chgsignl(long double x) {
+ * ((unsigned int *) &x)[2] ^= 0x00008000;
+ * return x;
+ * }
+ */
+
+#include <_mingw_mac.h>
+
+ .file "_chgignl.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+ .globl __MINGW_USYMBOL(_chgsignl)
+ .def __MINGW_USYMBOL(_chgsignl); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(_chgsignl):
+#if defined(_AMD64_) || defined(__x86_64__)
+ movq (%rdx), %rax
+ movq 8(%rdx), %rdx
+ xorq $0x8000, %rdx
+ movq %rax, (%rcx)
+ movq %rdx, 8(%rcx)
+ movq %rcx, %rax
+ ret
+#elif defined(_X86_) || defined(__i386__)
+ movl 12(%esp),%eax
+ xorl $0x8000,%eax
+ movl %eax,12(%esp)
+ fldt 4(%esp)
+ ret
+#endif
+
libc/mingw/math/x86/acosf.c
@@ -0,0 +1,29 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+#include <math.h>
+
+float
+acosf (float x)
+{
+ float res = 0.0F;
+
+ /* acosl = atanl (sqrtl(1 - x^2) / x) */
+ asm volatile (
+ "fld %%st\n\t"
+ "fmul %%st(0)\n\t" /* x^2 */
+ "fld1\n\t"
+ "fsubp\n\t" /* 1 - x^2 */
+ "fsqrt\n\t" /* sqrtl (1 - x^2) */
+ "fxch %%st(1)\n\t"
+ "fpatan"
+ : "=t" (res) : "0" (x) : "st(1)");
+ return res;
+}
libc/mingw/math/x86/acosh.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_DOUBLE 1
+#include "acosh.def.h"
libc/mingw/math/x86/acosh.def.h
@@ -0,0 +1,70 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 "../complex/complex_internal.h"
+#include <errno.h>
+#include "fastmath.h"
+
+__FLT_TYPE
+__FLT_ABI(acosh) (__FLT_TYPE x)
+{
+ int x_class = fpclassify (x);
+ if (x_class == FP_NAN || x < __FLT_CST(1.0))
+ {
+ __FLT_RPT_DOMAIN ("acosh", x, 0.0, __FLT_NAN);
+ return __FLT_NAN;
+ }
+ else if (x_class == FP_INFINITE)
+ {
+ __FLT_RPT_DOMAIN ("acosh", x, 0.0, __FLT_NAN);
+ return __FLT_NAN;
+ }
+
+ if (x > __FLT_CST(0x1p32))
+ return __FLT_ABI (__fast_log) (x) + 6.9314718055994530941723E-1L;
+
+ return __FLT_ABI (__fast_log) (x +
+ __FLT_ABI (__fast_sqrt) ((x + __FLT_CST(1.0)) * (x - __FLT_CST(1.0))));
+}
+
libc/mingw/math/x86/acoshf.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_FLOAT 1
+#include "acosh.def.h"
libc/mingw/math/x86/acoshl.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "acosh.def.h"
libc/mingw/math/x86/acosl.c
@@ -0,0 +1,23 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+long double acosl (long double x);
+
+long double acosl (long double x)
+{
+ long double res = 0.0L;
+
+ /* acosl = atanl (sqrtl(1 - x^2) / x) */
+ asm volatile (
+ "fld %%st\n\t"
+ "fmul %%st(0)\n\t" /* x^2 */
+ "fld1\n\t"
+ "fsubp\n\t" /* 1 - x^2 */
+ "fsqrt\n\t" /* sqrtl (1 - x^2) */
+ "fxch %%st(1)\n\t"
+ "fpatan"
+ : "=t" (res) : "0" (x) : "st(1)");
+ return res;
+}
libc/mingw/math/x86/asinf.c
@@ -0,0 +1,28 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ */
+
+/* asin = atan (x / sqrt(1 - x^2)) */
+
+float asinf (float x);
+
+float asinf (float x)
+{
+ float res = 0.0F;
+
+ asm volatile (
+ "fld %%st\n\t"
+ "fmul %%st(0)\n\t" /* x^2 */
+ "fld1\n\t"
+ "fsubp\n\t" /* 1 - x^2 */
+ "fsqrt\n\t" /* sqrt (1 - x^2) */
+ "fpatan"
+ : "=t" (res) : "0" (x) : "st(1)");
+ return res;
+}
libc/mingw/math/x86/asinh.c
@@ -0,0 +1,33 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <errno.h>
+#include "fastmath.h"
+
+ /* asinh(x) = copysign(log(fabs(x) + sqrt(x * x + 1.0)), x) */
+double asinh(double x)
+{
+ double z;
+ if (!isfinite (x))
+ return x;
+ z = fabs (x);
+
+ /* Avoid setting FPU underflow exception flag in x * x. */
+#if 0
+ if ( z < 0x1p-32)
+ return x;
+#endif
+
+ /* Use log1p to avoid cancellation with small x. Put
+ x * x in denom, so overflow is harmless.
+ asinh(x) = log1p (x + sqrt (x * x + 1.0) - 1.0)
+ = log1p (x + x * x / (sqrt (x * x + 1.0) + 1.0)) */
+
+ z = __fast_log1p (z + z * z / (__fast_sqrt (z * z + 1.0) + 1.0));
+
+ return ( x > 0.0 ? z : -z);
+}
+
libc/mingw/math/x86/asinhf.c
@@ -0,0 +1,33 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <errno.h>
+#include "fastmath.h"
+
+ /* asinh(x) = copysign(log(fabs(x) + sqrt(x * x + 1.0)), x) */
+float asinhf(float x)
+{
+ float z;
+ if (!isfinite (x))
+ return x;
+ z = fabsf (x);
+
+ /* Avoid setting FPU underflow exception flag in x * x. */
+#if 0
+ if ( z < 0x1p-32)
+ return x;
+#endif
+
+
+ /* Use log1p to avoid cancellation with small x. Put
+ x * x in denom, so overflow is harmless.
+ asinh(x) = log1p (x + sqrt (x * x + 1.0) - 1.0)
+ = log1p (x + x * x / (sqrt (x * x + 1.0) + 1.0)) */
+
+ z = __fast_log1p (z + z * z / (__fast_sqrt (z * z + 1.0) + 1.0));
+
+ return ( x > 0.0 ? z : -z);
+}
libc/mingw/math/x86/asinhl.c
@@ -0,0 +1,33 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <errno.h>
+#include "fastmath.h"
+
+ /* asinh(x) = copysign(log(fabs(x) + sqrt(x * x + 1.0)), x) */
+long double asinhl(long double x)
+{
+ long double z;
+ if (!isfinite (x))
+ return x;
+
+ z = fabsl (x);
+
+ /* Avoid setting FPU underflow exception flag in x * x. */
+#if 0
+ if ( z < 0x1p-32)
+ return x;
+#endif
+
+ /* Use log1p to avoid cancellation with small x. Put
+ x * x in denom, so overflow is harmless.
+ asinh(x) = log1p (x + sqrt (x * x + 1.0) - 1.0)
+ = log1p (x + x * x / (sqrt (x * x + 1.0) + 1.0)) */
+
+ z = __fast_log1pl (z + z * z / (__fast_sqrtl (z * z + 1.0L) + 1.0L));
+
+ return ( x > 0.0 ? z : -z);
+}
libc/mingw/math/x86/asinl.c
@@ -0,0 +1,28 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ * Adapted for long double type by Danny Smith <dannysmith@users.sourceforge.net>.
+ */
+
+/* asin = atan (x / sqrt(1 - x^2)) */
+long double asinl (long double x);
+
+long double asinl (long double x)
+{
+ long double res = 0.0L;
+
+ asm volatile (
+ "fld %%st\n\t"
+ "fmul %%st(0)\n\t" /* x^2 */
+ "fld1\n\t"
+ "fsubp\n\t" /* 1 - x^2 */
+ "fsqrt\n\t" /* sqrt (1 - x^2) */
+ "fpatan"
+ : "=t" (res) : "0" (x) : "st(1)");
+ return res;
+}
libc/mingw/math/x86/atan2.c
@@ -0,0 +1,15 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <math.h>
+
+double
+atan2 (double y, double x)
+{
+ double res = 0.0;
+ asm volatile ("fpatan" : "=t" (res) : "u" (y), "0" (x) : "st(1)");
+ return res;
+}
libc/mingw/math/x86/atan2f.c
@@ -0,0 +1,20 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ */
+
+#include <math.h>
+
+float
+atan2f (float y, float x)
+{
+ float res = 0.0F;
+ asm volatile ("fpatan" : "=t" (res) : "u" (y), "0" (x) : "st(1)");
+ return res;
+}
libc/mingw/math/x86/atan2l.c
@@ -0,0 +1,14 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+long double atan2l (long double y, long double x);
+
+long double
+atan2l (long double y, long double x)
+{
+ long double res = 0.0L;
+ asm volatile ("fpatan" : "=t" (res) : "u" (y), "0" (x) : "st(1)");
+ return res;
+}
libc/mingw/math/x86/atanf.c
@@ -0,0 +1,23 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ */
+
+#include <math.h>
+
+float
+atanf (float x)
+{
+ float res = 0.0F;
+
+ asm volatile (
+ "fld1\n\t"
+ "fpatan" : "=t" (res) : "0" (x));
+ return res;
+}
libc/mingw/math/x86/atanh.c
@@ -0,0 +1,36 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <errno.h>
+#include "fastmath.h"
+
+/* atanh (x) = 0.5 * log ((1.0 + x)/(1.0 - x)) */
+
+double atanh(double x)
+{
+ double z;
+ if (isnan (x))
+ return x;
+ z = fabs (x);
+ if (z == 1.0)
+ {
+ errno = ERANGE;
+ return (x > 0 ? INFINITY : -INFINITY);
+ }
+ if (z > 1.0)
+ {
+ errno = EDOM;
+ return nan("");
+ }
+ /* Rearrange formula to avoid precision loss for small x.
+
+ atanh(x) = 0.5 * log ((1.0 + x)/(1.0 - x))
+ = 0.5 * log1p ((1.0 + x)/(1.0 - x) - 1.0)
+ = 0.5 * log1p ((1.0 + x - 1.0 + x) /(1.0 - x))
+ = 0.5 * log1p ((2.0 * x ) / (1.0 - x)) */
+ z = 0.5 * __fast_log1p ((z + z) / (1.0 - z));
+ return x >= 0 ? z : -z;
+}
libc/mingw/math/x86/atanhf.c
@@ -0,0 +1,35 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <errno.h>
+#include "fastmath.h"
+
+/* atanh (x) = 0.5 * log ((1.0 + x)/(1.0 - x)) */
+float atanhf (float x)
+{
+ float z;
+ if (isnan (x))
+ return x;
+ z = fabsf (x);
+ if (z == 1.0)
+ {
+ errno = ERANGE;
+ return (x > 0 ? INFINITY : -INFINITY);
+ }
+ if ( z > 1.0)
+ {
+ errno = EDOM;
+ return nanf("");
+ }
+ /* Rearrange formula to avoid precision loss for small x.
+
+ atanh(x) = 0.5 * log ((1.0 + x)/(1.0 - x))
+ = 0.5 * log1p ((1.0 + x)/(1.0 - x) - 1.0)
+ = 0.5 * log1p ((1.0 + x - 1.0 + x) /(1.0 - x))
+ = 0.5 * log1p ((2.0 * x ) / (1.0 - x)) */
+ z = 0.5 * __fast_log1p ((z + z) / (1.0 - z));
+ return x >= 0 ? z : -z;
+}
libc/mingw/math/x86/atanhl.c
@@ -0,0 +1,34 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <errno.h>
+#include "fastmath.h"
+
+/* atanh (x) = 0.5 * log ((1.0 + x)/(1.0 - x)) */
+long double atanhl (long double x)
+{
+ long double z;
+ if (isnan (x))
+ return x;
+ z = fabsl (x);
+ if (z == 1.0L)
+ {
+ errno = ERANGE;
+ return (x > 0 ? INFINITY : -INFINITY);
+ }
+ if ( z > 1.0L)
+ {
+ errno = EDOM;
+ return nanl("");
+ }
+ /* Rearrange formula to avoid precision loss for small x.
+ atanh(x) = 0.5 * log ((1.0 + x)/(1.0 - x))
+ = 0.5 * log1p ((1.0 + x)/(1.0 - x) - 1.0)
+ = 0.5 * log1p ((1.0 + x - 1.0 + x) /(1.0 - x))
+ = 0.5 * log1p ((2.0 * x ) / (1.0 - x)) */
+ z = 0.5L * __fast_log1pl ((z + z) / (1.0L - z));
+ return x >= 0 ? z : -z;
+}
libc/mingw/math/x86/atanl.c
@@ -0,0 +1,18 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+long double atanl (long double x);
+
+long double
+atanl (long double x)
+{
+ long double res = 0.0L;
+
+ asm volatile (
+ "fld1\n\t"
+ "fpatan"
+ : "=t" (res) : "0" (x));
+ return res;
+}
libc/mingw/math/x86/ceil.S
@@ -0,0 +1,115 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "ceil.S"
+ .text
+ .align 4
+ .globl __MINGW_USYMBOL(ceil)
+ .def __MINGW_USYMBOL(ceil); .scl 2; .type 32; .endef
+#ifdef __x86_64__
+ .seh_proc __MINGW_USYMBOL(ceil)
+#endif
+
+__MINGW_USYMBOL(ceil):
+#if defined(_AMD64_) || defined(__x86_64__)
+ .seh_endprologue
+ movd %xmm0, %rax
+ movq %rax, %rcx
+ sarq $52, %rcx
+ andl $2047, %ecx
+ subl $1023, %ecx
+ cmpl $51, %ecx
+ jg .is_intnaninf
+ /* Is x zero? */
+ testq %rax, %rax
+ je .ret_org
+ /* Is x signed? */
+ testl %ecx, %ecx
+ js .signed_val
+ /* Is x integral? */
+ movabsq $4503599627370495, %rdx
+ sarq %cl, %rdx
+ testq %rax, %rdx
+ je .ret_org
+ addsd .huge(%rip), %xmm0
+ ucomisd .zero(%rip), %xmm0
+ jbe .doret
+ testq %rax, %rax
+ jle .l1
+ /* inexact ... */
+ movabsq $4503599627370496, %r8
+ shrq %cl, %r8
+ addq %r8, %rax
+.l1:
+ notq %rdx
+ andq %rdx, %rax
+.doret:
+ movd %rax, %xmm0
+ ret
+ .p2align 4,,10
+.signed_val:
+ addsd .huge(%rip), %xmm0
+ ucomisd .zero(%rip), %xmm0
+ jbe .doret2
+ testq %rax, %rax
+ movabsq $4607182418800017408, %rdx
+ movabsq $-9223372036854775808, %rax
+ cmovns %rdx, %rax
+ .p2align 4,,10
+.doret2:
+ movd %rax, %xmm0
+ ret
+
+ .p2align 4,,10
+.is_intnaninf:
+ /* Is Nan or Inf? */
+ cmpl $1024, %ecx
+ je .ret_naninf
+ .p2align 4,,10
+.ret_org:
+ /* return x. */
+ rep
+ ret
+ .p2align 4,,10
+.ret_naninf:
+ /* return x + x; */
+ addsd %xmm0, %xmm0
+ ret
+ .seh_endproc
+
+/* local data. */
+ .section .rdata,"dr"
+ .align 8
+.huge:
+ .long -2013235812
+ .long 2117592124
+ .align 8
+.zero:
+ .long 0
+ .long 0
+#elif defined(_X86_) || defined(__i386__)
+ fldl 4(%esp)
+ subl $8,%esp
+
+ fstcw 4(%esp) /* store fpu control word */
+
+ /* We use here %edx although only the low 1 bits are defined.
+ But none of the operations should care and they are faster
+ than the 16 bit operations. */
+ movl $0x0800,%edx /* round towards +oo */
+ orl 4(%esp),%edx
+ andl $0xfbff,%edx
+ movl %edx,(%esp)
+ fldcw (%esp) /* load modified control word */
+
+ frndint /* round */
+
+ fldcw 4(%esp) /* restore original control word */
+
+ addl $8,%esp
+ ret
+#endif
libc/mingw/math/x86/ceilf.S
@@ -0,0 +1,111 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "ceilf.S"
+ .text
+ .align 4
+ .globl __MINGW_USYMBOL(ceilf)
+ .def __MINGW_USYMBOL(ceilf); .scl 2; .type 32; .endef
+#ifdef __x86_64__
+ .seh_proc __MINGW_USYMBOL(ceilf)
+#endif
+
+__MINGW_USYMBOL(ceilf):
+#if defined(_AMD64_) || defined(__x86_64__)
+ subq $24, %rsp
+ .seh_stackalloc 24
+ .seh_endprologue
+ movd %xmm0, 12(%rsp)
+ movl 12(%rsp), %eax
+ movl %eax, %ecx
+ movl %eax, %edx
+ sarl $23, %ecx
+ andl $255, %ecx
+ subl $127, %ecx
+ cmpl $22, %ecx
+ jg .l4
+ testl %ecx, %ecx
+ js .l5
+ movl $8388607, %r8d
+ sarl %cl, %r8d
+ testl %eax, %r8d
+ je .l3
+ addss .hugeval(%rip), %xmm0
+ ucomiss .zeroval(%rip), %xmm0
+ jbe .l2
+ testl %eax, %eax
+ jle .l1
+ movl $8388608, %eax
+ sarl %cl, %eax
+ addl %eax, %edx
+.l1:
+ movl %r8d, %eax
+ notl %eax
+ andl %edx, %eax
+.l2:
+ movl %eax, 8(%rsp)
+ movss 8(%rsp), %xmm0
+.l3:
+ addq $24, %rsp
+ ret
+ .p2align 4,,10
+.l4:
+ addl $-128, %ecx
+ jne .l3
+ addss %xmm0, %xmm0
+ addq $24, %rsp
+ ret
+ .p2align 4,,10
+.l5:
+ addss .hugeval(%rip), %xmm0
+ ucomiss .zeroval(%rip), %xmm0
+ jbe .islesseqzero
+ testl %eax, %eax
+ js .l6
+ movl $1065353216, %edx
+ cmovne %edx, %eax
+.islesseqzero:
+ movl %eax, 8(%rsp)
+ movss 8(%rsp), %xmm0
+ addq $24, %rsp
+ ret
+ .p2align 4,,10
+.l6:
+ movl $-2147483648, 8(%rsp)
+ movss 8(%rsp), %xmm0
+ addq $24, %rsp
+ ret
+ .seh_endproc
+ .section .rdata,"dr"
+ .align 4
+.hugeval:
+ .long 1900671690
+ .align 4
+.zeroval:
+ .long 0
+#elif defined(_X86_) || defined(__i386__)
+ flds 4(%esp)
+ subl $8,%esp
+
+ fstcw 4(%esp) /* store fpu control word */
+
+ /* We use here %edx although only the low 1 bits are defined.
+ But none of the operations should care and they are faster
+ than the 16 bit operations. */
+ movl $0x0800,%edx /* round towards +oo */
+ orl 4(%esp),%edx
+ andl $0xfbff,%edx
+ movl %edx,(%esp)
+ fldcw (%esp) /* load modified control word */
+
+ frndint /* round */
+
+ fldcw 4(%esp) /* restore original control word */
+
+ addl $8,%esp
+ ret
+#endif
libc/mingw/math/x86/ceill.S
@@ -0,0 +1,55 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "ceill.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+ .globl __MINGW_USYMBOL(ceill)
+ .def __MINGW_USYMBOL(ceill); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(ceill):
+#if defined(_AMD64_) || defined(__x86_64__)
+ fldt (%rdx)
+ subq $24,%rsp
+
+ fstcw 8(%rsp) /* store fpu control word */
+
+ /* We use here %edx although only the low 1 bits are defined.
+ But none of the operations should care and they are faster
+ than the 16 bit operations. */
+ movl $0x0800,%edx /* round towards +oo */
+ orl 8(%rsp),%edx
+ andl $0xfbff,%edx
+ movl %edx,(%rsp)
+ fldcw (%rsp) /* load modified control word */
+
+ frndint /* round */
+
+ fldcw 8(%rsp) /* restore original control word */
+
+ addq $24,%rsp
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+#elif defined(_X86_) || defined(__i386__)
+ fldt 4(%esp)
+ subl $8,%esp
+ fstcw 4(%esp)
+ movl $0x0800,%edx
+ orl 4(%esp),%edx
+ andl $0xfbff,%edx
+ movl %edx,(%esp)
+ fldcw (%esp)
+ frndint
+ fldcw 4(%esp)
+ addl $8,%esp
+ ret
+#endif
libc/mingw/math/x86/copysignl.S
@@ -0,0 +1,44 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Changes for long double by Ulrich Drepper <drepper@cygnus.com>
+ * Public domain.
+ */
+#include <_mingw_mac.h>
+
+ .file "copysignl.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+
+ .globl __MINGW_USYMBOL(copysignl)
+ .def __MINGW_USYMBOL(copysignl); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(copysignl):
+#if defined(_AMD64_) || defined(__x86_64__)
+ movq (%rdx), %rax
+ movq %rax, (%rcx)
+ movq 8(%rdx), %rax
+ movq 8(%r8), %rdx
+ andq $0x7fff, %rax
+ andq $0x8000, %rdx
+ orq %rdx, %rax
+ movq %rax, 8(%rcx)
+ movq %rcx, %rax
+ ret
+#elif defined(_X86_) || defined(__i386__)
+ movl 24(%esp),%edx
+ movl 12(%esp),%eax
+ andl $0x8000,%edx
+ andl $0x7fff,%eax
+ orl %edx,%eax
+ movl %eax,12(%esp)
+ fldt 4(%esp)
+ ret
+#endif
libc/mingw/math/x86/cos.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_DOUBLE 1
+#include "cos.def.h"
libc/mingw/math/x86/cos.def.h
@@ -0,0 +1,65 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 "../complex/complex_internal.h"
+#include <errno.h>
+
+extern long double __cosl_internal (long double);
+
+__FLT_TYPE
+__FLT_ABI(cos) (__FLT_TYPE x)
+{
+ int x_class = fpclassify (x);
+ if (x_class == FP_NAN)
+ {
+ __FLT_RPT_DOMAIN ("cos", x, 0.0, x);
+ return x;
+ }
+ else if (x_class == FP_INFINITE)
+ {
+ __FLT_RPT_DOMAIN ("cos", x, 0.0, __FLT_NAN);
+ return __FLT_NAN;
+ }
+ return (__FLT_TYPE) __cosl_internal ((long double) x);
+}
libc/mingw/math/x86/cosf.c
@@ -0,0 +1,11 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+float cosf(float _X)
+{
+ return ((float)cos((double)_X));
+}
libc/mingw/math/x86/cosl.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "cos.def.h"
libc/mingw/math/x86/cosl_internal.S
@@ -0,0 +1,55 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "cosl_internal.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(__cosl_internal)
+ .def __MINGW_USYMBOL(__cosl_internal); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(__cosl_internal):
+#ifdef __x86_64__
+ fldt (%rdx)
+ fcos
+ fnstsw %ax
+ testl $0x400,%eax
+ jz 1f
+ fldpi
+ fadd %st(0)
+ fxch %st(1)
+2: fprem1
+ fnstsw %ax
+ testl $0x400,%eax
+ jnz 2b
+ fstp %st(1)
+ fcos
+1: movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+#else
+ fldt 4(%esp)
+ fcos
+ fnstsw %ax
+ testl $0x400,%eax
+ jnz 1f
+ ret
+1: fldpi
+ fadd %st(0)
+ fxch %st(1)
+2: fprem1
+ fnstsw %ax
+ testl $0x400,%eax
+ jnz 2b
+ fstp %st(1)
+ fcos
+ ret
+#endif
+
libc/mingw/math/x86/cossin.c
@@ -0,0 +1,75 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+void sincos (double __x, double *p_sin, double *p_cos);
+void sincosl (long double __x, long double *p_sin, long double *p_cos);
+void sincosf (float __x, float *p_sin, float *p_cos);
+
+void sincos (double __x, double *p_sin, double *p_cos)
+{
+ long double c, s;
+
+ __asm__ __volatile__ ("fsincos\n\t"
+ "fnstsw %%ax\n\t"
+ "testl $0x400, %%eax\n\t"
+ "jz 1f\n\t"
+ "fldpi\n\t"
+ "fadd %%st(0)\n\t"
+ "fxch %%st(1)\n\t"
+ "2: fprem1\n\t"
+ "fnstsw %%ax\n\t"
+ "testl $0x400, %%eax\n\t"
+ "jnz 2b\n\t"
+ "fstp %%st(1)\n\t"
+ "fsincos\n\t"
+ "1:" : "=t" (c), "=u" (s) : "0" (__x) : "eax");
+ *p_sin = (double) s;
+ *p_cos = (double) c;
+}
+
+void sincosf (float __x, float *p_sin, float *p_cos)
+{
+ long double c, s;
+
+ __asm__ __volatile__ ("fsincos\n\t"
+ "fnstsw %%ax\n\t"
+ "testl $0x400, %%eax\n\t"
+ "jz 1f\n\t"
+ "fldpi\n\t"
+ "fadd %%st(0)\n\t"
+ "fxch %%st(1)\n\t"
+ "2: fprem1\n\t"
+ "fnstsw %%ax\n\t"
+ "testl $0x400, %%eax\n\t"
+ "jnz 2b\n\t"
+ "fstp %%st(1)\n\t"
+ "fsincos\n\t"
+ "1:" : "=t" (c), "=u" (s) : "0" (__x) : "eax");
+ *p_sin = (float) s;
+ *p_cos = (float) c;
+}
+
+void sincosl (long double __x, long double *p_sin, long double *p_cos)
+{
+ long double c, s;
+
+ __asm__ __volatile__ ("fsincos\n\t"
+ "fnstsw %%ax\n\t"
+ "testl $0x400, %%eax\n\t"
+ "jz 1f\n\t"
+ "fldpi\n\t"
+ "fadd %%st(0)\n\t"
+ "fxch %%st(1)\n\t"
+ "2: fprem1\n\t"
+ "fnstsw %%ax\n\t"
+ "testl $0x400, %%eax\n\t"
+ "jnz 2b\n\t"
+ "fstp %%st(1)\n\t"
+ "fsincos\n\t"
+ "1:" : "=t" (c), "=u" (s) : "0" (__x) : "eax");
+ *p_sin = s;
+ *p_cos = c;
+}
libc/mingw/math/x86/exp.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_DOUBLE 1
+#include "exp.def.h"
libc/mingw/math/x86/exp.def.h
@@ -0,0 +1,137 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 "../complex/complex_internal.h"
+#include <errno.h>
+
+static long double c0 = 1.44268798828125L; // INV_LN2
+static long double c1 = 7.05260771340735992468e-6L;
+
+static long double
+__expl_internal (long double x)
+{
+ long double res = 0.0L;
+ asm volatile (
+ "fldl2e\n\t" /* 1 log2(e) */
+ "fmul %%st(1),%%st\n\t" /* 1 x log2(e) */
+
+#ifdef __x86_64__
+ "subq $8, %%rsp\n"
+ "fnstcw 4(%%rsp)\n"
+ "movzwl 4(%%rsp), %%eax\n"
+ "orb $12, %%ah\n"
+ "movw %%ax, (%%rsp)\n"
+ "fldcw (%%rsp)\n"
+ "frndint\n\t" /* 1 i */
+ "fld %%st(1)\n\t" /* 2 x */
+ "frndint\n\t" /* 2 xi */
+ "fldcw 4(%%rsp)\n"
+ "addq $8, %%rsp\n"
+#else
+ "push %%eax\n\tsubl $8, %%esp\n"
+ "fnstcw 4(%%esp)\n"
+ "movzwl 4(%%esp), %%eax\n"
+ "orb $12, %%ah\n"
+ "movw %%ax, (%%esp)\n"
+ "fldcw (%%esp)\n"
+ "frndint\n\t" /* 1 i */
+ "fld %%st(1)\n\t" /* 2 x */
+ "frndint\n\t" /* 2 xi */
+ "fldcw 4(%%esp)\n"
+ "addl $8, %%esp\n\tpop %%eax\n"
+#endif
+ "fld %%st(1)\n\t" /* 3 i */
+ "fldt %2\n\t" /* 4 c0 */
+ "fld %%st(2)\n\t" /* 5 xi */
+ "fmul %%st(1),%%st\n\t" /* 5 c0 xi */
+ "fsubp %%st,%%st(2)\n\t" /* 4 f = c0 xi - i */
+ "fld %%st(4)\n\t" /* 5 x */
+ "fsub %%st(3),%%st\n\t" /* 5 xf = x - xi */
+ "fmulp %%st,%%st(1)\n\t" /* 4 c0 xf */
+ "faddp %%st,%%st(1)\n\t" /* 3 f = f + c0 xf */
+ "fldt %3\n\t" /* 4 */
+ "fmul %%st(4),%%st\n\t" /* 4 c1 * x */
+ "faddp %%st,%%st(1)\n\t" /* 3 f = f + c1 * x */
+ "f2xm1\n\t" /* 3 2^(fract(x * log2(e))) - 1 */
+ "fld1\n\t" /* 4 1.0 */
+ "faddp\n\t" /* 3 2^(fract(x * log2(e))) */
+ "fstp %%st(1)\n\t" /* 2 */
+ "fscale\n\t" /* 2 scale factor is st(1); e^x */
+ "fstp %%st(1)\n\t" /* 1 */
+ "fstp %%st(1)\n\t" /* 0 */
+ : "=t" (res) : "0" (x), "m" (c0), "m" (c1) : "ax", "dx");
+ return res;
+}
+
+__FLT_TYPE
+__FLT_ABI(exp) (__FLT_TYPE x)
+{
+ int x_class = fpclassify (x);
+ if (x_class == FP_NAN)
+ {
+ __FLT_RPT_DOMAIN ("exp", x, 0.0, x);
+ return x;
+ }
+ else if (x_class == FP_INFINITE)
+ {
+ __FLT_TYPE r = (signbit (x) ? __FLT_CST (0.0) : __FLT_HUGE_VAL);
+ __FLT_RPT_ERANGE ("exp", x, 0.0, r, signbit (x));
+ return r;
+ }
+ else if (x_class == FP_ZERO)
+ {
+ return __FLT_CST (1.0);
+ }
+ else if (x > __FLT_MAXLOG)
+ {
+ __FLT_RPT_ERANGE ("exp", x, 0.0, __FLT_HUGE_VAL, 1);
+ return __FLT_HUGE_VAL;
+ }
+ else if (x < __FLT_MINLOG)
+ {
+ return __FLT_CST(0.0);
+ }
+ else
+ return (__FLT_TYPE) __expl_internal ((long double) x);
+}
libc/mingw/math/x86/exp2.S
@@ -0,0 +1,94 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "exp2.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(exp2)
+ .def __MINGW_USYMBOL(exp2); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(exp2):
+#ifdef __x86_64__
+ subq $24, %rsp
+ movsd %xmm0,(%rsp)
+ fldl (%rsp)
+ fxam /* Is NaN or +-Inf? */
+ fstsw %ax
+ movb $0x45, %dh
+ andb %ah, %dh
+ cmpb $0x05, %dh
+ je 1f /* Is +-Inf, jump. */
+ fld %st
+ subq $8, %rsp /* int(x) */
+ fnstcw 4(%rsp)
+ movzwl 4(%rsp), %eax
+ orb $12, %ah
+ movw %ax, (%rsp)
+ fldcw (%rsp)
+ frndint
+ fldcw 4(%rsp)
+ addq $8, %rsp
+ fsubr %st,%st(1) /* fract(x) */
+ fxch
+ f2xm1 /* 2^(fract(x)) - 1 */
+ fld1
+ faddp /* 2^(fract(x)) */
+ fscale /* e^x */
+ fstp %st(1)
+ fstpl (%rsp)
+ movsd (%rsp),%xmm0
+ addq $24, %rsp
+ ret
+
+1: testl $0x200, %eax /* Test sign. */
+ jz 2f /* If positive, jump. */
+ fstp %st
+ fldz /* Set result to 0. */
+2: fstpl (%rsp)
+ movsd (%rsp),%xmm0
+ addq $24,%rsp
+ ret
+#else
+ fldl 4(%esp)
+/* I added the following ugly construct because exp(+-Inf) resulted
+ in NaN. The ugliness results from the bright minds at Intel.
+ For the i686 the code can be written better.
+ -- drepper@cygnus.com. */
+ fxam /* Is NaN or +-Inf? */
+ fstsw %ax
+ movb $0x45, %dh
+ andb %ah, %dh
+ cmpb $0x05, %dh
+ je 1f /* Is +-Inf, jump. */
+ fld %st
+ subl $8, %esp /* int(x) */
+ fnstcw 4(%esp)
+ movzwl 4(%esp), %eax
+ orb $12, %ah
+ movw %ax, (%esp)
+ fldcw (%esp)
+ frndint
+ fldcw 4(%esp)
+ addl $8, %esp
+ fsubr %st,%st(1) /* fract(x) */
+ fxch
+ f2xm1 /* 2^(fract(x)) - 1 */
+ fld1
+ faddp /* 2^(fract(x)) */
+ fscale /* e^x */
+ fstp %st(1)
+ ret
+
+1: testl $0x200, %eax /* Test sign. */
+ jz 2f /* If positive, jump. */
+ fstp %st
+ fldz /* Set result to 0. */
+2: ret
+#endif
libc/mingw/math/x86/exp2f.S
@@ -0,0 +1,94 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "exp2f.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(exp2f)
+ .def __MINGW_USYMBOL(exp2f); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(exp2f):
+#ifdef __x86_64__
+ subq $24, %rsp
+ movss %xmm0,(%rsp)
+ flds (%rsp)
+ fxam /* Is NaN or +-Inf? */
+ fstsw %ax
+ movb $0x45, %dh
+ andb %ah, %dh
+ cmpb $0x05, %dh
+ je 1f /* Is +-Inf, jump. */
+ fld %st
+ subq $8, %rsp /* int(x) */
+ fnstcw 4(%rsp)
+ movzwl 4(%rsp), %eax
+ orb $12, %ah
+ movw %ax, (%rsp)
+ fldcw (%rsp)
+ frndint
+ fldcw 4(%rsp)
+ addq $8, %rsp
+ fsubr %st,%st(1) /* fract(x) */
+ fxch
+ f2xm1 /* 2^(fract(x)) - 1 */
+ fld1
+ faddp /* 2^(fract(x)) */
+ fscale /* e^x */
+ fstp %st(1)
+ fstps (%rsp)
+ movss (%rsp),%xmm0
+ addq $24, %rsp
+ ret
+
+1: testl $0x200, %eax /* Test sign. */
+ jz 2f /* If positive, jump. */
+ fstp %st
+ fldz /* Set result to 0. */
+2: fstps (%rsp)
+ movss (%rsp),%xmm0
+ addq $24, %rsp
+ ret
+#else
+ flds 4(%esp)
+/* I added the following ugly construct because exp(+-Inf) resulted
+ in NaN. The ugliness results from the bright minds at Intel.
+ For the i686 the code can be written better.
+ -- drepper@cygnus.com. */
+ fxam /* Is NaN or +-Inf? */
+ fstsw %ax
+ movb $0x45, %dh
+ andb %ah, %dh
+ cmpb $0x05, %dh
+ je 1f /* Is +-Inf, jump. */
+ fld %st
+ subl $8, %esp /* int(x) */
+ fnstcw 4(%esp)
+ movzwl 4(%esp), %eax
+ orb $12, %ah
+ movw %ax, (%esp)
+ fldcw (%esp)
+ frndint
+ fldcw 4(%esp)
+ addl $8, %esp
+ fsubr %st,%st(1) /* fract(x) */
+ fxch
+ f2xm1 /* 2^(fract(x)) - 1 */
+ fld1
+ faddp /* 2^(fract(x)) */
+ fscale /* e^x */
+ fstp %st(1)
+ ret
+
+1: testl $0x200, %eax /* Test sign. */
+ jz 2f /* If positive, jump. */
+ fstp %st
+ fldz /* Set result to 0. */
+2: ret
+#endif
libc/mingw/math/x86/exp2l.S
@@ -0,0 +1,92 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "exp2l.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(exp2l)
+ .def __MINGW_USYMBOL(exp2l); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(exp2l):
+#ifdef __x86_64__
+ fldt (%rdx)
+ fxam /* Is NaN or +-Inf? */
+ fstsw %ax
+ movb $0x45, %dh
+ andb %ah, %dh
+ cmpb $0x05, %dh
+ je 1f /* Is +-Inf, jump. */
+ fld %st
+ subq $8, %rsp /* int(x) */
+ fnstcw 4(%rsp)
+ movzwl 4(%rsp), %eax
+ orb $12, %ah
+ movw %ax, (%rsp)
+ fldcw (%rsp)
+ frndint
+ fldcw 4(%rsp)
+ addq $8, %rsp
+ fsubr %st,%st(1) /* fract(x) */
+ fxch
+ f2xm1 /* 2^(fract(x)) - 1 */
+ fld1
+ faddp /* 2^(fract(x)) */
+ fscale /* e^x */
+ fstp %st(1)
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+
+1: testl $0x200, %eax /* Test sign. */
+ jz 2f /* If positive, jump. */
+ fstp %st
+ fldz /* Set result to 0. */
+2: movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+#else
+ fldt 4(%esp)
+/* I added the following ugly construct because exp(+-Inf) resulted
+ in NaN. The ugliness results from the bright minds at Intel.
+ For the i686 the code can be written better.
+ -- drepper@cygnus.com. */
+ fxam /* Is NaN or +-Inf? */
+ fstsw %ax
+ movb $0x45, %dh
+ andb %ah, %dh
+ cmpb $0x05, %dh
+ je 1f /* Is +-Inf, jump. */
+ fld %st
+ subl $8, %esp /* int(x) */
+ fnstcw 4(%esp)
+ movzwl 4(%esp), %eax
+ orb $12, %ah
+ movw %ax, (%esp)
+ fldcw (%esp)
+ frndint
+ fldcw 4(%esp)
+ addl $8, %esp
+ fsubr %st,%st(1) /* fract(x) */
+ fxch
+ f2xm1 /* 2^(fract(x)) - 1 */
+ fld1
+ faddp /* 2^(fract(x)) */
+ fscale /* e^x */
+ fstp %st(1)
+ ret
+
+1: testl $0x200, %eax /* Test sign. */
+ jz 2f /* If positive, jump. */
+ fstp %st
+ fldz /* Set result to 0. */
+2: ret
+#endif
libc/mingw/math/x86/expl.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "exp.def.h"
libc/mingw/math/x86/expm1.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_DOUBLE 1
+#include "expm1.def.h"
libc/mingw/math/x86/expm1.def.h
@@ -0,0 +1,72 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 "../complex/complex_internal.h"
+#include <errno.h>
+
+__FLT_TYPE
+__FLT_ABI(expm1) (__FLT_TYPE x)
+{
+ int x_class = fpclassify (x);
+ if (x_class == FP_NAN)
+ {
+ __FLT_RPT_DOMAIN ("expm1", x, 0.0, x);
+ return x;
+ }
+ else if (x_class == FP_INFINITE)
+ {
+ return (signbit (x) ? -__FLT_CST(1.0) : __FLT_HUGE_VAL);
+ }
+ else if (x_class == FP_ZERO)
+ {
+ return x;
+ }
+ if (__FLT_ABI (fabs) (x) < __FLT_LOGE2)
+ {
+ x /= __FLT_LOGE2;
+ __asm__ __volatile__ ("f2xm1" : "=t" (x) : "0" (x));
+ return x;
+ }
+ return __FLT_ABI (exp) (x) - __FLT_CST (1.0);
+}
libc/mingw/math/x86/expm1f.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_FLOAT 1
+#include "expm1.def.h"
libc/mingw/math/x86/expm1l.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "expm1.def.h"
libc/mingw/math/x86/fastmath.h
@@ -0,0 +1,120 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#ifndef _MINGWEX_FASTMATH_H_
+#define _MINGWEX_FASTMATH_H_
+
+/* Fast math inlines
+ No range or domain checks. No setting of errno. No tweaks to
+ protect precision near range limits. */
+
+/* For now this is an internal header with just the functions that
+ are currently used in building libmingwex.a math components */
+
+/* FIXME: We really should get rid of the code duplication using euther
+ C++ templates or tgmath-type macros. */
+
+static __inline__ double __fast_sqrt (double x)
+{
+ double res;
+ asm __volatile__ ("fsqrt" : "=t" (res) : "0" (x));
+ return res;
+}
+
+static __inline__ long double __fast_sqrtl (long double x)
+{
+ long double res;
+ asm __volatile__ ("fsqrt" : "=t" (res) : "0" (x));
+ return res;
+}
+
+static __inline__ float __fast_sqrtf (float x)
+{
+ float res;
+ asm __volatile__ ("fsqrt" : "=t" (res) : "0" (x));
+ return res;
+}
+
+
+static __inline__ double __fast_log (double x)
+{
+ double res;
+ asm __volatile__
+ ("fldln2\n\t"
+ "fxch\n\t"
+ "fyl2x"
+ : "=t" (res) : "0" (x) : "st(1)");
+ return res;
+}
+
+static __inline__ long double __fast_logl (long double x)
+{
+ long double res;
+ asm __volatile__
+ ("fldln2\n\t"
+ "fxch\n\t"
+ "fyl2x"
+ : "=t" (res) : "0" (x) : "st(1)");
+ return res;
+}
+
+
+static __inline__ float __fast_logf (float x)
+{
+ float res;
+ asm __volatile__
+ ("fldln2\n\t"
+ "fxch\n\t"
+ "fyl2x"
+ : "=t" (res) : "0" (x) : "st(1)");
+ return res;
+}
+
+static __inline__ double __fast_log1p (double x)
+{
+ double res;
+ /* fyl2xp1 accurate only for |x| <= 1.0 - 0.5 * sqrt (2.0) */
+ if (fabs (x) >= 1.0 - 0.5 * 1.41421356237309504880)
+ res = __fast_log (1.0 + x);
+ else
+ asm __volatile__
+ ("fldln2\n\t"
+ "fxch\n\t"
+ "fyl2xp1"
+ : "=t" (res) : "0" (x) : "st(1)");
+ return res;
+}
+
+static __inline__ long double __fast_log1pl (long double x)
+{
+ long double res;
+ /* fyl2xp1 accurate only for |x| <= 1.0 - 0.5 * sqrt (2.0) */
+ if (fabsl (x) >= 1.0L - 0.5L * 1.41421356237309504880L)
+ res = __fast_logl (1.0L + x);
+ else
+ asm __volatile__
+ ("fldln2\n\t"
+ "fxch\n\t"
+ "fyl2xp1"
+ : "=t" (res) : "0" (x) : "st(1)");
+ return res;
+}
+
+static __inline__ float __fast_log1pf (float x)
+{
+ float res;
+ /* fyl2xp1 accurate only for |x| <= 1.0 - 0.5 * sqrt (2.0) */
+ if (fabsf (x) >= 1.0 - 0.5 * 1.41421356237309504880)
+ res = __fast_logf (1.0 + x);
+ else
+ asm __volatile__
+ ("fldln2\n\t"
+ "fxch\n\t"
+ "fyl2xp1"
+ : "=t" (res) : "0" (x) : "st(1)");
+ return res;
+}
+
+#endif
libc/mingw/math/x86/floor.S
@@ -0,0 +1,167 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "floor.S"
+ .text
+ .p2align 4,,15
+ .globl __MINGW_USYMBOL(floor)
+ .def __MINGW_USYMBOL(floor); .scl 2; .type 32; .endef
+#ifdef __x86_64__
+ .seh_proc __MINGW_USYMBOL(floor)
+#endif
+__MINGW_USYMBOL(floor):
+#if defined(_AMD64_) || defined(__x86_64__)
+ pushq %rbx
+ .seh_pushreg %rbx
+ subq $16, %rsp
+ .seh_stackalloc 16
+ .seh_endprologue
+ movsd %xmm0, 8(%rsp)
+ movq 8(%rsp), %r9
+ movq %r9, %rdx
+ movl %r9d, %r10d
+ shrq $32, %rdx
+ movl %edx, %eax
+ movl %edx, %r11d
+ sarl $20, %eax
+ andl $2047, %eax
+ leal -1023(%rax), %r8d
+ cmpl $51, %r8d
+ jle .L2
+ cmpl $1024, %r8d
+ je .L27
+.L3:
+ addq $16, %rsp
+ popq %rbx
+ ret
+ .p2align 4,,10
+.L2:
+ cmpl $19, %r8d
+ jg .L4
+ testl %r8d, %r8d
+ js .L28
+ movl $1048575, %eax
+ movl %r8d, %ecx
+ shrl %cl, %eax
+ testl %r9d, %r9d
+ jne .L8
+ testl %edx, %eax
+ je .L3
+.L8:
+ movsd .hugeval(%rip), %xmm1
+ xorpd %xmm2, %xmm2
+ addsd %xmm0, %xmm1
+ ucomisd %xmm1, %xmm2
+ jae .L3
+ xorl %r9d, %r9d
+ testl %edx, %edx
+ jns .L9
+ movl $1048576, %r9d
+ movl %r8d, %ecx
+ sarl %cl, %r9d
+.L9:
+ addl %r9d, %edx
+ notl %eax
+ andl %edx, %eax
+ salq $32, %rax
+ movq %rax, 8(%rsp)
+ movsd 8(%rsp), %xmm0
+ addq $16, %rsp
+ popq %rbx
+ ret
+ .p2align 4,,10
+.L4:
+ leal -1043(%rax), %ecx
+ movl $-1, %ebx
+ shrl %cl, %ebx
+ testl %r9d, %ebx
+ je .L3
+ movsd .hugeval(%rip), %xmm1
+ xorpd %xmm2, %xmm2
+ addsd %xmm0, %xmm1
+ ucomisd %xmm1, %xmm2
+ jae .L3
+ testl %edx, %edx
+ js .L29
+.L11:
+ notl %ebx
+ salq $32, %r11
+ andl %ebx, %r10d
+ orq %r10, %r11
+ movq %r11, 8(%rsp)
+ movsd 8(%rsp), %xmm0
+ addq $16, %rsp
+ popq %rbx
+ ret
+ .p2align 4,,10
+.L27:
+ addsd %xmm0, %xmm0
+ addq $16, %rsp
+ popq %rbx
+ ret
+ .p2align 4,,10
+.L28:
+ movsd .hugeval(%rip), %xmm2
+ xorpd %xmm1, %xmm1
+ addsd %xmm0, %xmm2
+ ucomisd %xmm1, %xmm2
+ jbe .L3
+ testl %edx, %edx
+ js .L7
+ movapd %xmm1, %xmm0
+ jmp .L3
+ .p2align 4,,10
+.L7:
+ andl $2147483647, %edx
+ orl %r9d, %edx
+ je .L3
+ movabsq $-4616189618054758400, %rax
+ movq %rax, 8(%rsp)
+ movsd 8(%rsp), %xmm0
+ jmp .L3
+ .p2align 4,,10
+.L29:
+ cmpl $20, %r8d
+ je .L25
+ movl $1075, %ecx
+ movl $1, %r10d
+ subl %eax, %ecx
+ sall %cl, %r10d
+ addl %r9d, %r10d
+ jae .L11
+.L25:
+ leal 1(%rdx), %r11d
+ jmp .L11
+ .seh_endproc
+
+ .section .rdata,"dr"
+ .align 8
+.hugeval:
+ .long -2013235812
+ .long 2117592124
+#elif defined(_X86_) || defined(__i386__)
+ fldl 4(%esp)
+ subl $8,%esp
+
+ fstcw 4(%esp) /* store fpu control word */
+
+ /* We use here %edx although only the low 1 bits are defined.
+ But none of the operations should care and they are faster
+ than the 16 bit operations. */
+ movl $0x400,%edx /* round towards -oo */
+ orl 4(%esp),%edx
+ andl $0xf7ff,%edx
+ movl %edx,(%esp)
+ fldcw (%esp) /* load modified control word */
+
+ frndint /* round */
+
+ fldcw 4(%esp) /* restore original control word */
+
+ addl $8,%esp
+ ret
+#endif
libc/mingw/math/x86/floorf.S
@@ -0,0 +1,51 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+ #include <_mingw_mac.h>
+
+ .file "floorf.S"
+ .text
+ .p2align 4,,15
+ .globl __MINGW_USYMBOL(floorf)
+ .def __MINGW_USYMBOL(floorf); .scl 2; .type 32; .endef
+#ifdef __x86_64__
+ .seh_proc __MINGW_USYMBOL(floorf)
+#endif
+__MINGW_USYMBOL(floorf):
+#if defined(_AMD64_) || defined(__x86_64__)
+ subq $40, %rsp
+ .seh_stackalloc 40
+ .seh_endprologue
+ unpcklps %xmm0, %xmm0
+ cvtps2pd %xmm0, %xmm0
+ call floor
+ unpcklpd %xmm0, %xmm0
+ cvtpd2ps %xmm0, %xmm0
+ addq $40, %rsp
+ ret
+ .seh_endproc
+ .def __MINGW_USYMBOL(floor); .scl 2; .type 32; .endef
+#elif defined(_X86_) || defined(__i386__)
+ flds 4(%esp)
+ subl $8,%esp
+
+ fstcw 4(%esp) /* store fpu control word */
+
+ /* We use here %edx although only the low 1 bits are defined.
+ But none of the operations should care and they are faster
+ than the 16 bit operations. */
+ movl $0x400,%edx /* round towards -oo */
+ orl 4(%esp),%edx
+ andl $0xf7ff,%edx
+ movl %edx,(%esp)
+ fldcw (%esp) /* load modified control word */
+
+ frndint /* round */
+
+ fldcw 4(%esp) /* restore original control word */
+
+ addl $8,%esp
+ ret
+#endif
libc/mingw/math/x86/floorl.S
@@ -0,0 +1,63 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "floorl.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+ .globl __MINGW_USYMBOL(floorl)
+ .def __MINGW_USYMBOL(floorl); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(floorl):
+#if defined(_AMD64_) || defined(__x86_64__)
+ fldt (%rdx)
+ subq $24,%rsp
+
+ fstcw 8(%rsp) /* store fpu control word */
+
+ /* We use here %edx although only the low 1 bits are defined.
+ But none of the operations should care and they are faster
+ than the 16 bit operations. */
+ movl $0x400,%edx /* round towards -oo */
+ orl 8(%rsp),%edx
+ andl $0xf7ff,%edx
+ movl %edx,(%rsp)
+ fldcw (%rsp) /* load modified control word */
+
+ frndint /* round */
+
+ fldcw 8(%rsp) /* restore original control word */
+
+ addq $24,%rsp
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+#elif defined(_X86_) || defined(__i386__)
+ fldt 4(%esp)
+ subl $8,%esp
+
+ fstcw 4(%esp) /* store fpu control word */
+
+ /* We use here %edx although only the low 1 bits are defined.
+ But none of the operations should care and they are faster
+ than the 16 bit operations. */
+ movl $0x400,%edx /* round towards -oo */
+ orl 4(%esp),%edx
+ andl $0xf7ff,%edx
+ movl %edx,(%esp)
+ fldcw (%esp) /* load modified control word */
+
+ frndint /* round */
+
+ fldcw 4(%esp) /* restore original control word */
+
+ addl $8,%esp
+ ret
+#endif
libc/mingw/math/x86/fmod.c
@@ -0,0 +1,21 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+double fmod (double x, double y);
+
+double
+fmod (double x, double y)
+{
+ double res = 0.0;
+
+ asm volatile (
+ "1:\tfprem\n\t"
+ "fstsw %%ax\n\t"
+ "sahf\n\t"
+ "jp 1b\n\t"
+ "fstp %%st(1)"
+ : "=t" (res) : "0" (x), "u" (y) : "ax", "st(1)");
+ return res;
+}
libc/mingw/math/x86/fmodf.c
@@ -0,0 +1,29 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Public domain.
+ *
+ * Adapted for float type by Danny Smith
+ * <dannysmith@users.sourceforge.net>.
+ */
+
+#include <math.h>
+
+float
+fmodf (float x, float y)
+{
+ float res = 0.0F;
+
+ asm volatile (
+ "1:\tfprem\n\t"
+ "fstsw %%ax\n\t"
+ "sahf\n\t"
+ "jp 1b\n\t"
+ "fstp %%st(1)"
+ : "=t" (res) : "0" (x), "u" (y) : "ax", "st(1)");
+ return res;
+}
libc/mingw/math/x86/fmodl.c
@@ -0,0 +1,21 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+long double fmodl (long double x, long double y);
+
+long double
+fmodl (long double x, long double y)
+{
+ long double res = 0.0L;
+
+ asm volatile (
+ "1:\tfprem\n\t"
+ "fstsw %%ax\n\t"
+ "sahf\n\t"
+ "jp 1b\n\t"
+ "fstp %%st(1)"
+ : "=t" (res) : "0" (x), "u" (y) : "ax", "st(1)");
+ return res;
+}
libc/mingw/math/x86/frexpl.S
@@ -0,0 +1,130 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+/*
+ * frexpl(long double x, int* expnt) extracts the exponent from x.
+ * It returns an integer power of two to expnt and the significand
+ * between 0.5 and 1 to y. Thus x = y * 2**expn.
+ */
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 2
+#endif
+.globl __MINGW_USYMBOL(frexpl)
+__MINGW_USYMBOL(frexpl):
+#ifdef __x86_64__
+ pushq %rbp
+ movq %rsp,%rbp
+ subq $48,%rsp
+ pushq %rsi
+ fldt (%rdx)
+ movq %rcx,%r9
+ fld %st(0)
+ fstpt -12(%rbp)
+ leaq -4(%rbp),%rcx
+ movw -4(%rbp),%dx
+ andl $32767,%edx
+ jne L25
+ fldz
+ fucompp
+ fnstsw %ax
+ andb $68,%ah
+ xorb $64,%ah
+ jne L21
+ movl $0,(%r8)
+ fldz
+ jmp L24
+ .align 4,0x90
+ .align 4,0x90
+L21:
+ fldt -12(%rbp)
+ fadd %st(0),%st
+ fstpt -12(%rbp)
+ decl %edx
+ movw (%rcx),%si
+ andl $32767,%esi
+ jne L22
+ cmpl $-66,%edx
+ jg L21
+L22:
+ add %esi,%edx
+ jmp L19
+ .align 2,0x90
+L25:
+ fstp %st(0)
+L19:
+ addl $-16382,%edx
+ movl %edx,(%r8)
+ movw (%rcx),%ax
+ andl $-32768,%eax
+ orl $16382,%eax
+ movw %ax,(%rcx)
+ fldt -12(%rbp)
+L24:
+ popq %rsi
+ movq %r9,%rax
+ movq $0,8(%r9)
+ fstpt (%r9)
+ leave
+ ret
+#else
+ pushl %ebp
+ movl %esp,%ebp
+ subl $24,%esp
+ pushl %esi
+ pushl %ebx
+ fldt 8(%ebp)
+ movl 20(%ebp),%ebx
+ fld %st(0)
+ fstpt -12(%ebp)
+ leal -4(%ebp),%ecx
+ movw -4(%ebp),%dx
+ andl $32767,%edx
+ jne L25
+ fldz
+ fucompp
+ fnstsw %ax
+ andb $68,%ah
+ xorb $64,%ah
+ jne L21
+ movl $0,(%ebx)
+ fldz
+ jmp L24
+ .align 2,0x90
+ .align 2,0x90
+L21:
+ fldt -12(%ebp)
+ fadd %st(0),%st
+ fstpt -12(%ebp)
+ decl %edx
+ movw (%ecx),%si
+ andl $32767,%esi
+ jne L22
+ cmpl $-66,%edx
+ jg L21
+L22:
+ addl %esi,%edx
+ jmp L19
+ .align 2,0x90
+L25:
+ fstp %st(0)
+L19:
+ addl $-16382,%edx
+ movl %edx,(%ebx)
+ movw (%ecx),%ax
+ andl $-32768,%eax
+ orl $16382,%eax
+ movw %ax,(%ecx)
+ fldt -12(%ebp)
+L24:
+ leal -32(%ebp),%esp
+ popl %ebx
+ popl %esi
+ leave
+ ret
+#endif
libc/mingw/math/x86/fucom.c
@@ -0,0 +1,18 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+int __fp_unordered_compare (long double x, long double y);
+
+int
+__fp_unordered_compare (long double x, long double y){
+ unsigned short retval;
+ __asm__ __volatile__ (
+ "fucom %%st(1);"
+ "fnstsw;"
+ : "=a" (retval)
+ : "t" (x), "u" (y)
+ );
+ return retval;
+}
libc/mingw/math/x86/ilogb.S
@@ -0,0 +1,143 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "ilogb.S"
+ .text
+ .p2align 4,,15
+.globl __MINGW_USYMBOL(ilogb)
+ .def __MINGW_USYMBOL(ilogb); .scl 2; .type 32; .endef
+#ifdef __x86_64__
+ .seh_proc __MINGW_USYMBOL(ilogb)
+#endif
+__MINGW_USYMBOL(ilogb):
+#ifdef __x86_64__
+/* Generated code by:
+int
+ilogb (double x)
+{
+ __mingw_dbl_type_t hlp;
+ int hx, lx, ix;
+
+ hlp.x = x;
+ hx = hpl.lh.high & 0x7fffffff;
+ if (hx < 0x100000)
+ {
+ lx = hlp.lh.low;
+ if ((hx | lx) == 0)
+ return 0x80000000; // ilogb(0) = FP_ILOGB0
+ // subnormal x
+ if (hx == 0)
+ {
+ for (ix = -1043; lx > 0; lx <<= 1)
+ ix -=1;
+ }
+ else
+ {
+ for (ix = -1022,hx <<= 11; hx > 0; hx <<= 1)
+ ix -=1;
+ }
+ return ix;
+ }
+ if (hx < 0x7ff00000)
+ return (hx >> 20) - 1023;
+ lx = hlp.lh.low;
+ if (((hx ^ 0x7ff00000) | lx) == 0)
+ return 0x7fffffff;
+ return 0x80000000;
+} */
+ subq $24, %rsp
+ .seh_stackalloc 24
+ .seh_endprologue
+ movsd %xmm0, 8(%rsp)
+ movq 8(%rsp), %rdx
+ shrq $32, %rdx
+ andl $2147483647, %edx
+ cmpl $1048575, %edx
+ jg .L2
+ movq 8(%rsp), %rcx
+ movl %edx, %eax
+ orl %ecx, %eax
+ je .L8
+ testl %edx, %edx
+ jne .L4
+ testl %ecx, %ecx
+ movl %ecx, %edx
+ movl $-1043, %eax
+ jle .L3
+ .p2align 4,,10
+.L5:
+ addl %edx, %edx
+ subl $1, %eax
+ testl %edx, %edx
+ jg .L5
+ addq $24, %rsp
+ ret
+ .p2align 4,,10
+.L2:
+ cmpl $2146435071, %edx
+ jle .L13
+ movsd %xmm0, 8(%rsp)
+ movq 8(%rsp), %rax
+ xorl $2146435072, %edx
+ orl %eax, %edx
+ cmpl $1, %edx
+ sbbl %eax, %eax
+ addl $-2147483648, %eax
+.L3:
+ addq $24, %rsp
+ ret
+ .p2align 4,,10
+.L4:
+ sall $11, %edx
+ movl $-1022, %eax
+ testl %edx, %edx
+ jle .L3
+ .p2align 4,,10
+.L6:
+ addl %edx, %edx
+ subl $1, %eax
+ testl %edx, %edx
+ jg .L6
+ addq $24, %rsp
+ ret
+ .p2align 4,,10
+.L13:
+ sarl $20, %edx
+ leal -1023(%rdx), %eax
+ addq $24, %rsp
+ ret
+.L8:
+ movl $-2147483648, %eax
+ jmp .L3
+ .seh_endproc
+#else
+
+ fldl 4(%esp)
+/* I added the following ugly construct because ilogb(+-Inf) is
+ required to return INT_MAX in ISO C99.
+ -- jakub@redhat.com. */
+ fxam /* Is NaN or +-Inf? */
+ fstsw %ax
+ movb $0x45, %dh
+ andb %ah, %dh
+ cmpb $0x05, %dh
+ je 1f /* Is +-Inf, jump. */
+
+ fxtract
+ pushl %eax
+ fstp %st
+
+ fistpl (%esp)
+ fwait
+ popl %eax
+
+ ret
+
+1: fstp %st
+ movl $0x7fffffff, %eax
+ ret
+#endif
libc/mingw/math/x86/ilogbf.S
@@ -0,0 +1,109 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "ilogbf.S"
+ .text
+ .p2align 4,,15
+.globl __MINGW_USYMBOL(ilogbf)
+ .def __MINGW_USYMBOL(ilogbf); .scl 2; .type 32; .endef
+#ifdef __x86_64__
+ .seh_proc __MINGW_USYMBOL(ilogbf)
+#endif
+__MINGW_USYMBOL(ilogbf):
+#ifdef __x86_64__
+/* generated code for:
+int
+ilogbf (float x)
+{
+ __mingw_flt_type_t hlp;
+ int hx, ix;
+
+ hlp.x = x;
+ hx = (int) hlp.val & 0x7fffffff;
+ if (hx < 0x800000)
+ {
+ if (hx == 0)
+ return 0x80000000; // ilogb(0) = FP_ILOGB0
+ for (ix = -126, hx <<= 8; hx > 0; hx <<= 1)
+ ix -= 1;
+ return ix;
+ }
+ if (hx < 0x7f800000)
+ return (hx >> 23) - 127;
+ if (hx == 0x7f800000)
+ return 0x7fffffff;
+ return 0x80000000;
+} */
+ subq $24, %rsp
+ .seh_stackalloc 24
+ .seh_endprologue
+ movss %xmm0, 12(%rsp)
+ movl 12(%rsp), %edx
+ andl $2147483647, %edx
+ cmpl $8388607, %edx
+ jg .L2
+ testl %edx, %edx
+ je .L6
+ sall $8, %edx
+ movl $-126, %eax
+ testl %edx, %edx
+ jle .L3
+ .p2align 4,,10
+.L4:
+ addl %edx, %edx
+ subl $1, %eax
+ testl %edx, %edx
+ jg .L4
+.L3:
+ addq $24, %rsp
+ ret
+ .p2align 4,,10
+.L2:
+ cmpl $2139095039, %edx
+ jle .L10
+ cmpl $2139095040, %edx
+ movl $2147483647, %eax
+ movl $-2147483648, %edx
+ cmovne %edx, %eax
+ addq $24, %rsp
+ ret
+ .p2align 4,,10
+.L10:
+ sarl $23, %edx
+ leal -127(%rdx), %eax
+ addq $24, %rsp
+ ret
+.L6:
+ movl $-2147483648, %eax
+ jmp .L3
+ .seh_endproc
+#else
+ flds 4(%esp)
+/* I added the following ugly construct because ilogb(+-Inf) is
+ required to return INT_MAX in ISO C99.
+ -- jakub@redhat.com. */
+ fxam /* Is NaN or +-Inf? */
+ fstsw %ax
+ movb $0x45, %dh
+ andb %ah, %dh
+ cmpb $0x05, %dh
+ je 1f /* Is +-Inf, jump. */
+
+ fxtract
+ pushl %eax
+ fstp %st
+
+ fistpl (%esp)
+ fwait
+ popl %eax
+
+ ret
+
+1: fstp %st
+ movl $0x7fffffff, %eax
+ ret
+#endif
libc/mingw/math/x86/ilogbl.S
@@ -0,0 +1,65 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "ilogbl.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(ilogbl)
+ .def __MINGW_USYMBOL(ilogbl); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(ilogbl):
+#ifdef __x86_64__
+ fldt (%rcx)
+ fxam /* Is NaN or +-Inf? */
+ fstsw %ax
+ movb $0x45, %dh
+ andb %ah, %dh
+ cmpb $0x05, %dh
+ je 1f /* Is +-Inf, jump. */
+
+ fxtract
+ pushq %rax
+ fstp %st
+
+ fistpl (%rsp)
+ fwait
+ popq %rax
+
+ ret
+
+1: fstp %st
+ movl $0x7fffffff, %eax
+ ret
+#else
+ fldt 4(%esp)
+/* I added the following ugly construct because ilogb(+-Inf) is
+ required to return INT_MAX in ISO C99.
+ -- jakub@redhat.com. */
+ fxam /* Is NaN or +-Inf? */
+ fstsw %ax
+ movb $0x45, %dh
+ andb %ah, %dh
+ cmpb $0x05, %dh
+ je 1f /* Is +-Inf, jump. */
+
+ fxtract
+ pushl %eax
+ fstp %st
+
+ fistpl (%esp)
+ fwait
+ popl %eax
+
+ ret
+
+1: fstp %st
+ movl $0x7fffffff, %eax
+ ret
+#endif
libc/mingw/math/x86/internal_logl.S
@@ -0,0 +1,66 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "internal_logl.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+one: .double 1.0
+ /* It is not important that this constant is precise. It is only
+ a value which is known to be on the safe side for using the
+ fyl2xp1 instruction. */
+limit: .double 0.29
+
+.globl __MINGW_USYMBOL(__logl_internal)
+ .def __MINGW_USYMBOL(__logl_internal); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(__logl_internal):
+#ifdef __x86_64__
+ fldln2 // log(2)
+ fldt (%rdx) // x : log(2)
+ fld %st // x : x : log(2)
+ fsubl one(%rip) // x-1 : x : log(2)
+ fld %st // x-1 : x-1 : x : log(2)
+ fabs // |x-1| : x-1 : x : log(2)
+ fcompl limit(%rip) // x-1 : x : log(2)
+ fnstsw // x-1 : x : log(2)
+ andb $0x45, %ah
+ jz 2f
+ fstp %st(1) // x-1 : log(2)
+ fyl2xp1 // log(x)
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+
+2: fstp %st(0) // x : log(2)
+ fyl2x // log(x)
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+#else
+ fldln2 // log(2)
+ fldt 4(%esp) // x : log(2)
+ fld %st // x : x : log(2)
+ fsubl one // x-1 : x : log(2)
+ fld %st // x-1 : x-1 : x : log(2)
+ fabs // |x-1| : x-1 : x : log(2)
+ fcompl limit // x-1 : x : log(2)
+ fnstsw // x-1 : x : log(2)
+ andb $0x45, %ah
+ jz 2f
+ fstp %st(1) // x-1 : log(2)
+ fyl2xp1 // log(x)
+ ret
+
+2: fstp %st(0) // x : log(2)
+ fyl2x // log(x)
+ ret
+#endif
libc/mingw/math/x86/ldexp.c
@@ -0,0 +1,23 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <errno.h>
+
+double ldexp(double x, int expn)
+{
+ double res = 0.0;
+ if (!isfinite (x) || x == 0.0)
+ return x;
+
+ __asm__ __volatile__ ("fscale"
+ : "=t" (res)
+ : "0" (x), "u" ((double) expn));
+
+ if (!isfinite (res) || res == 0.0L)
+ errno = ERANGE;
+
+ return res;
+}
libc/mingw/math/x86/ldexpl.c
@@ -0,0 +1,23 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <errno.h>
+
+long double ldexpl(long double x, int expn)
+{
+ long double res = 0.0L;
+ if (!isfinite (x) || x == 0.0L)
+ return x;
+
+ __asm__ __volatile__ ("fscale"
+ : "=t" (res)
+ : "0" (x), "u" ((long double) expn));
+
+ if (!isfinite (res) || res == 0.0L)
+ errno = ERANGE;
+
+ return res;
+}
libc/mingw/math/x86/log.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_DOUBLE 1
+#include "log.def.h"
libc/mingw/math/x86/log.def.h
@@ -0,0 +1,69 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 "../complex/complex_internal.h"
+#include <errno.h>
+
+extern long double __cdecl __logl_internal (long double);
+
+__FLT_TYPE __cdecl
+__FLT_ABI(log) (__FLT_TYPE x)
+{
+ int x_class = fpclassify (x);
+ if (x_class == FP_ZERO)
+ {
+ __FLT_RPT_ERANGE ("log", x, 0.0, -__FLT_HUGE_VAL, 1);
+ return -__FLT_HUGE_VAL;
+ }
+ else if (signbit (x))
+ {
+ __FLT_RPT_DOMAIN ("log", x, 0.0, __FLT_NAN);
+ return __FLT_NAN;
+ }
+ else if (x_class == FP_INFINITE)
+ return __FLT_HUGE_VAL;
+ else if (x_class == FP_NAN)
+ return __FLT_NAN;
+ return (__FLT_TYPE) __logl_internal ((long double) x);
+}
libc/mingw/math/x86/log10l.S
@@ -0,0 +1,93 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "log10l.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+one: .double 1.0
+ /* It is not important that this constant is precise. It is only
+ a value which is known to be on the safe side for using the
+ fyl2xp1 instruction. */
+limit: .double 0.29
+
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(log10l)
+ .def __MINGW_USYMBOL(log10l); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(log10l):
+#ifdef __x86_64__
+ fldlg2 // log10(2)
+ fldt (%rdx) // x : log10(2)
+ fxam
+ fnstsw
+ fld %st // x : x : log10(2)
+ sahf
+ jc 3f // in case x is NaN or ๏ฟฝInf
+4: fsubl one(%rip) // x-1 : x : log10(2)
+ fld %st // x-1 : x-1 : x : log10(2)
+ fabs // |x-1| : x-1 : x : log10(2)
+ fcompl limit(%rip) // x-1 : x : log10(2)
+ fnstsw // x-1 : x : log10(2)
+ andb $0x45, %ah
+ jz 2f
+ fstp %st(1) // x-1 : log10(2)
+ fyl2xp1 // log10(x)
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+
+2: fstp %st(0) // x : log10(2)
+ fyl2x // log10(x)
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+
+3: jp 4b // in case x is ๏ฟฝInf
+ fstp %st(1)
+ fstp %st(1)
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+#else
+ fldlg2 // log10(2)
+ fldt 4(%esp) // x : log10(2)
+ fxam
+ fnstsw
+ fld %st // x : x : log10(2)
+ sahf
+ jc 3f // in case x is NaN or ๏ฟฝInf
+4: fsubl one // x-1 : x : log10(2)
+ fld %st // x-1 : x-1 : x : log10(2)
+ fabs // |x-1| : x-1 : x : log10(2)
+ fcompl limit // x-1 : x : log10(2)
+ fnstsw // x-1 : x : log10(2)
+ andb $0x45, %ah
+ jz 2f
+ fstp %st(1) // x-1 : log10(2)
+ fyl2xp1 // log10(x)
+ ret
+
+2: fstp %st(0) // x : log10(2)
+ fyl2x // log10(x)
+ ret
+
+3: jp 4b // in case x is ๏ฟฝInf
+ fstp %st(1)
+ fstp %st(1)
+ ret
+#endif
libc/mingw/math/x86/log1p.S
@@ -0,0 +1,85 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "log1p.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+ /* The fyl2xp1 can only be used for values in
+ -1 + sqrt(2) / 2 <= x <= 1 - sqrt(2) / 2
+ 0.29 is a safe value.
+ */
+limit: .double 0.29
+one: .double 1.0
+/*
+ * Use the fyl2xp1 function when the argument is in the range -0.29 to 0.29,
+ * otherwise fyl2x with the needed extra computation.
+ */
+.globl __MINGW_USYMBOL(log1p)
+ .def __MINGW_USYMBOL(log1p); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(log1p):
+#ifdef __x86_64__
+ movsd %xmm0,-16(%rsp)
+ fldln2
+ fldl -16(%rsp)
+ fxam
+ fnstsw
+ fld %st
+ sahf
+ jc 3f // in case x is NaN or ๏ฟฝInf
+
+4: fabs
+ fcompl limit(%rip)
+ fnstsw
+ sahf
+ jc 2f
+ faddl one(%rip)
+ fyl2x
+ fstpl -16(%rsp)
+ movsd -16(%rsp),%xmm0
+ ret
+
+2: fyl2xp1
+ fstpl -16(%rsp)
+ movsd -16(%rsp),%xmm0
+ ret
+
+3: jp 4b // in case x is ๏ฟฝInf
+ fstp %st(1)
+ fstp %st(1)
+ fstpl -16(%rsp)
+ movsd -16(%rsp),%xmm0
+ ret
+#else
+ fldln2
+ fldl 4(%esp)
+ fxam
+ fnstsw
+ fld %st
+ sahf
+ jc 3f // in case x is NaN or ๏ฟฝInf
+
+4: fabs
+ fcompl limit
+ fnstsw
+ sahf
+ jc 2f
+ faddl one
+ fyl2x
+ ret
+
+2: fyl2xp1
+ ret
+
+3: jp 4b // in case x is ๏ฟฝInf
+ fstp %st(1)
+ fstp %st(1)
+ ret
+#endif
libc/mingw/math/x86/log1pf.S
@@ -0,0 +1,85 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "log1pf.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+ /* The fyl2xp1 can only be used for values in
+ -1 + sqrt(2) / 2 <= x <= 1 - sqrt(2) / 2
+ 0.29 is a safe value.
+ */
+limit: .float 0.29
+one: .float 1.0
+/*
+ * Use the fyl2xp1 function when the argument is in the range -0.29 to 0.29,
+ * otherwise fyl2x with the needed extra computation.
+ */
+.globl __MINGW_USYMBOL(log1pf)
+ .def __MINGW_USYMBOL(log1pf); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(log1pf):
+#ifdef __x86_64__
+ movss %xmm0,-12(%rsp)
+ fldln2
+ flds -12(%rsp)
+ fxam
+ fnstsw
+ fld %st
+ sahf
+ jc 3f // in case x is NaN or ๏ฟฝInf
+
+4: fabs
+ fcomps limit(%rip)
+ fnstsw
+ sahf
+ jc 2f
+ fadds one(%rip)
+ fyl2x
+ fstps -12(%rsp)
+ movss -12(%rsp),%xmm0
+ ret
+
+2: fyl2xp1
+ fstps -12(%rsp)
+ movss -12(%rsp),%xmm0
+ ret
+
+3: jp 4b // in case x is ๏ฟฝInf
+ fstp %st(1)
+ fstp %st(1)
+ fstps -12(%rsp)
+ movss -12(%rsp),%xmm0
+ ret
+#else
+ fldln2
+ flds 4(%esp)
+ fxam
+ fnstsw
+ fld %st
+ sahf
+ jc 3f // in case x is NaN or ๏ฟฝInf
+
+4: fabs
+ fcomps limit
+ fnstsw
+ sahf
+ jc 2f
+ fadds one
+ fyl2x
+ ret
+
+2: fyl2xp1
+ ret
+
+3: jp 4b // in case x is ๏ฟฝInf
+ fstp %st(1)
+ fstp %st(1)
+ ret
+#endif
libc/mingw/math/x86/log1pl.S
@@ -0,0 +1,102 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "log1pl.S"
+ .text
+ /* The fyl2xp1 can only be used for values in
+ -1 + sqrt(2) / 2 <= x <= 1 - sqrt(2) / 2
+ 0.29 is a safe value.
+ */
+
+ /* Only gcc understands the .tfloat type
+ The series of .long below represents
+ limit: .tfloat 0.29
+ */
+ .align 16
+limit:
+ .long 2920577761
+ .long 2491081031
+ .long 16381
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+ /* Please note: we use a double value here. Since 1.0 has
+ an exact representation this does not effect the accuracy
+ but it helps to optimize the code. */
+one: .double 1.0
+
+/*
+ * Use the fyl2xp1 function when the argument is in the range -0.29 to 0.29,
+ * otherwise fyl2x with the needed extra computation.
+ */
+.globl __MINGW_USYMBOL(log1pl)
+ .def __MINGW_USYMBOL(log1pl); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(log1pl):
+#ifdef __x86_64__
+ fldln2
+ fldt (%rdx)
+ fxam
+ fnstsw
+ fld %st
+ sahf
+ jc 3f // in case x is NaN or ๏ฟฝInf
+4:
+ fabs
+ fldt limit(%rip)
+ fcompp
+ fnstsw
+ sahf
+ jnc 2f
+ faddl one(%rip)
+ fyl2x
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+
+2: fyl2xp1
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+
+3: jp 4b // in case x is ๏ฟฝInf
+ fstp %st(1)
+ fstp %st(1)
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+#else
+ fldln2
+ fldt 4(%esp)
+ fxam
+ fnstsw
+ fld %st
+ sahf
+ jc 3f // in case x is NaN or ๏ฟฝInf
+4:
+ fabs
+ fldt limit
+ fcompp
+ fnstsw
+ sahf
+ jnc 2f
+ faddl one
+ fyl2x
+ ret
+
+2: fyl2xp1
+ ret
+
+3: jp 4b // in case x is ๏ฟฝInf
+ fstp %st(1)
+ fstp %st(1)
+ ret
+#endif
libc/mingw/math/x86/log2.S
@@ -0,0 +1,85 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "log2.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+one: .double 1.0
+ /* It is not important that this constant is precise. It is only
+ a value which is known to be on the safe side for using the
+ fyl2xp1 instruction. */
+limit: .double 0.29
+
+.globl __MINGW_USYMBOL(log2)
+ .def __MINGW_USYMBOL(log2); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(log2):
+#ifdef __x86_64__
+ movsd %xmm0,-16(%rsp)
+ fldl one(%rip)
+ fldl -16(%rsp) // x : 1
+ fxam
+ fnstsw
+ fld %st // x : x : 1
+ sahf
+ jc 3f // in case x is NaN or ๏ฟฝInf
+4: fsub %st(2), %st // x-1 : x : 1
+ fld %st // x-1 : x-1 : x : 1
+ fabs // |x-1| : x-1 : x : 1
+ fcompl limit(%rip) // x-1 : x : 1
+ fnstsw // x-1 : x : 1
+ andb $0x45, %ah
+ jz 2f
+ fstp %st(1) // x-1 : 1
+ fyl2xp1 // log(x)
+ fstpl -16(%rsp)
+ movsd -16(%rsp),%xmm0
+ ret
+
+2: fstp %st(0) // x : 1
+ fyl2x // log(x)
+ fstpl -16(%rsp)
+ movsd -16(%rsp),%xmm0
+ ret
+
+3: jp 4b // in case x is ๏ฟฝInf
+ fstp %st(1)
+ fstp %st(1)
+ fstpl -16(%rsp)
+ movsd -16(%rsp),%xmm0
+ ret
+#else
+ fldl one
+ fldl 4(%esp) // x : 1
+ fxam
+ fnstsw
+ fld %st // x : x : 1
+ sahf
+ jc 3f // in case x is NaN or ๏ฟฝInf
+4: fsub %st(2), %st // x-1 : x : 1
+ fld %st // x-1 : x-1 : x : 1
+ fabs // |x-1| : x-1 : x : 1
+ fcompl limit // x-1 : x : 1
+ fnstsw // x-1 : x : 1
+ andb $0x45, %ah
+ jz 2f
+ fstp %st(1) // x-1 : 1
+ fyl2xp1 // log(x)
+ ret
+
+2: fstp %st(0) // x : 1
+ fyl2x // log(x)
+ ret
+
+3: jp 4b // in case x is ๏ฟฝInf
+ fstp %st(1)
+ fstp %st(1)
+ ret
+#endif
libc/mingw/math/x86/log2f.S
@@ -0,0 +1,85 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "log2f.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+one: .double 1.0
+ /* It is not important that this constant is precise. It is only
+ a value which is known to be on the safe side for using the
+ fyl2xp1 instruction. */
+limit: .double 0.29
+
+.globl __MINGW_USYMBOL(log2f)
+ .def __MINGW_USYMBOL(log2f); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(log2f):
+#ifdef __x86_64__
+ movss %xmm0,-12(%rsp)
+ fldl one(%rip)
+ flds -12(%rsp) // x : 1
+ fxam
+ fnstsw
+ fld %st // x : x : 1
+ sahf
+ jc 3f // in case x is NaN or ๏ฟฝInf
+4: fsub %st(2), %st // x-1 : x : 1
+ fld %st // x-1 : x-1 : x : 1
+ fabs // |x-1| : x-1 : x : 1
+ fcompl limit(%rip) // x-1 : x : 1
+ fnstsw // x-1 : x : 1
+ andb $0x45, %ah
+ jz 2f
+ fstp %st(1) // x-1 : 1
+ fyl2xp1 // log(x)
+ fstps -12(%rsp)
+ movss -12(%rsp),%xmm0
+ ret
+
+2: fstp %st(0) // x : 1
+ fyl2x // log(x)
+ fstps -12(%rsp)
+ movss -12(%rsp),%xmm0
+ ret
+
+3: jp 4b // in case x is ๏ฟฝInf
+ fstp %st(1)
+ fstp %st(1)
+ fstps -12(%rsp)
+ movss -12(%rsp),%xmm0
+ ret
+#else
+ fldl one
+ flds 4(%esp) // x : 1
+ fxam
+ fnstsw
+ fld %st // x : x : 1
+ sahf
+ jc 3f // in case x is NaN or ๏ฟฝInf
+4: fsub %st(2), %st // x-1 : x : 1
+ fld %st // x-1 : x-1 : x : 1
+ fabs // |x-1| : x-1 : x : 1
+ fcompl limit // x-1 : x : 1
+ fnstsw // x-1 : x : 1
+ andb $0x45, %ah
+ jz 2f
+ fstp %st(1) // x-1 : 1
+ fyl2xp1 // log(x)
+ ret
+
+2: fstp %st(0) // x : 1
+ fyl2x // log(x)
+ ret
+
+3: jp 4b // in case x is ๏ฟฝInf
+ fstp %st(1)
+ fstp %st(1)
+ ret
+#endif
libc/mingw/math/x86/log2l.S
@@ -0,0 +1,87 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "log2l.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+one: .double 1.0
+ /* It is not important that this constant is precise. It is only
+ a value which is known to be on the safe side for using the
+ fyl2xp1 instruction. */
+limit: .double 0.29
+
+.globl __MINGW_USYMBOL(log2l)
+ .def __MINGW_USYMBOL(log2l); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(log2l):
+#ifdef __x86_64__
+ fldl one(%rip)
+ fldt (%rdx) // x : 1
+ fxam
+ fnstsw
+ fld %st // x : x : 1
+ sahf
+ jc 3f // in case x is NaN or ๏ฟฝInf
+4: fsub %st(2), %st // x-1 : x : 1
+ fld %st // x-1 : x-1 : x : 1
+ fabs // |x-1| : x-1 : x : 1
+ fcompl limit(%rip) // x-1 : x : 1
+ fnstsw // x-1 : x : 1
+ andb $0x45, %ah
+ jz 2f
+ fstp %st(1) // x-1 : 1
+ fyl2xp1 // log(x)
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+
+2: fstp %st(0) // x : 1
+ fyl2x // log(x)
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+
+3: jp 4b // in case x is ๏ฟฝInf
+ fstp %st(1)
+ fstp %st(1)
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+#else
+ fldl one
+ fldt 4(%esp) // x : 1
+ fxam
+ fnstsw
+ fld %st // x : x : 1
+ sahf
+ jc 3f // in case x is NaN or ๏ฟฝInf
+4: fsub %st(2), %st // x-1 : x : 1
+ fld %st // x-1 : x-1 : x : 1
+ fabs // |x-1| : x-1 : x : 1
+ fcompl limit // x-1 : x : 1
+ fnstsw // x-1 : x : 1
+ andb $0x45, %ah
+ jz 2f
+ fstp %st(1) // x-1 : 1
+ fyl2xp1 // log(x)
+ ret
+
+2: fstp %st(0) // x : 1
+ fyl2x // log(x)
+ ret
+
+3: jp 4b // in case x is ๏ฟฝInf
+ fstp %st(1)
+ fstp %st(1)
+ ret
+#endif
libc/mingw/math/x86/logb.c
@@ -0,0 +1,38 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Changes for long double by Ulrich Drepper <drepper@cygnus.com>
+ * Public domain.
+ */
+
+#include <math.h>
+
+double
+logb (double x)
+{
+#ifdef __x86_64__
+ __mingw_dbl_type_t hlp;
+ int lx, hx;
+
+ hlp.x = x;
+ lx = hlp.lh.low;
+ hx = hlp.lh.high & 0x7fffffff; /* high |x| */
+ if ((hx | lx) == 0)
+ return -1.0 / fabs (x);
+ if (hx >= 0x7ff00000)
+ return x * x;
+ if ((hx >>= 20) == 0) /* IEEE 754 logb */
+ return -1022.0;
+ return (double) (hx - 1023);
+#else
+ double res = 0.0;
+ asm volatile (
+ "fxtract\n\t"
+ "fstp %%st" : "=t" (res) : "0" (x));
+ return res;
+#endif
+}
libc/mingw/math/x86/logbf.c
@@ -0,0 +1,37 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Changes for long double by Ulrich Drepper <drepper@cygnus.com>
+ * Public domain.
+ */
+
+#include <math.h>
+
+float
+logbf (float x)
+{
+#ifdef __x86_64__
+ int v;
+ __mingw_flt_type_t hlp;
+
+ hlp.x = x;
+ v = hlp.val & 0x7fffffff; /* high |x| */
+ if (!v)
+ return (float)-1.0 / fabsf (x);
+ if (v >= 0x7f800000)
+ return x * x;
+ if ((v >>= 23) == 0) /* IEEE 754 logb */
+ return -126.0;
+ return (float) (v - 127);
+#else
+ float res = 0.0F;
+ asm volatile (
+ "fxtract\n\t"
+ "fstp %%st" : "=t" (res) : "0" (x));
+ return res;
+#endif
+}
libc/mingw/math/x86/logbl.c
@@ -0,0 +1,23 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ * Written by J.T. Conklin <jtc@netbsd.org>.
+ * Changes for long double by Ulrich Drepper <drepper@cygnus.com>
+ * Public domain.
+ */
+
+#include <math.h>
+
+long double
+logbl (long double x)
+{
+ long double res = 0.0L;
+
+ asm volatile (
+ "fxtract\n\t"
+ "fstp %%st" : "=t" (res) : "0" (x));
+ return res;
+}
libc/mingw/math/x86/logl.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "log.def.h"
libc/mingw/math/x86/nearbyint.S
@@ -0,0 +1,51 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "nearbyint.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+ .globl __MINGW_USYMBOL(nearbyint)
+ .def __MINGW_USYMBOL(nearbyint); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(nearbyint):
+#if defined(_AMD64_) || defined(__x86_64__)
+ movsd %xmm0,-16(%rsp)
+ fldl -16(%rsp)
+ pushq %rax
+ pushq %rcx
+ fnstcw (%rsp)
+ movq (%rsp), %rax
+ orq $0x20, %rax
+ movq %rax, 8(%rsp)
+ fldcw 8(%rsp)
+ frndint
+ fclex
+ fldcw (%rsp)
+ popq %rcx
+ popq %rax
+ fstpl -16(%rsp)
+ movsd -16(%rsp),%xmm0
+ ret
+#elif defined(_X86_) || defined(__i386__)
+ fldl 4(%esp)
+ pushl %eax
+ pushl %ecx
+ fnstcw (%esp)
+ movl (%esp), %eax
+ orl $0x20, %eax
+ movl %eax, 4(%esp)
+ fldcw 4(%esp)
+ frndint
+ fclex
+ fldcw (%esp)
+ popl %ecx
+ popl %eax
+ ret
+#endif
libc/mingw/math/x86/nearbyintf.S
@@ -0,0 +1,51 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "nearbyintf.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+ .globl __MINGW_USYMBOL(nearbyintf)
+ .def __MINGW_USYMBOL(nearbyintf); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(nearbyintf):
+#if defined(_AMD64_) || defined(__x86_64__)
+ movss %xmm0,-12(%rsp)
+ flds -12(%rsp)
+ pushq %rax
+ pushq %rcx
+ fnstcw (%rsp)
+ movq (%rsp), %rax
+ orq $0x20, %rax
+ movq %rax, 8(%rsp)
+ fldcw 8(%rsp)
+ frndint
+ fclex
+ fldcw (%rsp)
+ popq %rcx
+ popq %rax
+ fstps -12(%rsp)
+ movss -12(%rsp),%xmm0
+ ret
+#elif defined(_X86_) || defined(__i386__)
+ flds 4(%esp)
+ pushl %eax
+ pushl %ecx
+ fnstcw (%esp)
+ movl (%esp), %eax
+ orl $0x20, %eax
+ movl %eax, 4(%esp)
+ fldcw 4(%esp)
+ frndint
+ fclex
+ fldcw (%esp)
+ popl %ecx
+ popl %eax
+ ret
+#endif
libc/mingw/math/x86/nearbyintl.S
@@ -0,0 +1,52 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "nearbyintl.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+ .globl __MINGW_USYMBOL(nearbyintl)
+ .def __MINGW_USYMBOL(nearbyintl); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(nearbyintl):
+#if defined(_AMD64_) || defined(__x86_64__)
+ fldt (%rdx)
+ movq %rcx,%r8
+ pushq %rax
+ pushq %rcx
+ fnstcw (%rsp)
+ movl (%rsp), %eax
+ orl $0x20, %eax
+ movl %eax, 8(%rsp)
+ fldcw 8(%rsp)
+ frndint
+ fclex
+ fldcw (%rsp)
+ popq %rcx
+ popq %rax
+ movq %r8,%rax
+ movq $0,8(%r8)
+ fstpt (%r8)
+ ret
+#elif defined(_X86_) || defined(__i386__)
+ fldt 4(%esp)
+ pushl %eax
+ pushl %ecx
+ fnstcw (%esp)
+ movl (%esp), %eax
+ orl $0x20, %eax
+ movl %eax, 4(%esp)
+ fldcw 4(%esp)
+ frndint
+ fclex
+ fldcw (%esp)
+ popl %ecx
+ popl %eax
+ ret
+#endif
libc/mingw/math/x86/pow.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_DOUBLE 1
+#include "pow.def.h"
libc/mingw/math/x86/pow.def.h
@@ -0,0 +1,215 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* IEEE 754 - Elementary Functions - Special Cases
+ * pow(+/-0, oo) is +0
+ * pow(+/-0, -oo) is +oo
+ * pow (x, +/-0) is 1 for any x (even a zero, quiet NaN, or infinity)
+ * pow (+1, y) is 1 for any y (even a quiet NaN)
+ * pow (+/-0, y) is +/-oo and signals the divideByZero exception for y an odd integer < 0
+ * pow (+/-0, y) is +oo and signals the divideByZero exception for finite y < 0 and not an odd integer
+ * pow (+/-0, y) is +/-0 for finite y > 0 an odd integer
+ * pow (+/-0, y) is +0 for finite y > 0 and not an odd integer
+ * pow (-1, +/-oo) is 1 with no exception
+ pow( -inf, y) = +0 for y<0 and not an odd integer
+ pow( -inf, y) = -inf for y an odd integer > 0
+ pow( -inf, y) = +inf for y>0 and not an odd integer
+ pow (+/-inf, y) is +/-0 with no exception for y an odd integer < 0
+ pow (+/-inf, -inf) is +0 with no exception
+ pow (+/-inf, +inf) is +inf with no exception
+ pow (+/-inf, y) is +0 with no exception for finite y < 0 and not an odd integer
+ pow (+/-inf, y) is +/-inf with no exception for finite y > 0 an odd integer
+ pow (+/-inf, y) is +inf with no exception for finite y > 0 and not an odd integer
+ pow (x, y) signals the invalid operation exception for finite x < 0 and finite non-integer y.
+
+ For x /= 0: lim y->oo (1/x)^y results as: for |x| < 1 that sgn(x)*0 and for |x| > 0 that sgn(x)*Infinity
+
+*/
+#include "../complex/complex_internal.h"
+#include <errno.h>
+#include <limits.h>
+#include <fenv.h>
+#include <math.h>
+#include <errno.h>
+#define FE_ROUNDING_MASK \
+ (FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO)
+
+static __FLT_TYPE
+internal_modf (__FLT_TYPE value, __FLT_TYPE *iptr)
+{
+ __FLT_TYPE int_part = (__FLT_TYPE) 0.0;
+ /* truncate */
+ /* truncate */
+#ifdef __x86_64__
+ asm volatile ("pushq %%rax\n\tsubq $8, %%rsp\n"
+ "fnstcw 4(%%rsp)\n"
+ "movzwl 4(%%rsp), %%eax\n"
+ "orb $12, %%ah\n"
+ "movw %%ax, (%%rsp)\n"
+ "fldcw (%%rsp)\n"
+ "frndint\n"
+ "fldcw 4(%%rsp)\n"
+ "addq $8, %%rsp\npopq %%rax" : "=t" (int_part) : "0" (value)); /* round */
+#else
+ asm volatile ("push %%eax\n\tsubl $8, %%esp\n"
+ "fnstcw 4(%%esp)\n"
+ "movzwl 4(%%esp), %%eax\n"
+ "orb $12, %%ah\n"
+ "movw %%ax, (%%esp)\n"
+ "fldcw (%%esp)\n"
+ "frndint\n"
+ "fldcw 4(%%esp)\n"
+ "addl $8, %%esp\n\tpop %%eax\n" : "=t" (int_part) : "0" (value)); /* round */
+#endif
+ if (iptr)
+ *iptr = int_part;
+ return (isinf (value) ? (__FLT_TYPE) 0.0 : value - int_part);
+}
+
+__FLT_TYPE __cdecl __FLT_ABI(__powi) (__FLT_TYPE x, int n);
+
+__FLT_TYPE __cdecl
+__FLT_ABI(pow) (__FLT_TYPE x, __FLT_TYPE y)
+{
+ int x_class = fpclassify (x);
+ int y_class = fpclassify (y);
+ long odd_y = 0;
+ __FLT_TYPE d, rslt;
+
+ if (y_class == FP_ZERO || x == __FLT_CST(1.0))
+ return __FLT_CST(1.0);
+ else if (x_class == FP_NAN || y_class == FP_NAN)
+ {
+ rslt = (signbit(x) ? -__FLT_NAN : __FLT_NAN);
+ __FLT_RPT_DOMAIN ("pow", x, y, rslt);
+ return rslt;
+ }
+ else if (x_class == FP_ZERO)
+ {
+ if (y_class == FP_INFINITE)
+ return (signbit(y) ? __FLT_HUGE_VAL : __FLT_CST(0.0));
+
+ if (signbit(x) && internal_modf (y, &d) != 0.0)
+ {
+ return signbit (y) ? (1.0 / -x) : __FLT_CST (0.0);
+ /*__FLT_RPT_DOMAIN ("pow", x, y, -__FLT_NAN);
+ return -__FLT_NAN; */
+ }
+ odd_y = (internal_modf (__FLT_ABI (ldexp) (y, -1), &d) != 0.0) ? 1 : 0;
+ if (!signbit(y))
+ {
+ if (!odd_y || !signbit (x))
+ return __FLT_CST (0.0);
+ return -__FLT_CST(0.0);
+ }
+
+ if (!odd_y || !signbit (x))
+ return __FLT_HUGE_VAL;
+ return (signbit(x) ? -__FLT_HUGE_VAL : __FLT_HUGE_VAL);
+ }
+ else if (y_class == FP_INFINITE)
+ {
+ __FLT_TYPE a_x;
+
+ if (x_class == FP_INFINITE)
+ return (signbit (y) ? __FLT_CST (0.0) : __FLT_HUGE_VAL);
+ a_x = (signbit (x) ? -x : x);
+ if (a_x == 1.0)
+ return __FLT_CST (1.0);
+ if (a_x > 1.0)
+ return (signbit (y) == 0 ? __FLT_HUGE_VAL : __FLT_CST (0.0));
+ return (!signbit (y) ? __FLT_CST (0.0) : __FLT_HUGE_VAL);
+ }
+ else if (x_class == FP_INFINITE)
+ {
+ /* pow (x, y) signals the invalid operation exception for finite x < 0 and finite non-integer y. */
+ if (signbit(x) && internal_modf (y, &d) != 0.0)
+ {
+ return signbit(y) ? 1.0 / -x : -x;
+ /*__FLT_RPT_DOMAIN ("pow", x, y, -__FLT_NAN);
+ return -__FLT_NAN;*/
+ }
+ odd_y = (internal_modf (__FLT_ABI (ldexp) (y, -1), &d) != 0.0) ? 1 : 0;
+ /* pow( -inf, y) = +0 for y<0 and not an odd integer, */
+ if (signbit(x) && signbit(y) && !odd_y)
+ return __FLT_CST(0.0);
+ /* pow( -inf, y) = -inf for y an odd integer > 0. */
+ if (signbit(x) && !signbit(y) && odd_y)
+ return -__FLT_HUGE_VAL;
+ /* pow( -inf, y) = +inf for y>0 and not an odd integer. */
+ if (signbit(x) && !signbit(y) && !odd_y)
+ return __FLT_HUGE_VAL;
+ /* pow (+/-inf, y) is +/-0 with no exception for y an odd integer < 0. */
+ if (signbit(y))
+ {
+ /* pow (+/-inf, y) is +0 with no exception for finite y < 0 and not an odd integer. */
+ return (odd_y && signbit(x) ? -__FLT_CST(0.0) : __FLT_CST(0.0));
+ }
+ /* pow (+/-inf, y) is +/-inf with no exception for finite y > 0 an odd integer. */
+ /* pow (+/-inf, y) is +inf with no exception for finite y > 0 and not an odd integer. */
+ return (odd_y && signbit(x) ? -__FLT_HUGE_VAL : __FLT_HUGE_VAL);
+ }
+
+ if (internal_modf (y, &d) != 0.0)
+ {
+ if (signbit (x))
+ {
+ __FLT_RPT_DOMAIN ("pow", x, y, -__FLT_NAN);
+ return -__FLT_NAN;
+ }
+ if (y == __FLT_CST(0.5))
+ {
+ asm volatile ("fsqrt" : "=t" (rslt) : "0" (x));
+ return rslt;
+ }
+ }
+ else if ((d <= (__FLT_TYPE) INT_MAX && d >= (__FLT_TYPE) INT_MIN))
+ return __FLT_ABI (__powi) (x, (int) y);
+ /* As exp already checks for minlog and maxlog no further checks are necessary. */
+ rslt = (__FLT_TYPE) exp2l ((long double) y * log2l ((long double) __FLT_ABI(fabs) (x)));
+
+ if (signbit (x) && internal_modf (__FLT_ABI (ldexp) (y, -1), &d) != 0.0)
+ rslt = -rslt;
+ return rslt;
+}
libc/mingw/math/x86/powl.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "pow.def.h"
libc/mingw/math/x86/remainder.S
@@ -0,0 +1,40 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "remainder.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(remainder)
+ .def __MINGW_USYMBOL(remainder); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(remainder):
+#ifdef __x86_64__
+ movsd %xmm0,-16(%rsp)
+ movsd %xmm1,-32(%rsp)
+ fldl -32(%rsp)
+ fldl -16(%rsp)
+1: fprem1
+ fstsw %ax
+ sahf
+ jp 1b
+ fstp %st(1)
+ fstpl -16(%rsp)
+ movsd -16(%rsp),%xmm0
+ ret
+#else
+ fldl 12(%esp)
+ fldl 4(%esp)
+1: fprem1
+ fstsw %ax
+ sahf
+ jp 1b
+ fstp %st(1)
+ ret
+#endif
libc/mingw/math/x86/remainderf.S
@@ -0,0 +1,40 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "remainderf.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(remainder)
+ .def __MINGW_USYMBOL(remainderf); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(remainderf):
+#ifdef __x86_64__
+ movss %xmm1,-12(%rsp)
+ flds -12(%rsp)
+ movss %xmm0,-12(%rsp)
+ flds -12(%rsp)
+1: fprem1
+ fstsw %ax
+ sahf
+ jp 1b
+ fstp %st(1)
+ fstps -12(%rsp)
+ movss -12(%rsp),%xmm0
+ ret
+#else
+ flds 8(%esp)
+ flds 4(%esp)
+1: fprem1
+ fstsw %ax
+ sahf
+ jp 1b
+ fstp %st(1)
+ ret
+#endif
libc/mingw/math/x86/remainderl.S
@@ -0,0 +1,39 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "remainderl.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(remainderl)
+ .def __MINGW_USYMBOL(remainderl); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(remainderl):
+#ifdef __x86_64__
+ fldt (%r8)
+ fldt (%rdx)
+1: fprem1
+ fstsw %ax
+ sahf
+ jp 1b
+ fstp %st(1)
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+#else
+ fldt 16(%esp)
+ fldt 4(%esp)
+1: fprem1
+ fstsw %ax
+ sahf
+ jp 1b
+ fstp %st(1)
+ ret
+#endif
libc/mingw/math/x86/remquo.S
@@ -0,0 +1,75 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "remquo.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(remquo)
+__MINGW_USYMBOL(remquo):
+#ifdef __x86_64__
+ movsd %xmm1,-16(%rsp)
+ fldl -16(%rsp)
+ movsd %xmm0,-16(%rsp)
+ fldl -16(%rsp)
+1: fprem1
+ fstsw %ax
+ sahf
+ jp 1b
+ fstp %st(1)
+ movl %eax, %ecx
+ shrl $8, %eax
+ shrl $12, %ecx
+ andl $4, %ecx
+ andl $3, %eax
+ orl %eax, %ecx
+ leal (%ecx,%ecx,2),%ecx
+ movl $0xef2a60, %eax
+ shrl %cl, %eax
+ andl $7, %eax
+ movl -12(%rsp), %edx
+ movsd %xmm1,-16(%rsp)
+ xorl -12(%rsp), %edx
+ testl $0x80000000, %edx
+ jz 1f
+ negl %eax
+1: movl %eax, (%r8)
+
+ fstpl -16(%rsp)
+ movsd -16(%rsp),%xmm0
+ ret
+#else
+ fldl 4 +8(%esp)
+ fldl 4(%esp)
+1: fprem1
+ fstsw %ax
+ sahf
+ jp 1b
+ fstp %st(1)
+ movl %eax, %ecx
+ shrl $8, %eax
+ shrl $12, %ecx
+ andl $4, %ecx
+ andl $3, %eax
+ orl %eax, %ecx
+ leal (%ecx,%ecx,2),%ecx
+ movl $0xef2a60, %eax
+ shrl %cl, %eax
+ andl $7, %eax
+ movl 4 +8 +8(%esp), %ecx
+ movl 4 +4(%esp), %edx
+ xorl 4 +8 +4(%esp), %edx
+ testl $0x80000000, %edx
+ jz 1f
+ negl %eax
+1: movl %eax, (%ecx)
+
+ ret
+#endif
libc/mingw/math/x86/remquof.S
@@ -0,0 +1,76 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "remquof.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(remquof)
+__MINGW_USYMBOL(remquof):
+#ifdef __x86_64__
+ movss %xmm1,-12(%rsp)
+ flds -12(%rsp)
+ movss %xmm0,-12(%rsp)
+ flds -12(%rsp)
+1: fprem1
+ fstsw %ax
+ sahf
+ jp 1b
+ fstp %st(1)
+ movl %eax, %ecx
+ shrl $8, %eax
+ shrl $12, %ecx
+ andl $4, %ecx
+ andl $3, %eax
+ orl %eax, %ecx
+ movl $0xef2a60, %eax
+ leal (%ecx,%ecx,2),%ecx
+ shrl %cl, %eax
+ andl $7, %eax
+ movss %xmm0,-12(%rsp)
+ movl -12(%rsp), %edx
+ movss %xmm1,-12(%rsp)
+ xorl -12(%rsp), %edx
+ testl $0x80000000, %edx
+ jz 1f
+ negl %eax
+1: movl %eax, (%r8)
+
+ fstps -12(%rsp)
+ movss -12(%rsp),%xmm0
+ ret
+#else
+ flds 4 +4(%esp)
+ flds 4(%esp)
+1: fprem1
+ fstsw %ax
+ sahf
+ jp 1b
+ fstp %st(1)
+ movl %eax, %ecx
+ shrl $8, %eax
+ shrl $12, %ecx
+ andl $4, %ecx
+ andl $3, %eax
+ orl %eax, %ecx
+ movl $0xef2a60, %eax
+ leal (%ecx,%ecx,2),%ecx
+ shrl %cl, %eax
+ andl $7, %eax
+ movl 4 +4 +4(%esp), %ecx
+ movl 4(%esp), %edx
+ xorl 4 +4(%esp), %edx
+ testl $0x80000000, %edx
+ jz 1f
+ negl %eax
+1: movl %eax, (%ecx)
+
+ ret
+#endif
libc/mingw/math/x86/remquol.S
@@ -0,0 +1,75 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "remquol.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(remquol)
+__MINGW_USYMBOL(remquol):
+#ifdef __x86_64__
+ pushq %rcx
+ fldt (%r8)
+ fldt (%rdx)
+1: fprem1
+ fstsw %ax
+ sahf
+ jp 1b
+ fstp %st(1)
+ movl %eax, %ecx
+ shrl $8, %eax
+ shrl $12, %ecx
+ andl $4, %ecx
+ andl $3, %eax
+ orl %eax, %ecx
+ movl $0xef2a60, %eax
+ leal (%ecx,%ecx,2),%ecx
+ shrl %cl, %eax
+ andl $7, %eax
+ movl 8(%rdx), %edx
+ xorl 8(%r8), %edx
+ testl $0x8000, %edx
+ jz 1f
+ negl %eax
+1: movl %eax, (%r9)
+
+ popq %rcx
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+#else
+ fldt 4 +12(%esp)
+ fldt 4(%esp)
+1: fprem1
+ fstsw %ax
+ sahf
+ jp 1b
+ fstp %st(1)
+ movl %eax, %ecx
+ shrl $8, %eax
+ shrl $12, %ecx
+ andl $4, %ecx
+ andl $3, %eax
+ orl %eax, %ecx
+ movl $0xef2a60, %eax
+ leal (%ecx,%ecx,2),%ecx
+ shrl %cl, %eax
+ andl $7, %eax
+ movl 4 +12 +12(%esp), %ecx
+ movl 4 +8(%esp), %edx
+ xorl 4 +12 +8(%esp), %edx
+ testl $0x8000, %edx
+ jz 1f
+ negl %eax
+1: movl %eax, (%ecx)
+
+ ret
+#endif
libc/mingw/math/x86/scalbn.S
@@ -0,0 +1,41 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "scalbn.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(scalbn)
+ .def __MINGW_USYMBOL(scalbn); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(scalbn):
+#ifdef __x86_64__
+ subq $24, %rsp
+ movq %rdx,(%rsp)
+ fildl (%rsp)
+ movsd %xmm0,(%rsp)
+ fldl (%rsp)
+ fscale
+ fstp %st(1)
+ fstpl (%rsp)
+ movsd (%rsp),%xmm0
+ addq $24, %rsp
+ ret
+
+#else
+ fildl 12(%esp)
+ fldl 4(%esp)
+ fscale
+ fstp %st(1)
+ ret
+#endif
+
+.globl __MINGW_USYMBOL(scalbln)
+ .set __MINGW_USYMBOL(scalbln),__MINGW_USYMBOL(scalbn)
+
libc/mingw/math/x86/scalbnf.S
@@ -0,0 +1,40 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "scalbnf.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(scalbnf)
+ .def __MINGW_USYMBOL(scalbnf); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(scalbnf):
+#ifdef __x86_64__
+ subq $24, %rsp
+ movq %rdx,(%rsp)
+ fildl (%rsp)
+ movss %xmm0,(%rsp)
+ flds (%rsp)
+ fscale
+ fstp %st(1)
+ fstps (%rsp)
+ movss (%rsp),%xmm0
+ addq $24, %rsp
+ ret
+#else
+ fildl 8(%esp)
+ flds 4(%esp)
+ fscale
+ fstp %st(1)
+ ret
+#endif
+
+.globl __MINGW_USYMBOL(scalblnf)
+ .set __MINGW_USYMBOL(scalblnf),__MINGW_USYMBOL(scalbnf)
+
libc/mingw/math/x86/scalbnl.S
@@ -0,0 +1,41 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "scalbnl.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(scalbnl)
+ .def __MINGW_USYMBOL(scalbnl); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(scalbnl):
+#ifdef __x86_64__
+ subq $24, %rsp
+ andl $-1, %r8d
+ movq %r8, (%rsp)
+ fildl (%rsp)
+ fldt (%rdx)
+ fscale
+ fstp %st(1)
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ addq $24, %rsp
+ ret
+#else
+ fildl 16(%esp)
+ fldt 4(%esp)
+ fscale
+ fstp %st(1)
+ ret
+#endif
+
+.globl __MINGW_USYMBOL(scalblnl)
+ .set __MINGW_USYMBOL(scalblnl),__MINGW_USYMBOL(scalbnl)
+
libc/mingw/math/x86/sin.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_DOUBLE 1
+#include "sin.def.h"
libc/mingw/math/x86/sin.def.h
@@ -0,0 +1,65 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 "../complex/complex_internal.h"
+#include <errno.h>
+
+extern long double __sinl_internal (long double);
+
+__FLT_TYPE
+__FLT_ABI(sin) (__FLT_TYPE x)
+{
+ int x_class = fpclassify (x);
+ if (x_class == FP_NAN)
+ {
+ __FLT_RPT_DOMAIN ("sin", x, 0.0, x);
+ return x;
+ }
+ else if (x_class == FP_INFINITE)
+ {
+ __FLT_RPT_DOMAIN ("sin", x, 0.0, __FLT_NAN);
+ return __FLT_NAN;
+ }
+ return (__FLT_TYPE) __sinl_internal ((long double) x);
+}
libc/mingw/math/x86/sinf.c
@@ -0,0 +1,11 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+float sinf(float _X)
+{
+ return ((float) sin ((double) _X));
+}
libc/mingw/math/x86/sinl.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "sin.def.h"
libc/mingw/math/x86/sinl_internal.S
@@ -0,0 +1,58 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "sinl_internal.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(__sinl_internal)
+ .def __MINGW_USYMBOL(__sinl_internal); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(__sinl_internal):
+#ifdef __x86_64__
+ fldt (%rdx)
+ fsin
+ fnstsw %ax
+ testl $0x400,%eax
+ jnz 1f
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+1: fldpi
+ fadd %st(0)
+ fxch %st(1)
+2: fprem1
+ fnstsw %ax
+ testl $0x400,%eax
+ jnz 2b
+ fstp %st(1)
+ fsin
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+#else
+ fldt 4(%esp)
+ fsin
+ fnstsw %ax
+ testl $0x400,%eax
+ jnz 1f
+ ret
+1: fldpi
+ fadd %st(0)
+ fxch %st(1)
+2: fprem1
+ fnstsw %ax
+ testl $0x400,%eax
+ jnz 2b
+ fstp %st(1)
+ fsin
+ ret
+#endif
libc/mingw/math/x86/tanf.c
@@ -0,0 +1,11 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+float tanf(float _X)
+{
+ return ((float)tan((double)_X));
+}
libc/mingw/math/x86/tanl.S
@@ -0,0 +1,62 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "tanl.S"
+ .text
+#ifdef __x86_64__
+ .align 8
+#else
+ .align 4
+#endif
+.globl __MINGW_USYMBOL(tanl)
+ .def __MINGW_USYMBOL(tanl); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(tanl):
+#ifdef __x86_64__
+ fldt (%rdx)
+ fptan
+ fnstsw %ax
+ testl $0x400,%eax
+ jnz 1f
+ fstp %st(0)
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+1: fldpi
+ fadd %st(0)
+ fxch %st(1)
+2: fprem1
+ fstsw %ax
+ testl $0x400,%eax
+ jnz 2b
+ fstp %st(1)
+ fptan
+ fstp %st(0)
+ movq %rcx,%rax
+ movq $0,8(%rcx)
+ fstpt (%rcx)
+ ret
+#else
+ fldt 4(%esp)
+ fptan
+ fnstsw %ax
+ testl $0x400,%eax
+ jnz 1f
+ fstp %st(0)
+ ret
+1: fldpi
+ fadd %st(0)
+ fxch %st(1)
+2: fprem1
+ fstsw %ax
+ testl $0x400,%eax
+ jnz 2b
+ fstp %st(1)
+ fptan
+ fstp %st(0)
+ ret
+#endif
libc/mingw/math/x86/trunc.S
@@ -0,0 +1,91 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "trunc.S"
+ .text
+ .p2align 4,,15
+ .globl __MINGW_USYMBOL(trunc)
+ .def __MINGW_USYMBOL(trunc); .scl 2; .type 32; .endef
+
+#ifdef __x86_64__
+ .seh_proc __MINGW_USYMBOL(trunc)
+#endif
+__MINGW_USYMBOL(trunc):
+#if defined(_AMD64_) || defined(__x86_64__)
+ subq $24, %rsp
+ .seh_stackalloc 24
+ .seh_endprologue
+ movsd %xmm0, 8(%rsp)
+ movq 8(%rsp), %r8
+ movq %r8, %rdx
+ shrq $32, %rdx
+ movl %edx, %eax
+ sarl $20, %eax
+ andl $2047, %eax
+ leal -1023(%rax), %ecx
+ cmpl $19, %ecx
+ jg .l1
+ movl %edx, %r8d
+ andl $-2147483648, %r8d
+ testl %ecx, %ecx
+ js .l3
+ movl $1048575, %eax
+ sarl %cl, %eax
+ notl %eax
+ andl %edx, %eax
+ orl %r8d, %eax
+ salq $32, %rax
+ movq %rax, 8(%rsp)
+ movsd 8(%rsp), %xmm0
+ addq $24, %rsp
+ ret
+ .p2align 4,,10
+.l1:
+ cmpl $51, %ecx
+ jle .l2
+ /* Is x inf/nan? */
+ cmpl $1024, %ecx
+ jne .noinfnan
+ addsd %xmm0, %xmm0
+.noinfnan:
+ addq $24, %rsp
+ ret
+ .p2align 4,,10
+.l2:
+ leal -1043(%rax), %ecx
+ movl $-1, %r9d
+ salq $32, %rdx
+ shrl %cl, %r9d
+ notl %r9d
+ andl %r9d, %r8d
+ orq %r8, %rdx
+ movq %rdx, 8(%rsp)
+ movsd 8(%rsp), %xmm0
+ addq $24, %rsp
+ ret
+ .p2align 4,,10
+.l3:
+ salq $32, %r8
+ movq %r8, 8(%rsp)
+ movsd 8(%rsp), %xmm0
+ addq $24, %rsp
+ ret
+ .seh_endproc
+#elif defined(_X86_) || defined(__i386__)
+ fldl 4(%esp)
+ subl $8, %esp
+ fstcw (%esp)
+ /* FE_TOWARDZERO */
+ movzwl (%esp), %eax
+ orb $0xc, %ah
+ movw %ax, 4(%esp)
+ fldcw 4(%esp)
+ frndint
+ fldcw (%esp)
+ addl $8, %esp
+ ret
+#endif
libc/mingw/math/x86/truncf.S
@@ -0,0 +1,71 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "truncf.S"
+ .text
+ .p2align 4,,15
+ .globl __MINGW_USYMBOL(truncf)
+ .def __MINGW_USYMBOL(truncf); .scl 2; .type 32; .endef
+
+#ifdef __x86_64__
+ .seh_proc __MINGW_USYMBOL(truncf)
+#endif
+__MINGW_USYMBOL(truncf):
+#if defined(_AMD64_) || defined(__x86_64__)
+ subq $24, %rsp
+ .seh_stackalloc 24
+ .seh_endprologue
+ movd %xmm0, 12(%rsp)
+ movl 12(%rsp), %edx
+ movl %edx, %ecx
+ sarl $23, %ecx
+ andl $255, %ecx
+ subl $127, %ecx
+ cmpl $22, %ecx
+ jg .l1
+ movl %edx, %r8d
+ andl $-2147483648, %r8d
+ testl %ecx, %ecx
+ js .l2
+ movl $8388607, %eax
+ sarl %cl, %eax
+ notl %eax
+ andl %edx, %eax
+ orl %r8d, %eax
+ movl %eax, 8(%rsp)
+ movss 8(%rsp), %xmm0
+ addq $24, %rsp
+ ret
+ .p2align 4,,10
+.l1:
+ addl $-128, %ecx
+ jne .noinfnan
+ addss %xmm0, %xmm0
+.noinfnan:
+ addq $24, %rsp
+ ret
+ .p2align 4,,10
+.l2:
+ movl %r8d, 8(%rsp)
+ movss 8(%rsp), %xmm0
+ addq $24, %rsp
+ ret
+ .seh_endproc
+#elif defined(_X86_) || defined(__i386__)
+ flds 4(%esp)
+ subl $8, %esp
+ fstcw (%esp)
+ /* FE_TOWARDZERO */
+ movzwl (%esp), %eax
+ orb $0xc, %ah
+ movw %ax, 4(%esp)
+ fldcw 4(%esp)
+ frndint
+ fldcw (%esp)
+ addl $8, %esp
+ ret
+#endif
libc/mingw/math/abs64.c
@@ -0,0 +1,6 @@
+#include <intrin.h>
+#include <stdlib.h>
+
+__MINGW_EXTENSION __int64 __cdecl _abs64(__int64 x) {
+ return llabs(x);
+}
libc/mingw/math/cbrt.c
@@ -0,0 +1,104 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include "cephes_mconf.h"
+
+static const double CBRT2 = 1.2599210498948731647672;
+static const double CBRT4 = 1.5874010519681994747517;
+static const double CBRT2I = 0.79370052598409973737585;
+static const double CBRT4I = 0.62996052494743658238361;
+
+#ifndef __MINGW32__
+extern double frexp ( double, int * );
+extern double ldexp ( double, int );
+extern int isnan ( double );
+extern int isfinite ( double );
+#endif
+
+double cbrt(double x)
+{
+ int e, rem, sign;
+ double z;
+
+#ifdef __MINGW32__
+ if (!isfinite (x) || x == 0)
+ return x;
+#else
+#ifdef NANS
+ if (isnan(x))
+ return x;
+#endif
+#ifdef INFINITIES
+ if (!isfinite(x))
+ return x;
+#endif
+ if (x == 0)
+ return (x);
+#endif /* __MINGW32__ */
+
+ if (x > 0)
+ sign = 1;
+ else
+ {
+ sign = -1;
+ x = -x;
+ }
+
+ z = x;
+ /* extract power of 2, leaving
+ * mantissa between 0.5 and 1
+ */
+ x = frexp(x, &e);
+
+ /* Approximate cube root of number between .5 and 1,
+ * peak relative error = 9.2e-6
+ */
+ x = (((-1.3466110473359520655053e-1 * x
+ + 5.4664601366395524503440e-1) * x
+ - 9.5438224771509446525043e-1) * x
+ + 1.1399983354717293273738e0 ) * x
+ + 4.0238979564544752126924e-1;
+
+ /* exponent divided by 3 */
+ if (e >= 0)
+ {
+ rem = e;
+ e /= 3;
+ rem -= 3*e;
+ if (rem == 1)
+ x *= CBRT2;
+ else if (rem == 2)
+ x *= CBRT4;
+ }
+ /* argument less than 1 */
+ else
+ {
+ e = -e;
+ rem = e;
+ e /= 3;
+ rem -= 3*e;
+ if (rem == 1)
+ x *= CBRT2I;
+ else if (rem == 2)
+ x *= CBRT4I;
+ e = -e;
+ }
+
+ /* multiply by power of 2 */
+ x = ldexp(x, e);
+
+ /* Newton iteration */
+ x -= ( x - (z/(x*x)) )*0.33333333333333333333;
+#ifdef DEC
+ x -= ( x - (z/(x*x)) )/3.0;
+#else
+ x -= ( x - (z/(x*x)) )*0.33333333333333333333;
+#endif
+
+ if (sign < 0)
+ x = -x;
+ return (x);
+}
libc/mingw/math/cbrtf.c
@@ -0,0 +1,75 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include "cephes_mconf.h"
+
+static const float CBRT2 = 1.25992104989487316477;
+static const float CBRT4 = 1.58740105196819947475;
+
+float cbrtf (float x)
+{
+ int e, rem, sign;
+ float z;
+ if (!isfinite (x) || x == 0.0F)
+ return x;
+ if (x > 0)
+ sign = 1;
+ else
+ {
+ sign = -1;
+ x = -x;
+ }
+
+ z = x;
+ /* extract power of 2, leaving
+ * mantissa between 0.5 and 1
+ */
+ x = frexpf(x, &e);
+
+ /* Approximate cube root of number between .5 and 1,
+ * peak relative error = 9.2e-6
+ */
+ x = (((-0.13466110473359520655053 * x
+ + 0.54664601366395524503440 ) * x
+ - 0.95438224771509446525043 ) * x
+ + 1.1399983354717293273738 ) * x
+ + 0.40238979564544752126924;
+
+ /* exponent divided by 3 */
+ if (e >= 0)
+ {
+ rem = e;
+ e /= 3;
+ rem -= 3*e;
+ if (rem == 1)
+ x *= CBRT2;
+ else if (rem == 2)
+ x *= CBRT4;
+ }
+/* argument less than 1 */
+ else
+ {
+ e = -e;
+ rem = e;
+ e /= 3;
+ rem -= 3*e;
+ if (rem == 1)
+ x /= CBRT2;
+ else if (rem == 2)
+ x /= CBRT4;
+ e = -e;
+ }
+
+ /* multiply by power of 2 */
+ x = ldexpf(x, e);
+
+ /* Newton iteration */
+ x -= ( x - (z/(x*x)) ) * 0.333333333333;
+
+ if (sign < 0)
+ x = -x;
+ return (x);
+}
libc/mingw/math/cbrtl.c
@@ -0,0 +1,82 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "cephes_mconf.h"
+
+static const long double CBRT2 = 1.2599210498948731647672L;
+static const long double CBRT4 = 1.5874010519681994747517L;
+static const long double CBRT2I = 0.79370052598409973737585L;
+static const long double CBRT4I = 0.62996052494743658238361L;
+
+extern long double ldexpl(long double,int);
+
+long double cbrtl(long double x)
+{
+ int e, rem, sign;
+ long double z;
+
+ if (!isfinite (x) || x == 0.0L)
+ return (x);
+
+ if (x > 0)
+ sign = 1;
+ else
+ {
+ sign = -1;
+ x = -x;
+ }
+
+ z = x;
+ /* extract power of 2, leaving
+ * mantissa between 0.5 and 1
+ */
+ x = frexpl(x, &e);
+
+ /* Approximate cube root of number between .5 and 1,
+ * peak relative error = 1.2e-6
+ */
+ x = (((( 1.3584464340920900529734e-1L * x
+ - 6.3986917220457538402318e-1L) * x
+ + 1.2875551670318751538055e0L) * x
+ - 1.4897083391357284957891e0L) * x
+ + 1.3304961236013647092521e0L) * x
+ + 3.7568280825958912391243e-1L;
+
+ /* exponent divided by 3 */
+ if (e >= 0)
+ {
+ rem = e;
+ e /= 3;
+ rem -= 3*e;
+ if (rem == 1)
+ x *= CBRT2;
+ else if (rem == 2)
+ x *= CBRT4;
+ }
+ else
+ { /* argument less than 1 */
+ e = -e;
+ rem = e;
+ e /= 3;
+ rem -= 3*e;
+ if (rem == 1)
+ x *= CBRT2I;
+ else if (rem == 2)
+ x *= CBRT4I;
+ e = -e;
+ }
+
+ /* multiply by power of 2 */
+ x = ldexpl(x, e);
+
+ /* Newton iteration */
+
+ x -= ( x - (z/(x*x)) )*0.3333333333333333333333L;
+ x -= ( x - (z/(x*x)) )*0.3333333333333333333333L;
+
+ if (sign < 0)
+ x = -x;
+ return (x);
+}
libc/mingw/math/cephes_emath.c
@@ -0,0 +1,1283 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "cephes_emath.h"
+
+/*
+ * The constants are for 64 bit precision.
+ */
+
+
+/* Move in external format number,
+ * converting it to internal format.
+ */
+void __emovi(const short unsigned int * __restrict__ a,
+ short unsigned int * __restrict__ b)
+{
+ register const unsigned short *p;
+ register unsigned short *q;
+ int i;
+
+ q = b;
+ p = a + (NE-1); /* point to last word of external number */
+ /* get the sign bit */
+ if (*p & 0x8000)
+ *q++ = 0xffff;
+ else
+ *q++ = 0;
+ /* get the exponent */
+ *q = *p--;
+ *q++ &= 0x7fff; /* delete the sign bit */
+#ifdef INFINITY
+ if ((*(q - 1) & 0x7fff) == 0x7fff)
+ {
+#ifdef NANS
+ if (__eisnan(a))
+ {
+ *q++ = 0;
+ for (i = 3; i < NI; i++ )
+ *q++ = *p--;
+ return;
+ }
+#endif
+ for (i = 2; i < NI; i++)
+ *q++ = 0;
+ return;
+ }
+#endif
+ /* clear high guard word */
+ *q++ = 0;
+ /* move in the significand */
+ for (i = 0; i < NE - 1; i++ )
+ *q++ = *p--;
+ /* clear low guard word */
+ *q = 0;
+}
+
+
+/*
+; Add significands
+; x + y replaces y
+*/
+
+void __eaddm(const short unsigned int * __restrict__ x,
+ short unsigned int * __restrict__ y)
+{
+ register unsigned long a;
+ int i;
+ unsigned int carry;
+
+ x += NI - 1;
+ y += NI - 1;
+ carry = 0;
+ for (i = M; i < NI; i++)
+ {
+ a = (unsigned long)(*x) + (unsigned long)(*y) + carry;
+ if (a & 0x10000)
+ carry = 1;
+ else
+ carry = 0;
+ *y = (unsigned short)a;
+ --x;
+ --y;
+ }
+}
+
+/*
+; Subtract significands
+; y - x replaces y
+*/
+
+void __esubm(const short unsigned int * __restrict__ x,
+ short unsigned int * __restrict__ y)
+{
+ unsigned long a;
+ int i;
+ unsigned int carry;
+
+ x += NI - 1;
+ y += NI - 1;
+ carry = 0;
+ for (i = M; i < NI; i++)
+ {
+ a = (unsigned long)(*y) - (unsigned long)(*x) - carry;
+ if (a & 0x10000)
+ carry = 1;
+ else
+ carry = 0;
+ *y = (unsigned short)a;
+ --x;
+ --y;
+ }
+}
+
+
+/* Multiply significand of e-type number b
+by 16-bit quantity a, e-type result to c. */
+
+static void __m16m(short unsigned int a,
+ short unsigned int * __restrict__ b,
+ short unsigned int * __restrict__ c)
+{
+ register unsigned short *pp;
+ register unsigned long carry;
+ unsigned short *ps;
+ unsigned short p[NI];
+ unsigned long aa, m;
+ int i;
+
+ aa = a;
+ pp = &p[NI - 2];
+ *pp++ = 0;
+ *pp = 0;
+ ps = &b[NI - 1];
+
+ for(i = M + 1; i < NI; i++)
+ {
+ if (*ps == 0)
+ {
+ --ps;
+ --pp;
+ *(pp - 1) = 0;
+ }
+ else
+ {
+ m = (unsigned long) aa * *ps--;
+ carry = (m & 0xffff) + *pp;
+ *pp-- = (unsigned short)carry;
+ carry = (carry >> 16) + (m >> 16) + *pp;
+ *pp = (unsigned short)carry;
+ *(pp - 1) = carry >> 16;
+ }
+ }
+ for (i = M; i < NI; i++)
+ c[i] = p[i];
+}
+
+
+/* Divide significands. Neither the numerator nor the denominator
+is permitted to have its high guard word nonzero. */
+
+int __edivm(short unsigned int * __restrict__ den,
+ short unsigned int * __restrict__ num)
+{
+ int i;
+ register unsigned short *p;
+ unsigned long tnum;
+ unsigned short j, tdenm, tquot;
+ unsigned short tprod[NI + 1];
+ unsigned short equot[NI];
+
+ p = &equot[0];
+ *p++ = num[0];
+ *p++ = num[1];
+
+ for (i = M; i < NI; i++)
+ {
+ *p++ = 0;
+ }
+ __eshdn1(num);
+ tdenm = den[M + 1];
+ for (i = M; i < NI; i++)
+ {
+ /* Find trial quotient digit (the radix is 65536). */
+ tnum = (((unsigned long) num[M]) << 16) + num[M + 1];
+
+ /* Do not execute the divide instruction if it will overflow. */
+ if ((tdenm * 0xffffUL) < tnum)
+ tquot = 0xffff;
+ else
+ tquot = tnum / tdenm;
+
+ /* Prove that the divide worked. */
+ /*
+ tcheck = (unsigned long)tquot * tdenm;
+ if (tnum - tcheck > tdenm)
+ tquot = 0xffff;
+ */
+ /* Multiply denominator by trial quotient digit. */
+ __m16m(tquot, den, tprod);
+ /* The quotient digit may have been overestimated. */
+ if (__ecmpm(tprod, num) > 0)
+ {
+ tquot -= 1;
+ __esubm(den, tprod);
+ if(__ecmpm(tprod, num) > 0)
+ {
+ tquot -= 1;
+ __esubm(den, tprod);
+ }
+ }
+ __esubm(tprod, num);
+ equot[i] = tquot;
+ __eshup6(num);
+ }
+ /* test for nonzero remainder after roundoff bit */
+ p = &num[M];
+ j = 0;
+ for (i = M; i < NI; i++)
+ {
+ j |= *p++;
+ }
+ if (j)
+ j = 1;
+
+ for (i = 0; i < NI; i++)
+ num[i] = equot[i];
+
+ return ( (int)j );
+}
+
+
+/* Multiply significands */
+int __emulm(const short unsigned int * __restrict__ a,
+ short unsigned int * __restrict__ b)
+{
+ const unsigned short *p;
+ unsigned short *q;
+ unsigned short pprod[NI];
+ unsigned short equot[NI];
+ unsigned short j;
+ int i;
+
+ equot[0] = b[0];
+ equot[1] = b[1];
+ for (i = M; i < NI; i++)
+ equot[i] = 0;
+
+ j = 0;
+ p = &a[NI - 1];
+ q = &equot[NI - 1];
+ for (i = M + 1; i < NI; i++)
+ {
+ if (*p == 0)
+ {
+ --p;
+ }
+ else
+ {
+ __m16m(*p--, b, pprod);
+ __eaddm(pprod, equot);
+ }
+ j |= *q;
+ __eshdn6(equot);
+ }
+
+ for (i = 0; i < NI; i++)
+ b[i] = equot[i];
+
+ /* return flag for lost nonzero bits */
+ return ( (int)j );
+}
+
+
+/*
+ * Normalize and round off.
+ *
+ * The internal format number to be rounded is "s".
+ * Input "lost" indicates whether the number is exact.
+ * This is the so-called sticky bit.
+ *
+ * Input "subflg" indicates whether the number was obtained
+ * by a subtraction operation. In that case if lost is nonzero
+ * then the number is slightly smaller than indicated.
+ *
+ * Input "expo" is the biased exponent, which may be negative.
+ * the exponent field of "s" is ignored but is replaced by
+ * "expo" as adjusted by normalization and rounding.
+ *
+ * Input "rcntrl" is the rounding control.
+ *
+ * Input "rnprc" is precison control (64 or NBITS).
+ */
+
+void __emdnorm(short unsigned int *s, int lost, int subflg, int expo, int rcntrl, int rndprc)
+{
+ int i, j;
+ unsigned short r;
+ int rw = NI-1; /* low guard word */
+ int re = NI-2;
+ const unsigned short rmsk = 0xffff;
+ const unsigned short rmbit = 0x8000;
+#if NE == 6
+ unsigned short rbit[NI] = {0,0,0,0,0,0,0,1,0};
+#else
+ unsigned short rbit[NI] = {0,0,0,0,0,0,0,0,0,0,0,1,0};
+#endif
+
+ /* Normalize */
+ j = __enormlz(s);
+
+ /* a blank significand could mean either zero or infinity. */
+#ifndef INFINITY
+ if (j > NBITS)
+ {
+ __ecleazs(s);
+ return;
+ }
+#endif
+ expo -= j;
+#ifndef INFINITY
+ if (expo >= 32767L)
+ goto overf;
+#else
+ if ((j > NBITS) && (expo < 32767L))
+ {
+ __ecleazs(s);
+ return;
+ }
+#endif
+ if (expo < 0L)
+ {
+ if (expo > (long)(-NBITS - 1))
+ {
+ j = (int)expo;
+ i = __eshift(s, j);
+ if (i)
+ lost = 1;
+ }
+ else
+ {
+ __ecleazs(s);
+ return;
+ }
+ }
+ /* Round off, unless told not to by rcntrl. */
+ if (rcntrl == 0)
+ goto mdfin;
+ if (rndprc == 64)
+ {
+ rw = 7;
+ re = 6;
+ rbit[NI - 2] = 0;
+ rbit[6] = 1;
+ }
+
+ /* Shift down 1 temporarily if the data structure has an implied
+ * most significant bit and the number is denormal.
+ * For rndprc = 64 or NBITS, there is no implied bit.
+ * But Intel long double denormals lose one bit of significance even so.
+ */
+#if IBMPC
+ if ((expo <= 0) && (rndprc != NBITS))
+#else
+ if ((expo <= 0) && (rndprc != 64) && (rndprc != NBITS))
+#endif
+ {
+ lost |= s[NI - 1] & 1;
+ __eshdn1(s);
+ }
+ /* Clear out all bits below the rounding bit,
+ * remembering in r if any were nonzero.
+ */
+ r = s[rw] & rmsk;
+ if (rndprc < NBITS)
+ {
+ i = rw + 1;
+ while (i < NI)
+ {
+ if( s[i] )
+ r |= 1;
+ s[i] = 0;
+ ++i;
+ }
+ }
+ s[rw] &= (rmsk ^ 0xffff);
+ if ((r & rmbit) != 0)
+ {
+ if (r == rmbit)
+ {
+ if (lost == 0)
+ { /* round to even */
+ if ((s[re] & 1) == 0)
+ goto mddone;
+ }
+ else
+ {
+ if (subflg != 0)
+ goto mddone;
+ }
+ }
+ __eaddm(rbit, s);
+ }
+mddone:
+#if IBMPC
+ if ((expo <= 0) && (rndprc != NBITS))
+#else
+ if ((expo <= 0) && (rndprc != 64) && (rndprc != NBITS))
+#endif
+ {
+ __eshup1(s);
+ }
+ if (s[2] != 0)
+ { /* overflow on roundoff */
+ __eshdn1(s);
+ expo += 1;
+ }
+mdfin:
+ s[NI - 1] = 0;
+ if (expo >= 32767L)
+ {
+#ifndef INFINITY
+overf:
+#endif
+#ifdef INFINITY
+ s[1] = 32767;
+ for (i = 2; i < NI - 1; i++ )
+ s[i] = 0;
+#else
+ s[1] = 32766;
+ s[2] = 0;
+ for (i = M + 1; i < NI - 1; i++)
+ s[i] = 0xffff;
+ s[NI - 1] = 0;
+ if ((rndprc < 64) || (rndprc == 113))
+ s[rw] &= (rmsk ^ 0xffff);
+#endif
+ return;
+ }
+ if (expo < 0)
+ s[1] = 0;
+ else
+ s[1] = (unsigned short)expo;
+}
+
+
+/*
+; Multiply.
+;
+; unsigned short a[NE], b[NE], c[NE];
+; emul( a, b, c ); c = b * a
+*/
+void __emul(const short unsigned int *a,
+ const short unsigned int *b,
+ short unsigned int *c)
+{
+ unsigned short ai[NI], bi[NI];
+ int i, j;
+ long lt, lta, ltb;
+
+#ifdef NANS
+ /* NaN times anything is the same NaN. */
+ if (__eisnan(a))
+ {
+ __emov(a, c);
+ return;
+ }
+ if (__eisnan(b))
+ {
+ __emov(b, c);
+ return;
+ }
+ /* Zero times infinity is a NaN. */
+ if ((__eisinf(a) && __eiiszero(b))
+ || (__eisinf(b) && __eiiszero(a)))
+ {
+ mtherr( "emul", DOMAIN);
+ __enan_NBITS(c);
+ return;
+ }
+#endif
+/* Infinity times anything else is infinity. */
+#ifdef INFINITY
+ if (__eisinf(a) || __eisinf(b))
+ {
+ if (__eisneg(a) ^ __eisneg(b))
+ *(c + (NE-1)) = 0x8000;
+ else
+ *(c + (NE-1)) = 0;
+ __einfin(c);
+ return;
+ }
+#endif
+ __emovi(a, ai);
+ __emovi(b, bi);
+ lta = ai[E];
+ ltb = bi[E];
+ if (ai[E] == 0)
+ {
+ for (i = 1; i < NI - 1; i++)
+ {
+ if (ai[i] != 0)
+ {
+ lta -= __enormlz( ai );
+ goto mnzer1;
+ }
+ }
+ __eclear(c);
+ return;
+ }
+mnzer1:
+
+ if (bi[E] == 0)
+ {
+ for (i = 1; i < NI - 1; i++)
+ {
+ if (bi[i] != 0)
+ {
+ ltb -= __enormlz(bi);
+ goto mnzer2;
+ }
+ }
+ __eclear(c);
+ return;
+ }
+mnzer2:
+
+ /* Multiply significands */
+ j = __emulm(ai, bi);
+ /* calculate exponent */
+ lt = lta + ltb - (EXONE - 1);
+ __emdnorm(bi, j, 0, lt, 64, NBITS);
+ /* calculate sign of product */
+ if (ai[0] == bi[0])
+ bi[0] = 0;
+ else
+ bi[0] = 0xffff;
+ __emovo(bi, c);
+}
+
+
+/* move out internal format to ieee long double */
+void __toe64(short unsigned int *a, short unsigned int *b)
+{
+ register unsigned short *p, *q;
+ unsigned short i;
+
+#ifdef NANS
+ if (__eiisnan(a))
+ {
+ __enan_64(b);
+ return;
+ }
+#endif
+#ifdef IBMPC
+ /* Shift Intel denormal significand down 1. */
+ if (a[E] == 0)
+ __eshdn1(a);
+#endif
+ p = a;
+#ifdef MIEEE
+ q = b;
+#else
+ q = b + 4; /* point to output exponent */
+#if 1
+ /* NOTE: if data type is 96 bits wide, clear the last word here. */
+ *(q + 1)= 0;
+#endif
+#endif
+
+ /* combine sign and exponent */
+ i = *p++;
+#ifdef MIEEE
+ if (i)
+ *q++ = *p++ | 0x8000;
+ else
+ *q++ = *p++;
+ *q++ = 0;
+#else
+ if (i)
+ *q-- = *p++ | 0x8000;
+ else
+ *q-- = *p++;
+#endif
+ /* skip over guard word */
+ ++p;
+ /* move the significand */
+#ifdef MIEEE
+ for (i = 0; i < 4; i++)
+ *q++ = *p++;
+#else
+#ifdef INFINITY
+ if (__eiisinf(a))
+ {
+ /* Intel long double infinity. */
+ *q-- = 0x8000;
+ *q-- = 0;
+ *q-- = 0;
+ *q = 0;
+ return;
+ }
+#endif
+ for (i = 0; i < 4; i++)
+ *q-- = *p++;
+#endif
+}
+
+
+/* Compare two e type numbers.
+ *
+ * unsigned short a[NE], b[NE];
+ * ecmp( a, b );
+ *
+ * returns +1 if a > b
+ * 0 if a == b
+ * -1 if a < b
+ * -2 if either a or b is a NaN.
+ */
+int __ecmp(const short unsigned int * __restrict__ a,
+ const short unsigned int * __restrict__ b)
+{
+ unsigned short ai[NI], bi[NI];
+ register unsigned short *p, *q;
+ register int i;
+ int msign;
+
+#ifdef NANS
+ if (__eisnan (a) || __eisnan (b))
+ return (-2);
+#endif
+ __emovi(a, ai);
+ p = ai;
+ __emovi(b, bi);
+ q = bi;
+
+ if (*p != *q)
+ { /* the signs are different */
+ /* -0 equals + 0 */
+ for (i = 1; i < NI - 1; i++)
+ {
+ if (ai[i] != 0)
+ goto nzro;
+ if (bi[i] != 0)
+ goto nzro;
+ }
+ return (0);
+nzro:
+ if (*p == 0)
+ return (1);
+ else
+ return (-1);
+ }
+ /* both are the same sign */
+ if (*p == 0)
+ msign = 1;
+ else
+ msign = -1;
+ i = NI - 1;
+ do
+ {
+ if (*p++ != *q++)
+ {
+ goto diff;
+ }
+ }
+ while (--i > 0);
+
+ return (0); /* equality */
+
+diff:
+ if ( *(--p) > *(--q) )
+ return (msign); /* p is bigger */
+ else
+ return (-msign); /* p is littler */
+}
+
+/*
+; Shift significand
+;
+; Shifts significand area up or down by the number of bits
+; given by the variable sc.
+*/
+int __eshift(short unsigned int *x, int sc)
+{
+ unsigned short lost;
+ unsigned short *p;
+
+ if (sc == 0)
+ return (0);
+
+ lost = 0;
+ p = x + NI - 1;
+
+ if (sc < 0)
+ {
+ sc = -sc;
+ while (sc >= 16)
+ {
+ lost |= *p; /* remember lost bits */
+ __eshdn6(x);
+ sc -= 16;
+ }
+
+ while (sc >= 8)
+ {
+ lost |= *p & 0xff;
+ __eshdn8(x);
+ sc -= 8;
+ }
+
+ while (sc > 0)
+ {
+ lost |= *p & 1;
+ __eshdn1(x);
+ sc -= 1;
+ }
+ }
+ else
+ {
+ while (sc >= 16)
+ {
+ __eshup6(x);
+ sc -= 16;
+ }
+
+ while (sc >= 8)
+ {
+ __eshup8(x);
+ sc -= 8;
+ }
+
+ while (sc > 0)
+ {
+ __eshup1(x);
+ sc -= 1;
+ }
+ }
+ if (lost)
+ lost = 1;
+ return ( (int)lost );
+}
+
+
+/*
+; normalize
+;
+; Shift normalizes the significand area pointed to by argument
+; shift count (up = positive) is returned.
+*/
+int __enormlz(short unsigned int *x)
+{
+ register unsigned short *p;
+ int sc;
+
+ sc = 0;
+ p = &x[M];
+ if (*p != 0)
+ goto normdn;
+ ++p;
+ if (*p & 0x8000)
+ return (0); /* already normalized */
+ while (*p == 0)
+ {
+ __eshup6(x);
+ sc += 16;
+ /* With guard word, there are NBITS+16 bits available.
+ * return true if all are zero.
+ */
+ if (sc > NBITS)
+ return (sc);
+ }
+ /* see if high byte is zero */
+ while ((*p & 0xff00) == 0)
+ {
+ __eshup8(x);
+ sc += 8;
+ }
+ /* now shift 1 bit at a time */
+ while ((*p & 0x8000) == 0)
+ {
+ __eshup1(x);
+ sc += 1;
+ if (sc > (NBITS + 16))
+ {
+ mtherr( "enormlz", UNDERFLOW);
+ return (sc);
+ }
+ }
+ return (sc);
+
+ /* Normalize by shifting down out of the high guard word
+ of the significand */
+normdn:
+ if (*p & 0xff00)
+ {
+ __eshdn8(x);
+ sc -= 8;
+ }
+ while (*p != 0)
+ {
+ __eshdn1(x);
+ sc -= 1;
+
+ if (sc < -NBITS)
+ {
+ mtherr("enormlz", OVERFLOW);
+ return (sc);
+ }
+ }
+ return (sc);
+}
+
+
+/* Move internal format number out,
+ * converting it to external format.
+ */
+void __emovo(const short unsigned int * __restrict__ a,
+ short unsigned int * __restrict__ b)
+{
+ register const unsigned short *p;
+ register unsigned short *q;
+ unsigned short i;
+
+ p = a;
+ q = b + (NE - 1); /* point to output exponent */
+ /* combine sign and exponent */
+ i = *p++;
+ if (i)
+ *q-- = *p++ | 0x8000;
+ else
+ *q-- = *p++;
+#ifdef INFINITY
+ if (*(p - 1) == 0x7fff)
+ {
+#ifdef NANS
+ if (__eiisnan(a))
+ {
+ __enan_NBITS(b);
+ return;
+ }
+#endif
+ __einfin(b);
+ return;
+ }
+#endif
+ /* skip over guard word */
+ ++p;
+ /* move the significand */
+ for (i = 0; i < NE - 1; i++)
+ *q-- = *p++;
+}
+
+
+#if USE_LDTOA
+
+void __eiremain(short unsigned int *den, short unsigned int *num,
+ short unsigned int *equot )
+{
+ long ld, ln;
+ unsigned short j;
+
+ ld = den[E];
+ ld -= __enormlz(den);
+ ln = num[E];
+ ln -= __enormlz(num);
+ __ecleaz(equot);
+ while (ln >= ld)
+ {
+ if(__ecmpm(den,num) <= 0)
+ {
+ __esubm(den, num);
+ j = 1;
+ }
+ else
+ {
+ j = 0;
+ }
+ __eshup1(equot);
+ equot[NI - 1] |= j;
+ __eshup1(num);
+ ln -= 1;
+ }
+ __emdnorm( num, 0, 0, ln, 0, NBITS );
+}
+
+
+void __eadd1(const short unsigned int * __restrict__ a,
+ const short unsigned int * __restrict__ b,
+ short unsigned int * __restrict__ c,
+ int subflg)
+{
+ unsigned short ai[NI], bi[NI], ci[NI];
+ int i, lost, j, k;
+ long lt, lta, ltb;
+
+#ifdef INFINITY
+ if (__eisinf(a))
+ {
+ __emov(a, c);
+ if( subflg )
+ __eneg(c);
+ return;
+ }
+ if (__eisinf(b))
+ {
+ __emov(b, c);
+ return;
+ }
+#endif
+ __emovi(a, ai);
+ __emovi(b, bi);
+ if (sub)
+ ai[0] = ~ai[0];
+
+ /* compare exponents */
+ lta = ai[E];
+ ltb = bi[E];
+ lt = lta - ltb;
+ if (lt > 0L)
+ { /* put the larger number in bi */
+ __emovz(bi, ci);
+ __emovz(ai, bi);
+ __emovz(ci, ai);
+ ltb = bi[E];
+ lt = -lt;
+ }
+ lost = 0;
+ if (lt != 0L)
+ {
+ if (lt < (long)(-NBITS - 1))
+ goto done; /* answer same as larger addend */
+ k = (int)lt;
+ lost = __eshift(ai, k); /* shift the smaller number down */
+ }
+ else
+ {
+ /* exponents were the same, so must compare significands */
+ i = __ecmpm(ai, bi);
+ if (i == 0)
+ { /* the numbers are identical in magnitude */
+ /* if different signs, result is zero */
+ if (ai[0] != bi[0])
+ {
+ __eclear(c);
+ return;
+ }
+ /* if same sign, result is double */
+ /* double denomalized tiny number */
+ if ((bi[E] == 0) && ((bi[3] & 0x8000) == 0))
+ {
+ __eshup1( bi );
+ goto done;
+ }
+ /* add 1 to exponent unless both are zero! */
+ for (j = 1; j < NI - 1; j++)
+ {
+ if (bi[j] != 0)
+ {
+ /* This could overflow, but let emovo take care of that. */
+ ltb += 1;
+ break;
+ }
+ }
+ bi[E] = (unsigned short )ltb;
+ goto done;
+ }
+ if (i > 0)
+ { /* put the larger number in bi */
+ __emovz(bi, ci);
+ __emovz(ai, bi);
+ __emovz(ci, ai);
+ }
+ }
+ if (ai[0] == bi[0])
+ {
+ __eaddm(ai, bi);
+ subflg = 0;
+ }
+ else
+ {
+ __esubm(ai, bi);
+ subflg = 1;
+ }
+ __emdnorm(bi, lost, subflg, ltb, 64, NBITS);
+
+done:
+ __emovo(bi, c);
+}
+
+
+/* y = largest integer not greater than x
+ * (truncated toward minus infinity)
+ *
+ * unsigned short x[NE], y[NE]
+ *
+ * efloor( x, y );
+ */
+
+
+void __efloor(short unsigned int *x, short unsigned int *y)
+{
+ register unsigned short *p;
+ int e, expon, i;
+ unsigned short f[NE];
+ const unsigned short bmask[] = {
+ 0xffff,
+ 0xfffe,
+ 0xfffc,
+ 0xfff8,
+ 0xfff0,
+ 0xffe0,
+ 0xffc0,
+ 0xff80,
+ 0xff00,
+ 0xfe00,
+ 0xfc00,
+ 0xf800,
+ 0xf000,
+ 0xe000,
+ 0xc000,
+ 0x8000,
+ 0x0000,
+ };
+
+ __emov(x, f); /* leave in external format */
+ expon = (int) f[NE - 1];
+ e = (expon & 0x7fff) - (EXONE - 1);
+ if (e <= 0)
+ {
+ __eclear(y);
+ goto isitneg;
+ }
+ /* number of bits to clear out */
+ e = NBITS - e;
+ __emov(f, y);
+ if (e <= 0)
+ return;
+
+ p = &y[0];
+ while (e >= 16)
+ {
+ *p++ = 0;
+ e -= 16;
+ }
+ /* clear the remaining bits */
+ *p &= bmask[e];
+ /* truncate negatives toward minus infinity */
+isitneg:
+
+ if ((unsigned short)expon & (unsigned short)0x8000)
+ {
+ for (i = 0; i < NE - 1; i++)
+ {
+ if (f[i] != y[i])
+ {
+ __esub( __eone, y, y );
+ break;
+ }
+ }
+ }
+}
+
+/*
+; Subtract external format numbers.
+;
+; unsigned short a[NE], b[NE], c[NE];
+; esub( a, b, c ); c = b - a
+*/
+
+void __esub(const short unsigned int * a,
+ const short unsigned int * b,
+ short unsigned int * c)
+{
+#ifdef NANS
+ if (__eisnan(a))
+ {
+ __emov (a, c);
+ return;
+ }
+ if ( __eisnan(b))
+ {
+ __emov(b, c);
+ return;
+ }
+ /* Infinity minus infinity is a NaN.
+ * Test for subtracting infinities of the same sign.
+ */
+ if (__eisinf(a) && __eisinf(b) && ((__eisneg (a) ^ __eisneg (b)) == 0))
+ {
+ mtherr("esub", DOMAIN);
+ __enan_NBITS( c );
+ return;
+ }
+#endif
+ __eadd1(a, b, c, 1);
+}
+
+
+/*
+; Divide.
+;
+; unsigned short a[NI], b[NI], c[NI];
+; ediv( a, b, c ); c = b / a
+*/
+
+void __ediv(const short unsigned int *a,
+ const short unsigned int *b,
+ short unsigned int *c)
+{
+ unsigned short ai[NI], bi[NI];
+ int i;
+ long lt, lta, ltb;
+
+#ifdef NANS
+ /* Return any NaN input. */
+ if (__eisnan(a))
+ {
+ __emov(a, c);
+ return;
+ }
+ if (__eisnan(b))
+ {
+ __emov(b, c);
+ return;
+ }
+ /* Zero over zero, or infinity over infinity, is a NaN. */
+ if ((__eiszero(a) && __eiszero(b))
+ || (__eisinf (a) && __eisinf (b)))
+ {
+ mtherr("ediv", DOMAIN);
+ __enan_NBITS( c );
+ return;
+ }
+#endif
+/* Infinity over anything else is infinity. */
+#ifdef INFINITY
+ if (__eisinf(b))
+ {
+ if (__eisneg(a) ^ __eisneg(b))
+ *(c + (NE - 1)) = 0x8000;
+ else
+ *(c + (NE - 1)) = 0;
+ __einfin(c);
+ return;
+ }
+ if (__eisinf(a))
+ {
+ __eclear(c);
+ return;
+ }
+#endif
+ __emovi(a, ai);
+ __emovi(b, bi);
+ lta = ai[E];
+ ltb = bi[E];
+ if (bi[E] == 0)
+ { /* See if numerator is zero. */
+ for (i = 1; i < NI - 1; i++)
+ {
+ if (bi[i] != 0)
+ {
+ ltb -= __enormlz(bi);
+ goto dnzro1;
+ }
+ }
+ __eclear(c);
+ return;
+ }
+dnzro1:
+
+ if (ai[E] == 0)
+ { /* possible divide by zero */
+ for (i = 1; i < NI - 1; i++)
+ {
+ if (ai[i] != 0)
+ {
+ lta -= __enormlz(ai);
+ goto dnzro2;
+ }
+ }
+ if (ai[0] == bi[0])
+ *(c + (NE - 1)) = 0;
+ else
+ *(c + (NE - 1)) = 0x8000;
+ __einfin(c);
+ mtherr("ediv", SING);
+ return;
+ }
+dnzro2:
+
+ i = __edivm(ai, bi);
+ /* calculate exponent */
+ lt = ltb - lta + EXONE;
+ __emdnorm(bi, i, 0, lt, 64, NBITS);
+ /* set the sign */
+ if (ai[0] == bi[0])
+ bi[0] = 0;
+ else
+ bi[0] = 0Xffff;
+ __emovo(bi, c);
+}
+
+void __e64toe(short unsigned int *pe, short unsigned int *y)
+{
+ unsigned short yy[NI];
+ unsigned short *p, *q, *e;
+ int i;
+
+ e = pe;
+ p = yy;
+ for (i = 0; i < NE - 5; i++)
+ *p++ = 0;
+#ifdef IBMPC
+ for (i = 0; i < 5; i++)
+ *p++ = *e++;
+#endif
+#ifdef DEC
+ for (i = 0; i < 5; i++)
+ *p++ = *e++;
+#endif
+#ifdef MIEEE
+ p = &yy[0] + (NE - 1);
+ *p-- = *e++;
+ ++e;
+ for (i = 0; i < 4; i++)
+ *p-- = *e++;
+#endif
+
+#ifdef IBMPC
+ /* For Intel long double, shift denormal significand up 1
+ -- but only if the top significand bit is zero. */
+ if ((yy[NE - 1] & 0x7fff) == 0 && (yy[NE - 2] & 0x8000) == 0)
+ {
+ unsigned short temp[NI + 1];
+ __emovi(yy, temp);
+ __eshup1(temp);
+ __emovo(temp,y);
+ return;
+ }
+#endif
+#ifdef INFINITY
+ /* Point to the exponent field. */
+ p = &yy[NE - 1];
+ if (*p == 0x7fff)
+ {
+#ifdef NANS
+#ifdef IBMPC
+ for (i = 0; i < 4; i++)
+ {
+ if ((i != 3 && pe[i] != 0)
+ /* Check for Intel long double infinity pattern. */
+ || (i == 3 && pe[i] != 0x8000))
+ {
+ __enan_NBITS(y);
+ return;
+ }
+ }
+#else
+ for (i = 1; i <= 4; i++)
+ {
+ if (pe[i] != 0)
+ {
+ __enan_NBITS(y);
+ return;
+ }
+ }
+#endif
+#endif /* NANS */
+ __eclear(y);
+ __einfin(y);
+ if (*p & 0x8000)
+ __eneg(y);
+ return;
+ }
+#endif
+ p = yy;
+ q = y;
+ for (i = 0; i < NE; i++)
+ *q++ = *p++;
+}
+
+#endif /* USE_LDTOA */
libc/mingw/math/cephes_emath.h
@@ -0,0 +1,719 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#ifndef _CEPHES_EMATH_H
+#define _CEPHES_EMATH_H
+
+/**
+ * This is a workaround for a gcc bug
+ */
+#define __restrict__
+
+/* This file is extracted from S L Moshier's ioldoubl.c,
+ * modified for use in MinGW
+ *
+ * Extended precision arithmetic functions for long double I/O.
+ * This program has been placed in the public domain.
+ */
+
+
+/*
+ * Revision history:
+ *
+ * 5 Jan 84 PDP-11 assembly language version
+ * 6 Dec 86 C language version
+ * 30 Aug 88 100 digit version, improved rounding
+ * 15 May 92 80-bit long double support
+ *
+ * Author: S. L. Moshier.
+ *
+ * 6 Oct 02 Modified for MinGW by inlining utility routines,
+ * removing global variables, and splitting out strtold
+ * from _IO_ldtoa and _IO_ldtostr.
+ *
+ * Danny Smith <dannysmith@users.sourceforge.net>
+ *
+ */
+
+
+/* ieee.c
+ *
+ * Extended precision IEEE binary floating point arithmetic routines
+ *
+ * Numbers are stored in C language as arrays of 16-bit unsigned
+ * short integers. The arguments of the routines are pointers to
+ * the arrays.
+ *
+ *
+ * External e type data structure, simulates Intel 8087 chip
+ * temporary real format but possibly with a larger significand:
+ *
+ * NE-1 significand words (least significant word first,
+ * most significant bit is normally set)
+ * exponent (value = EXONE for 1.0,
+ * top bit is the sign)
+ *
+ *
+ * Internal data structure of a number (a "word" is 16 bits):
+ *
+ * ei[0] sign word (0 for positive, 0xffff for negative)
+ * ei[1] biased __exponent (value = EXONE for the number 1.0)
+ * ei[2] high guard word (always zero after normalization)
+ * ei[3]
+ * to ei[NI-2] significand (NI-4 significand words,
+ * most significant word first,
+ * most significant bit is set)
+ * ei[NI-1] low guard word (0x8000 bit is rounding place)
+ *
+ *
+ *
+ * Routines for external format numbers
+ *
+ * __asctoe64( string, &d ) ASCII string to long double
+ * __asctoeg( string, e, prec ) ASCII string to specified precision
+ * __e64toe( &d, e ) IEEE long double precision to e type
+ * __eadd( a, b, c ) c = b + a
+ * __eclear(e) e = 0
+ * __ecmp (a, b) Returns 1 if a > b, 0 if a == b,
+ * -1 if a < b, -2 if either a or b is a NaN.
+ * __ediv( a, b, c ) c = b / a
+ * __efloor( a, b ) truncate to integer, toward -infinity
+ * __efrexp( a, exp, s ) extract exponent and significand
+ * __eifrac( e, &l, frac ) e to long integer and e type fraction
+ * __euifrac( e, &l, frac ) e to unsigned long integer and e type fraction
+ * __einfin( e ) set e to infinity, leaving its sign alone
+ * __eldexp( a, n, b ) multiply by 2**n
+ * __emov( a, b ) b = a
+ * __emul( a, b, c ) c = b * a
+ * __eneg(e) e = -e
+ * __eround( a, b ) b = nearest integer value to a
+ * __esub( a, b, c ) c = b - a
+ * __e24toasc( &f, str, n ) single to ASCII string, n digits after decimal
+ * __e53toasc( &d, str, n ) double to ASCII string, n digits after decimal
+ * __e64toasc( &d, str, n ) long double to ASCII string
+ * __etoasc( e, str, n ) e to ASCII string, n digits after decimal
+ * __etoe24( e, &f ) convert e type to IEEE single precision
+ * __etoe53( e, &d ) convert e type to IEEE double precision
+ * __etoe64( e, &d ) convert e type to IEEE long double precision
+ * __eisneg( e ) 1 if sign bit of e != 0, else 0
+ * __eisinf( e ) 1 if e has maximum exponent (non-IEEE)
+ * or is infinite (IEEE)
+ * __eisnan( e ) 1 if e is a NaN
+ * __esqrt( a, b ) b = square root of a
+ *
+ *
+ * Routines for internal format numbers
+ *
+ * __eaddm( ai, bi ) add significands, bi = bi + ai
+ * __ecleaz(ei) ei = 0
+ * __ecleazs(ei) set ei = 0 but leave its sign alone
+ * __ecmpm( ai, bi ) compare significands, return 1, 0, or -1
+ * __edivm( ai, bi ) divide significands, bi = bi / ai
+ * __emdnorm(ai,l,s,exp) normalize and round off
+ * __emovi( a, ai ) convert external a to internal ai
+ * __emovo( ai, a ) convert internal ai to external a
+ * __emovz( ai, bi ) bi = ai, low guard word of bi = 0
+ * __emulm( ai, bi ) multiply significands, bi = bi * ai
+ * __enormlz(ei) left-justify the significand
+ * __eshdn1( ai ) shift significand and guards down 1 bit
+ * __eshdn8( ai ) shift down 8 bits
+ * __eshdn6( ai ) shift down 16 bits
+ * __eshift( ai, n ) shift ai n bits up (or down if n < 0)
+ * __eshup1( ai ) shift significand and guards up 1 bit
+ * __eshup8( ai ) shift up 8 bits
+ * __eshup6( ai ) shift up 16 bits
+ * __esubm( ai, bi ) subtract significands, bi = bi - ai
+ *
+ *
+ * The result is always normalized and rounded to NI-4 word precision
+ * after each arithmetic operation.
+ *
+ * Exception flags are NOT fully supported.
+ *
+ * Define INFINITY in mconf.h for support of infinity; otherwise a
+ * saturation arithmetic is implemented.
+ *
+ * Define NANS for support of Not-a-Number items; otherwise the
+ * arithmetic will never produce a NaN output, and might be confused
+ * by a NaN input.
+ * If NaN's are supported, the output of ecmp(a,b) is -2 if
+ * either a or b is a NaN. This means asking if(ecmp(a,b) < 0)
+ * may not be legitimate. Use if(ecmp(a,b) == -1) for less-than
+ * if in doubt.
+ * Signaling NaN's are NOT supported; they are treated the same
+ * as quiet NaN's.
+ *
+ * Denormals are always supported here where appropriate (e.g., not
+ * for conversion to DEC numbers).
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <math.h>
+#include <locale.h>
+#include <ctype.h>
+
+#undef alloca
+#define alloca __builtin_alloca
+
+/* Don't build non-ANSI _IO_ldtoa. It is not thread safe. */
+#ifndef USE_LDTOA
+#define USE_LDTOA 0
+#endif
+
+
+ /* Number of 16 bit words in external x type format */
+#define NE 6
+
+ /* Number of 16 bit words in internal format */
+#define NI (NE+3)
+
+ /* Array offset to exponent */
+#define E 1
+
+ /* Array offset to high guard word */
+#define M 2
+
+ /* Number of bits of precision */
+#define NBITS ((NI-4)*16)
+
+ /* Maximum number of decimal digits in ASCII conversion
+ * = NBITS*log10(2)
+ */
+#define NDEC (NBITS*8/27)
+
+ /* The exponent of 1.0 */
+#define EXONE (0x3fff)
+
+
+#define mtherr(fname, code)
+
+
+extern long double strtold (const char * __restrict__ s, char ** __restrict__ se);
+extern int __asctoe64(const char * __restrict__ ss,
+ short unsigned int * __restrict__ y);
+extern void __emul(const short unsigned int * a,
+ const short unsigned int * b,
+ short unsigned int * c);
+extern int __ecmp(const short unsigned int * __restrict__ a,
+ const short unsigned int * __restrict__ b);
+extern int __enormlz(short unsigned int *x);
+extern int __eshift(short unsigned int *x, int sc);
+extern void __eaddm(const short unsigned int * __restrict__ x,
+ short unsigned int * __restrict__ y);
+extern void __esubm(const short unsigned int * __restrict__ x,
+ short unsigned int * __restrict__ y);
+extern void __emdnorm(short unsigned int *s, int lost, int subflg,
+ int exp, int rcntrl, const int rndprc);
+extern void __toe64(short unsigned int * __restrict__ a,
+ short unsigned int * __restrict__ b);
+extern int __edivm(short unsigned int * __restrict__ den,
+ short unsigned int * __restrict__ num);
+extern int __emulm(const short unsigned int * __restrict__ a,
+ short unsigned int * __restrict__ b);
+extern void __emovi(const short unsigned int * __restrict__ a,
+ short unsigned int * __restrict__ b);
+extern void __emovo(const short unsigned int * __restrict__ a,
+ short unsigned int * __restrict__ b);
+
+#if USE_LDTOA
+
+extern char * _IO_ldtoa(long double, int, int, int *, int *, char **);
+extern void _IO_ldtostr(long double *x, char *string, int ndigs,
+ int flags, char fmt);
+
+extern void __eiremain(short unsigned int * __restrict__ den,
+ short unsigned int *__restrict__ num,
+ short unsigned int *__restrict__ equot);
+extern void __efloor(short unsigned int *x, short unsigned int *y);
+extern void __eadd1(const short unsigned int * __restrict__ a,
+ const short unsigned int * __restrict__ b,
+ short unsigned int * __restrict__ c,
+ int subflg);
+extern void __esub(const short unsigned int *a, const short unsigned int *b,
+ short unsigned int *c);
+extern void __ediv(const short unsigned int *a, const short unsigned int *b,
+ short unsigned int *c);
+extern void __e64toe(short unsigned int *pe, short unsigned int *y);
+
+
+#endif
+
+static __inline__ int __eisneg(const short unsigned int *x);
+static __inline__ int __eisinf(const short unsigned int *x);
+static __inline__ int __eisnan(const short unsigned int *x);
+static __inline__ int __eiszero(const short unsigned int *a);
+static __inline__ void __emovz(register const short unsigned int * __restrict__ a,
+ register short unsigned int * __restrict__ b);
+static __inline__ void __eclear(register short unsigned int *x);
+static __inline__ void __ecleaz(register short unsigned int *xi);
+static __inline__ void __ecleazs(register short unsigned int *xi);
+static __inline__ int __eiisinf(const short unsigned int *x);
+static __inline__ int __eiisnan(const short unsigned int *x);
+static __inline__ int __eiiszero(const short unsigned int *x);
+static __inline__ void __enan_64(short unsigned int *nanptr);
+static __inline__ void __enan_NBITS (short unsigned int *nanptr);
+static __inline__ void __enan_NI16 (short unsigned int *nanptr);
+static __inline__ void __einfin(register short unsigned int *x);
+static __inline__ void __eneg(short unsigned int *x);
+static __inline__ void __eshup1(register short unsigned int *x);
+static __inline__ void __eshup8(register short unsigned int *x);
+static __inline__ void __eshup6(register short unsigned int *x);
+static __inline__ void __eshdn1(register short unsigned int *x);
+static __inline__ void __eshdn8(register short unsigned int *x);
+static __inline__ void __eshdn6(register short unsigned int *x);
+
+
+
+/* Intel IEEE, low order words come first:
+ */
+#define IBMPC 1
+
+/* Define 1 for ANSI C atan2() function
+ * See atan.c and clog.c.
+ */
+#define ANSIC 1
+
+/*define VOLATILE volatile*/
+#define VOLATILE
+
+/* For 12-byte long doubles on an i386, pad a 16-bit short 0
+ * to the end of real constants initialized by integer arrays.
+ *
+ * #define XPD 0,
+ *
+ * Otherwise, the type is 10 bytes long and XPD should be
+ * defined blank.
+ *
+ * #define XPD
+ */
+#define XPD 0,
+/* #define XPD */
+#define NANS 1
+
+/* NaN's require infinity support. */
+#ifdef NANS
+#ifndef INFINITY
+#define INFINITY
+#endif
+#endif
+
+/* This handles 64-bit long ints. */
+#define LONGBITS (8 * sizeof(long))
+
+
+#define NTEN 12
+#define MAXP 4096
+
+/*
+; Clear out entire external format number.
+;
+; unsigned short x[];
+; eclear( x );
+*/
+
+static __inline__ void __eclear(register short unsigned int *x)
+{
+ memset(x, 0, NE * sizeof(unsigned short));
+}
+
+
+/* Move external format number from a to b.
+ *
+ * emov( a, b );
+ */
+
+static __inline__ void __emov(register const short unsigned int * __restrict__ a,
+ register short unsigned int * __restrict__ b)
+{
+ memcpy(b, a, NE * sizeof(unsigned short));
+}
+
+
+/*
+; Negate external format number
+;
+; unsigned short x[NE];
+; eneg( x );
+*/
+
+static __inline__ void __eneg(short unsigned int *x)
+{
+#ifdef NANS
+ if (__eisnan(x))
+ return;
+#endif
+ x[NE-1] ^= 0x8000; /* Toggle the sign bit */
+}
+
+
+/* Return 1 if external format number is negative,
+ * else return zero.
+ */
+static __inline__ int __eisneg(const short unsigned int *x)
+{
+#ifdef NANS
+ if (__eisnan(x))
+ return (0);
+#endif
+ if (x[NE-1] & 0x8000)
+ return (1);
+ else
+ return (0);
+}
+
+
+/* Return 1 if external format number has maximum possible exponent,
+ * else return zero.
+ */
+static __inline__ int __eisinf(const short unsigned int *x)
+{
+ if ((x[NE - 1] & 0x7fff) == 0x7fff)
+ {
+#ifdef NANS
+ if (__eisnan(x))
+ return (0);
+#endif
+ return (1);
+ }
+ else
+ return (0);
+}
+
+/* Check if e-type number is not a number.
+ */
+static __inline__ int __eisnan(const short unsigned int *x)
+{
+#ifdef NANS
+ int i;
+ /* NaN has maximum __exponent */
+ if ((x[NE - 1] & 0x7fff) == 0x7fff)
+ /* ... and non-zero significand field. */
+ for (i = 0; i < NE - 1; i++)
+ {
+ if (*x++ != 0)
+ return (1);
+ }
+#endif
+ return (0);
+}
+
+/*
+; Fill __entire number, including __exponent and significand, with
+; largest possible number. These programs implement a saturation
+; value that is an ordinary, legal number. A special value
+; "infinity" may also be implemented; this would require tests
+; for that value and implementation of special rules for arithmetic
+; operations involving inifinity.
+*/
+
+static __inline__ void __einfin(register short unsigned int *x)
+{
+ register int i;
+#ifdef INFINITY
+ for (i = 0; i < NE - 1; i++)
+ *x++ = 0;
+ *x |= 32767;
+#else
+ for (i = 0; i < NE - 1; i++)
+ *x++ = 0xffff;
+ *x |= 32766;
+ *(x - 5) = 0;
+#endif
+}
+
+/* Clear out internal format number.
+ */
+
+static __inline__ void __ecleaz(register short unsigned int *xi)
+{
+ memset(xi, 0, NI * sizeof(unsigned short));
+}
+
+/* same, but don't touch the sign. */
+
+static __inline__ void __ecleazs(register short unsigned int *xi)
+{
+ ++xi;
+ memset(xi, 0, (NI-1) * sizeof(unsigned short));
+}
+
+/* Move internal format number from a to b.
+ */
+static __inline__ void __emovz(register const short unsigned int * __restrict__ a,
+ register short unsigned int * __restrict__ b)
+{
+ memcpy(b, a, (NI-1) * sizeof(unsigned short));
+ b[NI - 1] = 0;
+}
+
+/* Return nonzero if internal format number is a NaN.
+ */
+
+static __inline__ int __eiisnan (const short unsigned int *x)
+{
+ int i;
+
+ if ((x[E] & 0x7fff) == 0x7fff)
+ {
+ for (i = M + 1; i < NI; i++ )
+ {
+ if (x[i] != 0)
+ return (1);
+ }
+ }
+ return (0);
+}
+
+/* Return nonzero if external format number is zero. */
+
+static __inline__ int
+__eiszero(const short unsigned int * a)
+{
+ union {
+ long double ld;
+ unsigned short sh[8];
+ } av;
+ av.ld = 0.0;
+ memcpy (av.sh, a, 12);
+ if (av.ld == 0.0)
+ return (1);
+ return (0);
+}
+
+/* Return nonzero if internal format number is zero. */
+
+static __inline__ int
+__eiiszero(const short unsigned int * ai)
+{
+ int i;
+ /* skip the sign word */
+ for (i = 1; i < NI - 1; i++ )
+ {
+ if (ai[i] != 0)
+ return (0);
+ }
+ return (1);
+}
+
+
+/* Return nonzero if internal format number is infinite. */
+
+static __inline__ int
+__eiisinf (const unsigned short *x)
+{
+#ifdef NANS
+ if (__eiisnan (x))
+ return (0);
+#endif
+ if ((x[E] & 0x7fff) == 0x7fff)
+ return (1);
+ return (0);
+}
+
+/*
+; Compare significands of numbers in internal format.
+; Guard words are included in the comparison.
+;
+; unsigned short a[NI], b[NI];
+; cmpm( a, b );
+;
+; for the significands:
+; returns +1 if a > b
+; 0 if a == b
+; -1 if a < b
+*/
+static __inline__ int __ecmpm(register const short unsigned int * __restrict__ a,
+ register const short unsigned int * __restrict__ b)
+{
+ int i;
+
+ a += M; /* skip up to significand area */
+ b += M;
+ for (i = M; i < NI; i++)
+ {
+ if( *a++ != *b++ )
+ goto difrnt;
+ }
+ return(0);
+
+ difrnt:
+ if ( *(--a) > *(--b) )
+ return (1);
+ else
+ return (-1);
+}
+
+
+/*
+; Shift significand down by 1 bit
+*/
+
+static __inline__ void __eshdn1(register short unsigned int *x)
+{
+ register unsigned short bits;
+ int i;
+
+ x += M; /* point to significand area */
+
+ bits = 0;
+ for (i = M; i < NI; i++ )
+ {
+ if (*x & 1)
+ bits |= 1;
+ *x >>= 1;
+ if (bits & 2)
+ *x |= 0x8000;
+ bits <<= 1;
+ ++x;
+ }
+}
+
+/*
+; Shift significand up by 1 bit
+*/
+
+static __inline__ void __eshup1(register short unsigned int *x)
+{
+ register unsigned short bits;
+ int i;
+
+ x += NI-1;
+ bits = 0;
+
+ for (i = M; i < NI; i++)
+ {
+ if (*x & 0x8000)
+ bits |= 1;
+ *x <<= 1;
+ if (bits & 2)
+ *x |= 1;
+ bits <<= 1;
+ --x;
+ }
+}
+
+
+/*
+; Shift significand down by 8 bits
+*/
+
+static __inline__ void __eshdn8(register short unsigned int *x)
+{
+ register unsigned short newbyt, oldbyt;
+ int i;
+
+ x += M;
+ oldbyt = 0;
+ for (i = M; i < NI; i++)
+ {
+ newbyt = *x << 8;
+ *x >>= 8;
+ *x |= oldbyt;
+ oldbyt = newbyt;
+ ++x;
+ }
+}
+
+/*
+; Shift significand up by 8 bits
+*/
+
+static __inline__ void __eshup8(register short unsigned int *x)
+{
+ int i;
+ register unsigned short newbyt, oldbyt;
+
+ x += NI - 1;
+ oldbyt = 0;
+
+ for (i = M; i < NI; i++)
+ {
+ newbyt = *x >> 8;
+ *x <<= 8;
+ *x |= oldbyt;
+ oldbyt = newbyt;
+ --x;
+ }
+}
+
+/*
+; Shift significand up by 16 bits
+*/
+
+static __inline__ void __eshup6(register short unsigned int *x)
+{
+ int i;
+ register unsigned short *p;
+
+ p = x + M;
+ x += M + 1;
+
+ for (i = M; i < NI - 1; i++)
+ *p++ = *x++;
+
+ *p = 0;
+}
+
+/*
+; Shift significand down by 16 bits
+*/
+
+static __inline__ void __eshdn6(register short unsigned int *x)
+{
+ int i;
+ register unsigned short *p;
+
+ x += NI - 1;
+ p = x + 1;
+
+ for (i = M; i < NI - 1; i++)
+ *(--p) = *(--x);
+
+ *(--p) = 0;
+}
+
+/*
+; Add significands
+; x + y replaces y
+*/
+
+static __inline__ void __enan_64(unsigned short* nanptr)
+{
+ int i;
+ for (i = 0; i < 3; i++)
+ *nanptr++ = 0;
+ *nanptr++ = 0xc000;
+ *nanptr++ = 0x7fff;
+ *nanptr = 0;
+ return;
+}
+
+static __inline__ void __enan_NBITS(unsigned short* nanptr)
+{
+ int i;
+ for (i = 0; i < NE - 2; i++)
+ *nanptr++ = 0;
+ *nanptr++ = 0xc000;
+ *nanptr = 0x7fff;
+ return;
+}
+
+static __inline__ void __enan_NI16(unsigned short* nanptr)
+{
+ int i;
+ *nanptr++ = 0;
+ *nanptr++ = 0x7fff;
+ *nanptr++ = 0;
+ *nanptr++ = 0xc000;
+ for (i = 4; i < NI; i++)
+ *nanptr++ = 0;
+ return;
+}
+
+#endif /* _CEPHES_EMATH_H */
+
libc/mingw/math/cephes_mconf.h
@@ -0,0 +1,417 @@
+#include <math.h>
+#include <errno.h>
+
+
+#define IBMPC 1
+#define ANSIPROT 1
+#define MINUSZERO 1
+#define INFINITIES 1
+#define NANS 1
+#define DENORMAL 1
+#define VOLATILE
+#define mtherr(fname, code)
+#define XPD 0,
+#ifdef __x86_64__
+#define XPD_SHORT 0, 0,
+#define XPD_LONG 0,
+#else
+#define XPD_SHORT
+#define XPD_LONG
+#endif
+
+#if UNK
+typedef union uLD { long double ld; unsigned short sh[8]; long lo[4]; } uLD;
+typedef union uD { double d; unsigned short sh[4]; } uD;
+#elif IBMPC
+typedef union uLD { unsigned short sh[8]; long double ld; long lo[4]; } uLD;
+typedef union uD { unsigned short sh[4]; double d; } uD;
+#elif MIEEE
+typedef union uLD { long lo[4]; long double ld; unsigned short sh[8]; } uLD;
+typedef union uD { unsigned short sh[4]; double d; } uD;
+#else
+#error Unknown uLD/uD type definition
+#endif
+
+#define _CEPHES_USE_ERRNO
+
+#ifdef _CEPHES_USE_ERRNO
+#define _SET_ERRNO(x) errno = (x)
+#else
+#define _SET_ERRNO(x)
+#endif
+
+/* constants used by cephes functions */
+
+/* double */
+#define MAXNUM 1.7976931348623158E308
+#define MAXLOG 7.09782712893383996843E2
+#define MINLOG -7.08396418532264106224E2
+#define LOGE2 6.93147180559945309417E-1
+#define LOG2E 1.44269504088896340736
+#define PI 3.14159265358979323846
+#define PIO2 1.57079632679489661923
+#define PIO4 7.85398163397448309616E-1
+
+#define NEGZERO (-0.0)
+#undef NAN
+#undef INFINITY
+#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2))
+#define INFINITY __builtin_huge_val()
+#define NAN __builtin_nan("")
+#else
+extern double __INF;
+#define INFINITY (__INF)
+extern double __QNAN;
+#define NAN (__QNAN)
+#endif
+
+/*long double*/
+#if defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
+#define MAXNUML 1.7976931348623158E308
+#define MAXLOGL 7.09782712893383996843E2
+#define MINLOGL -7.08396418532264106224E2
+#define LOGE2L 6.93147180559945309417E-1
+#define LOG2EL 1.44269504088896340736
+#define PIL 3.14159265358979323846
+#define PIO2L 1.57079632679489661923
+#define PIO4L 7.85398163397448309616E-1
+#else
+#define MAXNUML 1.189731495357231765021263853E4932L
+#define MAXLOGL 1.1356523406294143949492E4L
+#define MINLOGL -1.13994985314888605586758E4L
+#define LOGE2L 6.9314718055994530941723E-1L
+#define LOG2EL 1.4426950408889634073599E0L
+#define PIL 3.1415926535897932384626L
+#define PIO2L 1.5707963267948966192313L
+#define PIO4L 7.8539816339744830961566E-1L
+#endif /* defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_) */
+
+#define isfinitel isfinite
+#define isinfl isinf
+#define isnanl isnan
+#define signbitl signbit
+
+#define NEGZEROL (-0.0L)
+
+#undef NANL
+#undef INFINITYL
+#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2))
+#define INFINITYL __builtin_huge_vall()
+#define NANL __builtin_nanl("")
+#else
+extern long double __INFL;
+#define INFINITYL (__INFL)
+extern long double __QNANL;
+#define NANL (__QNANL)
+#endif
+
+/* float */
+
+#define MAXNUMF 3.4028234663852885981170418348451692544e38F
+#define MAXLOGF 88.72283905206835F
+#define MINLOGF -103.278929903431851103F /* log(2^-149) */
+#define LOG2EF 1.44269504088896341F
+#define LOGE2F 0.693147180559945309F
+#define PIF 3.141592653589793238F
+#define PIO2F 1.5707963267948966192F
+#define PIO4F 0.7853981633974483096F
+
+#define isfinitef isfinite
+#define isinff isinf
+#define isnanf isnan
+#define signbitf signbit
+
+#define NEGZEROF (-0.0F)
+
+#undef NANF
+#undef INFINITYF
+#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 2))
+#define INFINITYF __builtin_huge_valf()
+#define NANF __builtin_nanf("")
+#else
+extern float __INFF;
+#define INFINITYF (__INFF)
+extern float __QNANF;
+#define NANF (__QNANF)
+#endif
+
+
+/* double */
+
+/*
+Cephes Math Library Release 2.2: July, 1992
+Copyright 1984, 1987, 1988, 1992 by Stephen L. Moshier
+Direct inquiries to 30 Frost Street, Cambridge, MA 02140
+*/
+
+
+/* polevl.c
+ * p1evl.c
+ *
+ * Evaluate polynomial
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * int N;
+ * double x, y, coef[N+1], polevl[];
+ *
+ * y = polevl( x, coef, N );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Evaluates polynomial of degree N:
+ *
+ * 2 N
+ * y = C + C x + C x +...+ C x
+ * 0 1 2 N
+ *
+ * Coefficients are stored in reverse order:
+ *
+ * coef[0] = C , ..., coef[N] = C .
+ * N 0
+ *
+ * The function p1evl() assumes that coef[N] = 1.0 and is
+ * omitted from the array. Its calling arguments are
+ * otherwise the same as polevl().
+ *
+ *
+ * SPEED:
+ *
+ * In the interest of speed, there are no checks for out
+ * of bounds arithmetic. This routine is used by most of
+ * the functions in the library. Depending on available
+ * equipment features, the user may wish to rewrite the
+ * program in microcode or assembly language.
+ *
+ */
+
+/* Polynomial evaluator:
+ * P[0] x^n + P[1] x^(n-1) + ... + P[n]
+ */
+static __inline__ double polevl(double x, const uD *p, int n)
+{
+ register double y;
+
+ y = p->d;
+ p++;
+ do
+ {
+ y = y * x + p->d;
+ p++;
+ }
+ while (--n);
+ return (y);
+}
+
+
+/* Polynomial evaluator:
+ * x^n + P[0] x^(n-1) + P[1] x^(n-2) + ... + P[n]
+ */
+static __inline__ double p1evl(double x, const uD *p, int n)
+{
+ register double y;
+
+ n -= 1;
+ y = x + p->d; p++;
+ do
+ {
+ y = y * x + p->d; p++;
+ }
+ while (--n);
+ return (y);
+}
+
+
+/* long double */
+/*
+Cephes Math Library Release 2.2: July, 1992
+Copyright 1984, 1987, 1988, 1992 by Stephen L. Moshier
+Direct inquiries to 30 Frost Street, Cambridge, MA 02140
+*/
+
+
+/* polevll.c
+ * p1evll.c
+ *
+ * Evaluate polynomial
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * int N;
+ * long double x, y, coef[N+1], polevl[];
+ *
+ * y = polevll( x, coef, N );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Evaluates polynomial of degree N:
+ *
+ * 2 N
+ * y = C + C x + C x +...+ C x
+ * 0 1 2 N
+ *
+ * Coefficients are stored in reverse order:
+ *
+ * coef[0] = C , ..., coef[N] = C .
+ * N 0
+ *
+ * The function p1evll() assumes that coef[N] = 1.0 and is
+ * omitted from the array. Its calling arguments are
+ * otherwise the same as polevll().
+ *
+ *
+ * SPEED:
+ *
+ * In the interest of speed, there are no checks for out
+ * of bounds arithmetic. This routine is used by most of
+ * the functions in the library. Depending on available
+ * equipment features, the user may wish to rewrite the
+ * program in microcode or assembly language.
+ *
+ */
+
+/* Polynomial evaluator:
+ * P[0] x^n + P[1] x^(n-1) + ... + P[n]
+ */
+static __inline__ long double polevll(long double x, const uLD *p, int n)
+{
+ register long double y;
+
+ y = p->ld;
+ p++;
+ do
+ {
+ y = y * x + p->ld;
+ p++;
+ }
+ while (--n);
+ return y;
+}
+
+
+
+/* Polynomial evaluator:
+ * x^n + P[0] x^(n-1) + P[1] x^(n-2) + ... + P[n]
+ */
+static __inline__ long double p1evll(long double x, const uLD *p, int n)
+{
+ register long double y;
+
+ n -= 1;
+ y = x + p->ld;
+ p++;
+
+ do
+ {
+ y = y * x + p->ld;
+ p++;
+ }
+ while (--n);
+ return (y);
+}
+
+/* Float version */
+
+/* polevlf.c
+ * p1evlf.c
+ *
+ * Evaluate polynomial
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * int N;
+ * float x, y, coef[N+1], polevlf[];
+ *
+ * y = polevlf( x, coef, N );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Evaluates polynomial of degree N:
+ *
+ * 2 N
+ * y = C + C x + C x +...+ C x
+ * 0 1 2 N
+ *
+ * Coefficients are stored in reverse order:
+ *
+ * coef[0] = C , ..., coef[N] = C .
+ * N 0
+ *
+ * The function p1evl() assumes that coef[N] = 1.0 and is
+ * omitted from the array. Its calling arguments are
+ * otherwise the same as polevl().
+ *
+ *
+ * SPEED:
+ *
+ * In the interest of speed, there are no checks for out
+ * of bounds arithmetic. This routine is used by most of
+ * the functions in the library. Depending on available
+ * equipment features, the user may wish to rewrite the
+ * program in microcode or assembly language.
+ *
+ */
+
+/*
+Cephes Math Library Release 2.1: December, 1988
+Copyright 1984, 1987, 1988 by Stephen L. Moshier
+Direct inquiries to 30 Frost Street, Cambridge, MA 02140
+*/
+
+static __inline__ float polevlf(float x, const float* coef, int N)
+{
+ float ans;
+ float *p;
+ int i;
+
+ p = (float*)coef;
+ ans = *p++;
+
+ /*
+ for (i = 0; i < N; i++)
+ ans = ans * x + *p++;
+ */
+
+ i = N;
+ do
+ ans = ans * x + *p++;
+ while (--i);
+
+ return (ans);
+}
+
+/* p1evl() */
+/* N
+ * Evaluate polynomial when coefficient of x is 1.0.
+ * Otherwise same as polevl.
+ */
+
+static __inline__ float p1evlf(float x, const float *coef, int N)
+{
+ float ans;
+ float *p;
+ int i;
+
+ p = (float*)coef;
+ ans = x + *p++;
+ i = N - 1;
+
+ do
+ ans = ans * x + *p++;
+ while (--i);
+
+ return (ans);
+}
+
libc/mingw/math/copysign.c
@@ -0,0 +1,21 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+typedef union U
+{
+ unsigned int u[2];
+ double d;
+} U;
+
+double copysign(double x, double y)
+{
+ U h,j;
+ h.d = x;
+ j.d = y;
+ h.u[1] = (h.u[1] & 0x7fffffff) | (j.u[1] & 0x80000000);
+ return h.d;
+}
libc/mingw/math/copysignf.c
@@ -0,0 +1,19 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+typedef union ui_f {
+ float f;
+ unsigned int ui;
+} ui_f;
+
+float copysignf(float aX, float aY)
+{
+ ui_f x,y;
+ x.f=aX; y.f=aY;
+ x.ui= (x.ui & 0x7fffffff) | (y.ui & 0x80000000);
+ return x.f;
+}
libc/mingw/math/coshf.c
@@ -0,0 +1,10 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+float coshf (float x)
+{
+ return (float) cosh (x);
+}
libc/mingw/math/coshl.c
@@ -0,0 +1,45 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "cephes_mconf.h"
+
+#ifndef _SET_ERRNO
+#define _SET_ERRNO(x)
+#endif
+
+long double coshl(long double x)
+{
+ long double y;
+ int x_class = fpclassify (x);
+ if (x_class == FP_NAN)
+ {
+ errno = EDOM;
+ return x;
+ }
+ else if (x_class == FP_INFINITE)
+ {
+ errno = ERANGE;
+ return x;
+ }
+ x = fabsl (x);
+ if (x > (MAXLOGL + LOGE2L))
+ {
+ errno = ERANGE;
+#ifdef INFINITIES
+ return (INFINITYL);
+#else
+ return (MAXNUML);
+#endif
+ }
+ if (x >= (MAXLOGL - LOGE2L))
+ {
+ y = expl(0.5L * x);
+ y = (0.5L * y) * y;
+ return y;
+ }
+ y = expl(x);
+ y = 0.5L * (y + 1.0L / y);
+ return y;
+}
libc/mingw/math/erfl.c
@@ -0,0 +1,303 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/* erfl.c
+ *
+ * Error function
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, erfl();
+ *
+ * y = erfl( x );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * The integral is
+ *
+ * x
+ * -
+ * 2 | | 2
+ * erf(x) = -------- | exp( - t ) dt.
+ * sqrt(pi) | |
+ * -
+ * 0
+ *
+ * The magnitude of x is limited to about 106.56 for IEEE
+ * arithmetic; 1 or -1 is returned outside this range.
+ *
+ * For 0 <= |x| < 1, erf(x) = x * P6(x^2)/Q6(x^2);
+ * Otherwise: erf(x) = 1 - erfc(x).
+ *
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE 0,1 50000 2.0e-19 5.7e-20
+ *
+ */
+
+/* erfcl.c
+ *
+ * Complementary error function
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, erfcl();
+ *
+ * y = erfcl( x );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ *
+ * 1 - erf(x) =
+ *
+ * inf.
+ * -
+ * 2 | | 2
+ * erfc(x) = -------- | exp( - t ) dt
+ * sqrt(pi) | |
+ * -
+ * x
+ *
+ *
+ * For small x, erfc(x) = 1 - erf(x); otherwise rational
+ * approximations are computed.
+ *
+ * A special function expx2l.c is used to suppress error amplification
+ * in computing exp(-x^2).
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE 0,13 50000 8.4e-19 9.7e-20
+ * IEEE 6,106.56 20000 2.9e-19 7.1e-20
+ *
+ *
+ * ERROR MESSAGES:
+ *
+ * message condition value returned
+ * erfcl underflow x^2 > MAXLOGL 0.0
+ *
+ *
+ */
+
+
+/*
+Modified from file ndtrl.c
+Cephes Math Library Release 2.3: January, 1995
+Copyright 1984, 1995 by Stephen L. Moshier
+*/
+
+#include <math.h>
+#include "cephes_mconf.h"
+
+long double erfl(long double x);
+
+/* erfc(x) = exp(-x^2) P(1/x)/Q(1/x)
+ 1/8 <= 1/x <= 1
+ Peak relative error 5.8e-21 */
+
+static const uLD P[10] = {
+ { { 0x4bf0,0x9ad8,0x7a03,0x86c7,0x401d, 0, 0, 0 } },
+ { { 0xdf23,0xd843,0x4032,0x8881,0x401e, 0, 0, 0 } },
+ { { 0xd025,0xcfd5,0x8494,0x88d3,0x401e, 0, 0, 0 } },
+ { { 0xb6d0,0xc92b,0x5417,0xacb1,0x401d, 0, 0, 0 } },
+ { { 0xada8,0x356a,0x4982,0x94a6,0x401c, 0, 0, 0 } },
+ { { 0x4e13,0xcaee,0x9e31,0xb258,0x401a, 0, 0, 0 } },
+ { { 0x5840,0x554d,0x37a3,0x9239,0x4018, 0, 0, 0 } },
+ { { 0x3b58,0x3da2,0xaf02,0x9780,0x4015, 0, 0, 0 } },
+ { { 0x0144,0x489e,0xbe68,0x9c31,0x4011, 0, 0, 0 } },
+ { { 0x333b,0xd9e6,0xd404,0x986f,0xbfee, 0, 0, 0 } }
+};
+static const uLD Q[] = {
+ { { 0x0e43,0x302d,0x79ed,0x86c7,0x401d, 0, 0, 0 } },
+ { { 0xf817,0x9128,0xc0f8,0xd48b,0x401e, 0, 0, 0 } },
+ { { 0x8eae,0x8dad,0x6eb4,0x9aa2,0x401f, 0, 0, 0 } },
+ { { 0x00e7,0x7595,0xcd06,0x88bb,0x401f, 0, 0, 0 } },
+ { { 0x4991,0xcfda,0x52f1,0xa2a9,0x401e, 0, 0, 0 } },
+ { { 0xc39d,0xe415,0xc43d,0x87c0,0x401d, 0, 0, 0 } },
+ { { 0xa75d,0x436f,0x30dd,0xa027,0x401b, 0, 0, 0 } },
+ { { 0xc4cb,0x305a,0xbf78,0x8220,0x4019, 0, 0, 0 } },
+ { { 0x3708,0x33b1,0x07fa,0x8644,0x4016, 0, 0, 0 } },
+ { { 0x24fa,0x96f6,0x7153,0x8a6c,0x4012, 0, 0, 0 } }
+};
+
+/* erfc(x) = exp(-x^2) 1/x R(1/x^2) / S(1/x^2)
+ 1/128 <= 1/x < 1/8
+ Peak relative error 1.9e-21 */
+
+static const uLD R[] = {
+ { { 0x260a,0xab95,0x2fc7,0xe7c4,0x4000, 0, 0, 0 } },
+ { { 0x4761,0x613e,0xdf6d,0xe58e,0x4001, 0, 0, 0 } },
+ { { 0x0615,0x4b00,0x575f,0xdc7b,0x4000, 0, 0, 0 } },
+ { { 0x521d,0x8527,0x3435,0x8dc2,0x3ffe, 0, 0, 0 } },
+ { { 0x22cf,0xc711,0x6c5b,0xdcfb,0x3ff9, 0, 0, 0 } }
+};
+static const uLD S[] = {
+ { { 0x5de6,0x17d7,0x54d6,0xaba9,0x4002, 0, 0, 0 } },
+ { { 0x55d5,0xd300,0xe71e,0xf564,0x4002, 0, 0, 0 } },
+ { { 0xb611,0x8f76,0xf020,0xd255,0x4001, 0, 0, 0 } },
+ { { 0x3684,0x3798,0xb793,0x80b0,0x3fff, 0, 0, 0 } },
+ { { 0xf5af,0x2fb2,0x1e57,0xc3d7,0x3ffa, 0, 0, 0 } }
+};
+
+/* erf(x) = x T(x^2)/U(x^2)
+ 0 <= x <= 1
+ Peak relative error 7.6e-23 */
+
+static const uLD T[] = {
+ { { 0xfd7a,0x3a1a,0x705b,0xe0c4,0x3ffb, 0, 0, 0 } },
+ { { 0x3128,0xc337,0x3716,0xace5,0x4001, 0, 0, 0 } },
+ { { 0x9517,0x4e93,0x540e,0x8f97,0x4007, 0, 0, 0 } },
+ { { 0x6118,0x6059,0x9093,0xa757,0x400a, 0, 0, 0 } },
+ { { 0xb954,0xa987,0xc60c,0xbc83,0x400e, 0, 0, 0 } },
+ { { 0x7a56,0xe45a,0xa4bd,0x975b,0x4010, 0, 0, 0 } },
+ { { 0xc446,0x6bab,0x0b2a,0x86d0,0x4013, 0, 0, 0 } }
+};
+
+static const uLD U[] = {
+ { { 0x3453,0x1f8e,0xf688,0xb507,0x4004, 0, 0, 0 } },
+ { { 0x71ac,0xb12f,0x21ca,0xf2e2,0x4008, 0, 0, 0 } },
+ { { 0xffe8,0x9cac,0x3b84,0xc2ac,0x400c, 0, 0, 0 } },
+ { { 0x481d,0x445b,0xc807,0xc232,0x400f, 0, 0, 0 } },
+ { { 0x9ad5,0x1aef,0x45b1,0xe25e,0x4011, 0, 0, 0 } },
+ { { 0x71a7,0x1cad,0x012e,0xeef3,0x4012, 0, 0, 0 } }
+};
+
+/* expx2l.c
+ *
+ * Exponential of squared argument
+ *
+ *
+ *
+ * SYNOPSIS:
+ *
+ * long double x, y, expmx2l();
+ * int sign;
+ *
+ * y = expx2l( x );
+ *
+ *
+ *
+ * DESCRIPTION:
+ *
+ * Computes y = exp(x*x) while suppressing error amplification
+ * that would ordinarily arise from the inexactness of the
+ * exponential argument x*x.
+ *
+ *
+ *
+ * ACCURACY:
+ *
+ * Relative error:
+ * arithmetic domain # trials peak rms
+ * IEEE -106.566, 106.566 10^5 1.6e-19 4.4e-20
+ *
+ */
+
+#define M 32768.0L
+#define MINV 3.0517578125e-5L
+
+static long double expx2l (long double x)
+{
+ long double u, u1, m, f;
+
+ x = fabsl (x);
+ /* Represent x as an exact multiple of M plus a residual.
+ M is a power of 2 chosen so that exp(m * m) does not overflow
+ or underflow and so that |x - m| is small. */
+ m = MINV * floorl(M * x + 0.5L);
+ f = x - m;
+
+ /* x^2 = m^2 + 2mf + f^2 */
+ u = m * m;
+ u1 = 2 * m * f + f * f;
+
+ if ((u + u1) > MAXLOGL)
+ return (INFINITYL);
+
+ /* u is exact, u1 is small. */
+ u = expl(u) * expl(u1);
+ return (u);
+}
+
+long double erfcl(long double a)
+{
+ long double p, q, x, y, z;
+
+ if (isinf (a))
+ return (signbit(a) ? 2.0 : 0.0);
+
+ x = fabsl (a);
+
+ if (x < 1.0L)
+ return (1.0L - erfl(a));
+
+ z = a * a;
+
+ if (z > MAXLOGL)
+ {
+under:
+ mtherr("erfcl", UNDERFLOW);
+ errno = ERANGE;
+ return (signbit(a) ? 2.0 : 0.0);
+ }
+
+ /* Compute z = expl(a * a). */
+ z = expx2l(a);
+ y = 1.0L/x;
+
+ if (x < 8.0L)
+ {
+ p = polevll(y, P, 9);
+ q = p1evll(y, Q, 10);
+ }
+ else
+ {
+ q = y * y;
+ p = y * polevll(q, R, 4);
+ q = p1evll(q, S, 5);
+ }
+ y = p/(q * z);
+
+ if (a < 0.0L)
+ y = 2.0L - y;
+
+ if (y == 0.0L)
+ goto under;
+
+ return (y);
+}
+
+long double erfl(long double x)
+{
+ long double y, z;
+
+ if (x == 0.0L)
+ return (x);
+
+ if (isinf (x))
+ return (signbit(x) ? -1.0L : 1.0L);
+
+ if (fabsl(x) > 1.0L)
+ return (1.0L - erfcl(x));
+
+ z = x * x;
+ y = x * polevll(z, T, 6) / p1evll(z, U, 6);
+ return (y);
+}
libc/mingw/math/expf.c
@@ -0,0 +1,11 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+float expf (float x)
+{
+ return (float) exp (x);
+}
libc/mingw/math/fabs.c
@@ -0,0 +1,20 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __CRT__NO_INLINE
+#include <math.h>
+
+double
+fabs (double x)
+{
+#if defined(__x86_64__) || defined(_AMD64_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
+ return __builtin_fabs (x);
+#elif defined(__i386__) || defined(_X86_)
+ double res = 0.0;
+
+ asm volatile ("fabs;" : "=t" (res) : "0" (x));
+ return res;
+#endif /* defined(__x86_64__) || defined(_AMD64_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_) */
+}
libc/mingw/math/fabsf.c
@@ -0,0 +1,18 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+float fabsf (float x);
+
+float
+fabsf (float x)
+{
+#if defined(__x86_64__) || defined(_AMD64_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
+ return __builtin_fabsf (x);
+#elif defined(__i386__) || defined(_X86_)
+ float res = 0.0F;
+ asm volatile ("fabs;" : "=t" (res) : "0" (x));
+ return res;
+#endif /* defined(__x86_64__) || defined(_AMD64_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_) */
+}
libc/mingw/math/fabsl.c
@@ -0,0 +1,18 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+long double fabsl (long double x);
+
+long double
+fabsl (long double x)
+{
+#if defined(__x86_64__) || defined(_AMD64_) || defined(__i386__) || defined(_X86_)
+ long double res = 0.0L;
+ asm volatile ("fabs;" : "=t" (res) : "0" (x));
+ return res;
+#elif defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
+ return __builtin_fabsl (x);
+#endif /* defined(__x86_64__) || defined(_AMD64_) || defined(__i386__) || defined(_X86_) */
+}
libc/mingw/math/fdim.c
@@ -0,0 +1,24 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <errno.h>
+
+double
+fdim (double x, double y)
+{
+ int cx = fpclassify (x), cy = fpclassify (y);
+ double r;
+
+ if (cx == FP_NAN || cy == FP_NAN
+ || (y < 0 && cx == FP_INFINITE && cy == FP_INFINITE))
+ return x - y; /* Take care invalid flag is raised. */
+ if (x <= y)
+ return 0.0;
+ r = x - y;
+ if (fpclassify (r) == FP_INFINITE)
+ errno = ERANGE;
+ return r;
+}
libc/mingw/math/fdimf.c
@@ -0,0 +1,24 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <errno.h>
+#include <math.h>
+
+float
+fdimf (float x, float y)
+{
+ int cx = fpclassify (x), cy = fpclassify (y);
+ float r;
+
+ if (cx == FP_NAN || cy == FP_NAN
+ || (y < 0 && cx == FP_INFINITE && cy == FP_INFINITE))
+ return x - y; /* Take care invalid flag is raised. */
+ if (x <= y)
+ return 0.0f;
+ r = x - y;
+ if (fpclassify (r) == FP_INFINITE)
+ errno = ERANGE;
+ return r;
+}
libc/mingw/math/fdiml.c
@@ -0,0 +1,24 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <errno.h>
+#include <math.h>
+
+long double
+fdiml (long double x, long double y)
+{
+ int cx = fpclassify (x), cy = fpclassify (y);
+ long double r;
+
+ if (cx == FP_NAN || cy == FP_NAN
+ || (y < 0 && cx == FP_INFINITE && cy == FP_INFINITE))
+ return x - y; /* Take care invalid flag is raised. */
+ if (x <= y)
+ return 0.0;
+ r = x - y;
+ if (fpclassify (r) == FP_INFINITE)
+ errno = ERANGE;
+ return r;
+}
libc/mingw/math/fma.c
@@ -0,0 +1,41 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+double fma(double x, double y, double z);
+
+#if defined(_ARM_) || defined(__arm__)
+
+/* Use hardware FMA on ARM. */
+double fma(double x, double y, double z){
+ __asm__ (
+ "fmacd %0, %1, %2 \n"
+ : "+w"(z)
+ : "w"(x), "w"(y)
+ );
+ return z;
+}
+
+#elif defined(_ARM64_) || defined(__aarch64__)
+
+/* Use hardware FMA on ARM64. */
+double fma(double x, double y, double z){
+ __asm__ (
+ "fmadd %d0, %d1, %d2, %d0 \n"
+ : "+w"(z)
+ : "w"(x), "w"(y)
+ );
+ return z;
+}
+
+#else
+
+long double fmal(long double x, long double y, long double z);
+
+/* For platforms that don't have hardware FMA, emulate it. */
+double fma(double x, double y, double z){
+ return (double)fmal(x, y, z);
+}
+
+#endif
libc/mingw/math/fmaf.c
@@ -0,0 +1,41 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+float fmaf(float x, float y, float z);
+
+#if defined(_ARM_) || defined(__arm__)
+
+/* Use hardware FMA on ARM. */
+float fmaf(float x, float y, float z){
+ __asm__ (
+ "fmacs %0, %1, %2 \n"
+ : "+t"(z)
+ : "t"(x), "t"(y)
+ );
+ return z;
+}
+
+#elif defined(_ARM64_) || defined(__aarch64__)
+
+/* Use hardware FMA on ARM64. */
+float fmaf(float x, float y, float z){
+ __asm__ (
+ "fmadd %s0, %s1, %s2, %s0 \n"
+ : "+w"(z)
+ : "w"(x), "w"(y)
+ );
+ return z;
+}
+
+#else
+
+long double fmal(long double x, long double y, long double z);
+
+/* For platforms that don't have hardware FMA, emulate it. */
+float fmaf(float x, float y, float z){
+ return (float)fmal(x, y, z);
+}
+
+#endif
libc/mingw/math/fmal.c
@@ -0,0 +1,145 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+long double fmal(long double x, long double y, long double z);
+
+#if defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__)
+
+double fma(double x, double y, double z);
+
+/* On ARM `long double` is 64 bits. And ARM has hardware FMA. */
+long double fmal(long double x, long double y, long double z){
+ return fma(x, y, z);
+}
+
+#elif defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+
+/**
+ * x87-specific software-emulated FMA by LH_Mouse (lh_mouse at 126 dot com).
+ * This file is donated to the mingw-w64 project.
+ * Note: This file requires C99 support to compile.
+ */
+
+#include <math.h>
+#include <stdint.h>
+#include <limits.h>
+#include <stdbool.h>
+
+/* https://en.wikipedia.org/wiki/Extended_precision#x86_extended_precision_format */
+typedef union x87reg_ {
+ struct __attribute__((__packed__)) {
+ union {
+ uint64_t f64;
+ struct {
+ uint32_t flo;
+ uint32_t fhi;
+ };
+ };
+ uint16_t exp : 15;
+ uint16_t sgn : 1;
+ };
+ long double f;
+} x87reg;
+
+static inline void break_down(x87reg *restrict lo, x87reg *restrict hi, long double x){
+ hi->f = x;
+ const uint32_t flo = hi->flo;
+ const long exp = hi->exp;
+ const bool sgn = hi->sgn;
+ /* Erase low-order significant bits. `hi->f` now has only 32 significant bits. */
+ hi->flo = 0;
+
+ if(flo == 0){
+ /* If the low-order significant bits are all zeroes, return zero in `lo->f`. */
+ lo->f64 = 0;
+ lo->exp = 0;
+ } else {
+ /* How many bits should we shift to normalize the floating point value? */
+ const long shn = __builtin_clzl(flo) - (sizeof(long) - sizeof(uint32_t)) * CHAR_BIT + 32;
+#if 0 /* Naive implementation */
+ if(shn < exp){
+ /* `x` can be normalized, normalize it. */
+ lo->f64 = (uint64_t)flo << shn;
+ lo->exp = (exp - shn) & 0x7FFF;
+ } else {
+ /* Otherwise, go with a denormal number. */
+ if(exp > 0){
+ /* Denormalize the source normal number. */
+ lo->f64 = (uint64_t)flo << (exp - 1);
+ } else {
+ /* Leave the source denormal number as is. */
+ lo->f64 = flo;
+ }
+ lo->exp = 0;
+ }
+#else /* Optimal implementation */
+ const long mask = (shn - exp) >> 31; /* mask = (shn < exp) ? -1 : 0 */
+ long expm1 = exp - 1;
+ expm1 &= ~(expm1 >> 31); /* expm1 = (exp - 1 >= 0) ? (exp - 1) : 0 */
+ lo->f64 = (uint64_t)flo << (((shn ^ expm1) & mask) ^ expm1);
+ /* f64 = flo << ((shn < exp) ? shn : expm1) */
+ lo->exp = (exp - shn) & mask; /* exp = (shn < exp) ? (exp - shn) : 0 */
+#endif
+ }
+ lo->sgn = sgn;
+}
+static inline long double fpu_fma(long double x, long double y, long double z){
+ /*
+ POSIX-2013:
+ 1. If x or y are NaN, a NaN shall be returned.
+ 2. If x multiplied by y is an exact infinity and z is also an infinity
+ but with the opposite sign, a domain error shall occur, and either a NaN
+ (if supported), or an implementation-defined value shall be returned.
+ 3. If one of x and y is infinite, the other is zero, and z is not a NaN,
+ a domain error shall occur, and either a NaN (if supported), or an
+ implementation-defined value shall be returned.
+ 4. If one of x and y is infinite, the other is zero, and z is a NaN, a NaN
+ shall be returned and a domain error may occur.
+ 5. If x* y is not 0*Inf nor Inf*0 and z is a NaN, a NaN shall be returned.
+ */
+ if(__fpclassifyl(x) == FP_NAN){
+ return x; /* Handle case 1. */
+ }
+ if(__fpclassifyl(y) == FP_NAN){
+ return y; /* Handle case 1. */
+ }
+ /* Handle case 2, 3 and 4 universally. Thanks to x87 a NaN is generated
+ if an INF is multiplied with zero, saving us a huge amount of work. */
+ const long double xy = x * y;
+ if(__fpclassifyl(xy) == FP_NAN){
+ return xy; /* Handle case 2, 3 and 4. */
+ }
+ if(__fpclassifyl(z) == FP_NAN){
+ return z; /* Handle case 5. */
+ }
+ /* Check whether the result is finite. */
+ const long double xyz = xy + z;
+ const int cxyz = __fpclassifyl(xyz);
+ if((cxyz == FP_NAN) || (cxyz == FP_INFINITE)){
+ return xyz; /* If this naive check doesn't yield a finite value, the FMA isn't
+ likely to return one either. Forward the value as is. */
+ }
+
+ long double ret;
+ x87reg xlo, xhi, ylo, yhi;
+ break_down(&xlo, &xhi, x);
+ break_down(&ylo, &yhi, y);
+ /* The order of these four statements is essential. Don't move them around. */
+ ret = z;
+ ret += xhi.f * yhi.f; /* The most significant item comes first. */
+ ret += xhi.f * ylo.f + xlo.f * yhi.f; /* They are equally significant. */
+ ret += xlo.f * ylo.f; /* The least significant item comes last. */
+ return ret;
+}
+
+long double fmal(long double x, long double y, long double z){
+ return fpu_fma(x, y, z);
+}
+
+#else
+
+#error Please add FMA implementation for this platform.
+
+#endif
libc/mingw/math/fmax.c
@@ -0,0 +1,12 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+double
+fmax (double _x, double _y)
+{
+ return ( isgreaterequal (_x, _y)|| __isnan (_y) ? _x : _y );
+}
libc/mingw/math/fmaxf.c
@@ -0,0 +1,12 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+float
+fmaxf (float _x, float _y)
+{
+ return (( isgreaterequal(_x, _y) || __isnanf (_y)) ? _x : _y );
+}
libc/mingw/math/fmaxl.c
@@ -0,0 +1,12 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long double
+fmaxl (long double _x, long double _y)
+{
+ return (( isgreaterequal(_x, _y) || __isnanl (_y)) ? _x : _y );
+}
libc/mingw/math/fmin.c
@@ -0,0 +1,12 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+double
+fmin (double _x, double _y)
+{
+ return ((islessequal(_x, _y) || __isnan (_y)) ? _x : _y );
+}
libc/mingw/math/fminf.c
@@ -0,0 +1,12 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+float
+fminf (float _x, float _y)
+{
+ return ((islessequal(_x, _y) || __isnanf (_y)) ? _x : _y );
+}
libc/mingw/math/fminl.c
@@ -0,0 +1,12 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long double
+fminl (long double _x, long double _y)
+{
+ return ((islessequal(_x, _y) || __isnanl (_y)) ? _x : _y );
+}
libc/mingw/math/fp_consts.c
@@ -0,0 +1,20 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "fp_consts.h"
+const union _ieee_rep __QNAN = { __DOUBLE_QNAN_REP };
+const union _ieee_rep __SNAN = { __DOUBLE_SNAN_REP };
+const union _ieee_rep __INF = { __DOUBLE_INF_REP };
+const union _ieee_rep __DENORM = { __DOUBLE_DENORM_REP };
+
+/* ISO C99 */
+#undef nan
+/* FIXME */
+double nan (const char *);
+double nan (const char * tagp __attribute__((unused)) )
+{
+ return __QNAN.double_val;
+}
+
libc/mingw/math/fp_consts.h
@@ -0,0 +1,54 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#ifndef _FP_CONSTS_H
+#define _FP_CONSTS_H
+
+/*
+According to IEEE 754 a QNaN has exponent bits of all 1 values and
+initial significand bit of 1. A SNaN has has an exponent of all 1
+values and initial significand bit of 0 (with one or more other
+significand bits of 1). An Inf has significand of 0 and
+exponent of all 1 values. A denormal value has all exponent bits of 0.
+
+The following does _not_ follow those rules, but uses values
+equal to those exported from MS C++ runtime lib, msvcprt.dll
+for float and double. MSVC however, does not have long doubles.
+*/
+
+
+#define __DOUBLE_INF_REP { 0, 0, 0, 0x7ff0 }
+#define __DOUBLE_QNAN_REP { 0, 0, 0, 0xfff8 } /* { 0, 0, 0, 0x7ff8 } */
+#define __DOUBLE_SNAN_REP { 0, 0, 0, 0xfff0 } /* { 1, 0, 0, 0x7ff0 } */
+#define __DOUBLE_DENORM_REP {1, 0, 0, 0}
+
+#define D_NAN_MASK 0x7ff0000000000000LL /* this will mask NaN's and Inf's */
+
+#define __FLOAT_INF_REP { 0, 0x7f80 }
+#define __FLOAT_QNAN_REP { 0, 0xffc0 } /* { 0, 0x7fc0 } */
+#define __FLOAT_SNAN_REP { 0, 0xff80 } /* { 1, 0x7f80 } */
+#define __FLOAT_DENORM_REP {1,0}
+
+#define F_NAN_MASK 0x7f800000
+
+/*
+ This assumes no implicit (hidden) bit in extended mode.
+ Padded to 96 bits
+ */
+#define __LONG_DOUBLE_INF_REP { 0, 0, 0, 0x8000, 0x7fff, 0 }
+#define __LONG_DOUBLE_QNAN_REP { 0, 0, 0, 0xc000, 0xffff, 0 }
+#define __LONG_DOUBLE_SNAN_REP { 0, 0, 0, 0x8000, 0xffff, 0 }
+#define __LONG_DOUBLE_DENORM_REP {1, 0, 0, 0, 0, 0}
+
+union _ieee_rep
+{
+ unsigned short rep[6];
+ float float_val;
+ double double_val;
+ long double ldouble_val;
+};
+
+#endif /* _FP_CONSTS_H */
+
libc/mingw/math/fp_constsf.c
@@ -0,0 +1,22 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "fp_consts.h"
+
+const union _ieee_rep __QNANF = { __FLOAT_QNAN_REP };
+const union _ieee_rep __SNANF = { __FLOAT_SNAN_REP };
+const union _ieee_rep __INFF = { __FLOAT_INF_REP };
+const union _ieee_rep __DENORMF = { __FLOAT_DENORM_REP };
+
+/* ISO C99 */
+#undef nanf
+/* FIXME */
+float nanf(const char *);
+
+float nanf(const char * tagp __attribute__((unused)) )
+{
+ return __QNANF.float_val;
+}
+
libc/mingw/math/fp_constsl.c
@@ -0,0 +1,20 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "fp_consts.h"
+
+const union _ieee_rep __QNANL = { __LONG_DOUBLE_QNAN_REP };
+const union _ieee_rep __SNANL = { __LONG_DOUBLE_SNAN_REP };
+const union _ieee_rep __INFL = { __LONG_DOUBLE_INF_REP };
+const union _ieee_rep __DENORML = { __LONG_DOUBLE_DENORM_REP };
+
+#undef nanl
+/* FIXME */
+long double nanl (const char *);
+long double nanl (const char * tagp __attribute__((unused)) )
+{
+ return __QNANL.ldouble_val;
+}
+
libc/mingw/math/fpclassify.c
@@ -0,0 +1,34 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __CRT__NO_INLINE
+#include <math.h>
+
+/* 'fxam' sets FPU flags C3,C2,C0 'fstsw' stores:
+ FP_NAN 001 0x0100
+ FP_NORMAL 010 0x0400
+ FP_INFINITE 011 0x0500
+ FP_ZERO 100 0x4000
+ FP_SUBNORMAL 110 0x4400
+
+and sets C1 flag (signbit) if neg */
+
+int __fpclassify (double _x)
+{
+ __mingw_dbl_type_t hlp;
+ unsigned int l, h;
+
+ hlp.x = _x;
+ h = hlp.lh.high;
+ l = hlp.lh.low | (h & 0xfffff);
+ h &= 0x7ff00000;
+ if ((h | l) == 0)
+ return FP_ZERO;
+ if (!h)
+ return FP_SUBNORMAL;
+ if (h == 0x7ff00000)
+ return (l ? FP_NAN : FP_INFINITE);
+ return FP_NORMAL;
+}
libc/mingw/math/fpclassifyf.c
@@ -0,0 +1,32 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __CRT__NO_INLINE
+#include <math.h>
+
+int __fpclassifyf (float _x)
+{
+#if defined(__x86_64__) || defined(_AMD64_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
+ __mingw_flt_type_t hlp;
+
+ hlp.x = _x;
+ hlp.val &= 0x7fffffff;
+ if (hlp.val == 0)
+ return FP_ZERO;
+ if (hlp.val < 0x800000)
+ return FP_SUBNORMAL;
+ if (hlp.val >= 0x7f800000)
+ return (hlp.val > 0x7f800000 ? FP_NAN : FP_INFINITE);
+ return FP_NORMAL;
+#elif defined(__i386__) || defined(_X86_)
+ unsigned short sw;
+ __asm__ __volatile__ (
+ "fxam; fstsw %%ax;"
+ : "=a" (sw)
+ : "t" (_x)
+ );
+ return sw & (FP_NAN | FP_NORMAL | FP_ZERO);
+#endif
+}
libc/mingw/math/fpclassifyl.c
@@ -0,0 +1,37 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+#define __CRT__NO_INLINE
+#include <math.h>
+
+int __fpclassifyl (long double _x){
+#if defined(__x86_64__) || defined(_AMD64_)
+ __mingw_fp_types_t hlp;
+ unsigned int e;
+ hlp.ld = &_x;
+ e = hlp.ldt->lh.sign_exponent & 0x7fff;
+ if (!e)
+ {
+ unsigned int h = hlp.ldt->lh.high;
+ if (!(hlp.ldt->lh.low | h))
+ return FP_ZERO;
+ else if (!(h & 0x80000000))
+ return FP_SUBNORMAL;
+ }
+ else if (e == 0x7fff)
+ return (((hlp.ldt->lh.high & 0x7fffffff) | hlp.ldt->lh.low) == 0 ?
+ FP_INFINITE : FP_NAN);
+ return FP_NORMAL;
+#elif defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
+ return __fpclassify(_x);
+#elif defined(__i386__) || defined(_X86_)
+ unsigned short sw;
+ __asm__ __volatile__ (
+ "fxam; fstsw %%ax;"
+ : "=a" (sw)
+ : "t" (_x)
+ );
+ return sw & (FP_NAN | FP_NORMAL | FP_ZERO );
+#endif
+}
libc/mingw/math/frexpf.c
@@ -0,0 +1,13 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+extern double __cdecl frexp(double _X,int *_Y);
+
+float frexpf (float, int *);
+float frexpf (float x, int *expn)
+{
+ return (float)frexp(x, expn);
+}
+
libc/mingw/math/hypot.c
@@ -0,0 +1,23 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+#define _NEW_COMPLEX_DOUBLE 1
+
+#include "../complex/complex_internal.h"
+#include <errno.h>
+#include <math.h>
+
+double hypot (double x, double y)
+{
+ int x_class = fpclassify (x);
+ int y_class = fpclassify (y);
+
+ if (x_class == FP_INFINITE || y_class == FP_INFINITE)
+ return __FLT_HUGE_VAL;
+ else if (x_class == FP_NAN || y_class == FP_NAN)
+ return __FLT_NAN;
+
+ return _hypot (x, y);
+}
+
libc/mingw/math/hypotf.c
@@ -0,0 +1,23 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+#define _NEW_COMPLEX_FLOAT 1
+
+#include "../complex/complex_internal.h"
+#include <errno.h>
+#include <math.h>
+
+float hypotf (float x, float y)
+{
+ int x_class = fpclassify (x);
+ int y_class = fpclassify (y);
+
+ if (x_class == FP_INFINITE || y_class == FP_INFINITE)
+ return __FLT_HUGE_VAL;
+ else if (x_class == FP_NAN || y_class == FP_NAN)
+ return __FLT_NAN;
+
+ return (float) _hypot (x, y);
+}
+
libc/mingw/math/hypotl.c
@@ -0,0 +1,83 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <float.h>
+#include <errno.h>
+
+/*
+This implementation is based largely on Cephes library
+function cabsl (cmplxl.c), which bears the following notice:
+
+Cephes Math Library Release 2.1: January, 1989
+Copyright 1984, 1987, 1989 by Stephen L. Moshier
+Direct inquiries to 30 Frost Street, Cambridge, MA 02140
+*/
+
+/*
+ Modified for use in libmingwex.a
+ 02 Sept 2002 Danny Smith <dannysmith@users.sourceforege.net>
+ Calls to ldexpl replaced by logbl and calls to frexpl replaced
+ by scalbnl to avoid duplicated range checks.
+*/
+
+extern long double __INFL;
+#define PRECL 32
+
+long double
+hypotl (long double x, long double y)
+{
+ int exx;
+ int eyy;
+ int scale;
+ long double xx =fabsl(x);
+ long double yy =fabsl(y);
+ if (!isfinite(xx) || !isfinite(yy))
+ {
+ /* Annex F.9.4.3, hypot returns +infinity if
+ either component is an infinity, even when the
+ other compoent is NaN. */
+ return (isinf(xx) || isinf(yy)) ? INFINITY : NAN;
+ }
+
+ if (xx == 0.0L)
+ return yy;
+ if (yy == 0.0L)
+ return xx;
+
+ /* Get exponents */
+ exx = logbl (xx);
+ eyy = logbl (yy);
+
+ /* Check if large differences in scale */
+ scale = exx - eyy;
+ if ( scale > PRECL)
+ return xx;
+ if ( scale < -PRECL)
+ return yy;
+
+ /* Exponent of approximate geometric mean (x 2) */
+ scale = (exx + eyy) >> 1;
+
+ /* Rescale: Geometric mean is now about 2 */
+ x = scalbnl(xx, -scale);
+ y = scalbnl(yy, -scale);
+
+ xx = sqrtl(x * x + y * y);
+
+ /* Check for overflow and underflow */
+ exx = logbl(xx);
+ exx += scale;
+ if (exx > LDBL_MAX_EXP)
+ {
+ errno = ERANGE;
+ return __INFL;
+ }
+ if (exx < LDBL_MIN_EXP)
+ return 0.0L;
+
+ /* Undo scaling */
+ return (scalbnl (xx, scale));
+}
libc/mingw/math/isnan.c
@@ -0,0 +1,31 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+int
+__isnan (double _x)
+{
+#if defined(__x86_64__) || defined(_AMD64_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
+ __mingw_dbl_type_t hlp;
+ int l, h;
+
+ hlp.x = _x;
+ l = hlp.lh.low;
+ h = hlp.lh.high & 0x7fffffff;
+ h |= (unsigned int) (l | -l) >> 31;
+ h = 0x7ff00000 - h;
+ return (int) ((unsigned int) h) >> 31;
+#elif defined(__i386__) || defined(_X86_)
+ unsigned short _sw;
+ __asm__ __volatile__ ("fxam;"
+ "fstsw %%ax": "=a" (_sw) : "t" (_x));
+ return (_sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL))
+ == FP_NAN;
+#endif
+}
+
+#undef isnan
+int __attribute__ ((alias ("__isnan"))) isnan (double);
libc/mingw/math/isnanf.c
@@ -0,0 +1,27 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+int
+__isnanf (float _x)
+{
+#if defined(__x86_64__) || defined(_AMD64_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
+ __mingw_flt_type_t hlp;
+ int i;
+
+ hlp.x = _x;
+ i = hlp.val & 0x7fffffff;
+ i = 0x7f800000 - i;
+ return (int) (((unsigned int) i) >> 31);
+#elif defined(__i386__) || defined(_X86_)
+ unsigned short _sw;
+ __asm__ __volatile__ ("fxam;"
+ "fstsw %%ax": "=a" (_sw) : "t" (_x) );
+ return (_sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL))
+ == FP_NAN;
+#endif
+}
+
+int __attribute__ ((alias ("__isnanf"))) isnanf (float);
libc/mingw/math/isnanl.c
@@ -0,0 +1,32 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+int
+__isnanl (long double _x)
+{
+#if defined(__x86_64__) || defined(_AMD64_)
+ __mingw_fp_types_t ld;
+ int xx, signexp;
+
+ ld.ld = &_x;
+ signexp = (ld.ldt->lh.sign_exponent & 0x7fff) << 1;
+ xx = (int) (ld.ldt->lh.low | (ld.ldt->lh.high & 0x7fffffffu)); /* explicit */
+ signexp |= (unsigned int) (xx | (-xx)) >> 31;
+ signexp = 0xfffe - signexp;
+ return (int) ((unsigned int) signexp) >> 16;
+#elif defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
+ return __isnan(_x);
+#elif defined(__i386__) || defined(_X86_)
+ unsigned short _sw;
+ __asm__ __volatile__ ("fxam;"
+ "fstsw %%ax": "=a" (_sw) : "t" (_x));
+ return (_sw & (FP_NAN | FP_NORMAL | FP_INFINITE | FP_ZERO | FP_SUBNORMAL))
+ == FP_NAN;
+#endif
+}
+
+int __attribute__ ((alias ("__isnanl"))) isnanl (long double);
libc/mingw/math/ldexpf.c
@@ -0,0 +1,13 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+extern double __cdecl ldexp(double _X,int _Y);
+
+float ldexpf (float x, int expn);
+float ldexpf (float x, int expn)
+{
+ return (float) ldexp (x, expn);
+}
+
libc/mingw/math/lgamma.c
@@ -0,0 +1,276 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "cephes_mconf.h"
+
+/* A[]: Stirling's formula expansion of log gamma
+ * B[], C[]: log gamma function between 2 and 3
+ */
+#ifdef UNK
+static uD A[] = {
+ { { 8.11614167470508450300E-4 } },
+ { { -5.95061904284301438324E-4 } },
+ { { 7.93650340457716943945E-4 } },
+ { { -2.77777777730099687205E-3 } },
+ { { 8.33333333333331927722E-2 } }
+};
+static uD B[] = {
+ { { -1.37825152569120859100E3 } },
+ { { -3.88016315134637840924E4 } },
+ { { -3.31612992738871184744E5 } },
+ { { -1.16237097492762307383E6 } },
+ { { -1.72173700820839662146E6 } },
+ { { -8.53555664245765465627E5 } }
+};
+static uD C[] = {
+ { { -3.51815701436523470549E2 } },
+ { { -1.70642106651881159223E4 } },
+ { { -2.20528590553854454839E5 } },
+ { { -1.13933444367982507207E6 } },
+ { { -2.53252307177582951285E6 } },
+ { { -2.01889141433532773231E6 } }
+};
+/* log( sqrt( 2*pi ) ) */
+static double LS2PI = 0.91893853320467274178;
+#define MAXLGM 2.556348e305
+static double LOGPI = 1.14472988584940017414;
+#endif
+
+#ifdef DEC
+static const uD A[] = {
+ { { 0035524,0141201,0034633,0031405 } },
+ { { 0135433,0176755,0126007,0045030 } },
+ { { 0035520,0006371,0003342,0172730 } },
+ { { 0136066,0005540,0132605,0026407 } },
+ { { 0037252,0125252,0125252,0125132 } }
+};
+static const uD B[] = {
+ { { 0142654,0044014,0077633,0035410 } },
+ { { 0144027,0110641,0125335,0144760 } },
+ { { 0144641,0165637,0142204,0047447 } },
+ { { 0145215,0162027,0146246,0155211 } },
+ { { 0145322,0026110,0010317,0110130 } },
+ { { 0145120,0061472,0120300,0025363 } }
+};
+static const uD C[] = {
+ { { 0142257,0164150,0163630,0112622 } },
+ { { 0143605,0050153,0156116,0135272 } },
+ { { 0144527,0056045,0145642,0062332 } },
+ { { 0145213,0012063,0106250,0001025 } },
+ { { 0145432,0111254,0044577,0115142 } },
+ { { 0145366,0071133,0050217,0005122 } }
+};
+/* log( sqrt( 2*pi ) ) */
+static const uD LS2P[] = { {040153,037616,041445,0172645,} };
+#define LS2PI LS2P[0].d
+#define MAXLGM 2.035093e36
+static const uD LPI[] = { { 0040222,0103202,0043475,0006750, } };
+#define LOGPI LPI[0].d
+
+#endif
+
+#ifdef IBMPC
+static const uD A[] = {
+ { { 0x6661,0x2733,0x9850,0x3f4a } },
+ { { 0xe943,0xb580,0x7fbd,0xbf43 } },
+ { { 0x5ebb,0x20dc,0x019f,0x3f4a } },
+ { { 0xa5a1,0x16b0,0xc16c,0xbf66 } },
+ { { 0x554b,0x5555,0x5555,0x3fb5 } }
+};
+static const uD B[] = {
+ { { 0x6761,0x8ff3,0x8901,0xc095 } },
+ { { 0xb93e,0x355b,0xf234,0xc0e2 } },
+ { { 0x89e5,0xf890,0x3d73,0xc114 } },
+ { { 0xdb51,0xf994,0xbc82,0xc131 } },
+ { { 0xf20b,0x0219,0x4589,0xc13a } },
+ { { 0x055e,0x5418,0x0c67,0xc12a } }
+};
+static const uD C[] = {
+ { { 0x12b2,0x1cf3,0xfd0d,0xc075 } },
+ { { 0xd757,0x7b89,0xaa0d,0xc0d0 } },
+ { { 0x4c9b,0xb974,0xeb84,0xc10a } },
+ { { 0x0043,0x7195,0x6286,0xc131 } },
+ { { 0xf34c,0x892f,0x5255,0xc143 } },
+ { { 0xe14a,0x6a11,0xce4b,0xc13e } }
+};
+/* log( sqrt( 2*pi ) ) */
+static const union
+{
+ unsigned short s[4];
+ double d;
+} ls2p = {{0xbeb5,0xc864,0x67f1,0x3fed}};
+#define LS2PI (ls2p.d)
+#define MAXLGM 2.556348e305
+/* log (pi) */
+static const union
+{
+ unsigned short s[4];
+ double d;
+} lpi = {{0xa1bd,0x48e7,0x50d0,0x3ff2}};
+#define LOGPI (lpi.d)
+#endif
+
+#ifdef MIEEE
+static const uD A[] = {
+ { { 0x3f4a,0x9850,0x2733,0x6661 } },
+ { { 0xbf43,0x7fbd,0xb580,0xe943 } },
+ { { 0x3f4a,0x019f,0x20dc,0x5ebb } },
+ { { 0xbf66,0xc16c,0x16b0,0xa5a1 } },
+ { { 0x3fb5,0x5555,0x5555,0x554b } }
+};
+static const uD B[] = {
+ { { 0xc095,0x8901,0x8ff3,0x6761 } },
+ { { 0xc0e2,0xf234,0x355b,0xb93e } },
+ { { 0xc114,0x3d73,0xf890,0x89e5 } },
+ { { 0xc131,0xbc82,0xf994,0xdb51 } },
+ { { 0xc13a,0x4589,0x0219,0xf20b } },
+ { { 0xc12a,0x0c67,0x5418,0x055e } }
+};
+static const uD C[] = {
+ { { 0xc075,0xfd0d,0x1cf3,0x12b2 } },
+ { { 0xc0d0,0xaa0d,0x7b89,0xd757 } },
+ { { 0xc10a,0xeb84,0xb974,0x4c9b } },
+ { { 0xc131,0x6286,0x7195,0x0043 } },
+ { { 0xc143,0x5255,0x892f,0xf34c } },
+ { { 0xc13e,0xce4b,0x6a11,0xe14a } }
+};
+/* log( sqrt( 2*pi ) ) */
+static const union
+{
+ unsigned short s[4];
+ double d;
+} ls2p = {{0x3fed,0x67f1,0xc864,0xbeb5}};
+#define LS2PI ls2p.d
+#define MAXLGM 2.556348e305
+/* log (pi) */
+static const union
+{
+ unsigned short s[4];
+ double d;
+} lpi = {{0x3ff2, 0x50d0, 0x48e7, 0xa1bd}};
+#define LOGPI (lpi.d)
+#endif
+
+
+/* Logarithm of gamma function */
+/* Reentrant version */
+double __lgamma_r(double x, int* sgngam);
+
+double __lgamma_r(double x, int* sgngam)
+{
+ double p, q, u, w, z;
+ int i;
+
+ *sgngam = 1;
+#ifdef NANS
+ if (isnan(x))
+ return (x);
+#endif
+
+#ifdef INFINITIES
+ if (!isfinite(x))
+ return (INFINITY);
+#endif
+
+ if (x < -34.0)
+ {
+ q = -x;
+ w = __lgamma_r(q, sgngam); /* note this modifies sgngam! */
+ p = floor(q);
+ if (p == q)
+ {
+lgsing:
+ _SET_ERRNO(EDOM);
+ mtherr( "lgam", SING );
+#ifdef INFINITIES
+ return (INFINITY);
+#else
+ return (MAXNUM);
+#endif
+ }
+ i = p;
+ if ((i & 1) == 0)
+ *sgngam = -1;
+ else
+ *sgngam = 1;
+ z = q - p;
+ if (z > 0.5)
+ {
+ p += 1.0;
+ z = p - q;
+ }
+ z = q * sin( PI * z );
+ if (z == 0.0)
+ goto lgsing;
+ /* z = log(PI) - log( z ) - w;*/
+ z = LOGPI - log( z ) - w;
+ return (z);
+ }
+
+ if (x < 13.0)
+ {
+ z = 1.0;
+ p = 0.0;
+ u = x;
+ while (u >= 3.0)
+ {
+ p -= 1.0;
+ u = x + p;
+ z *= u;
+ }
+ while (u < 2.0)
+ {
+ if (u == 0.0)
+ goto lgsing;
+ z /= u;
+ p += 1.0;
+ u = x + p;
+ }
+ if (z < 0.0)
+ {
+ *sgngam = -1;
+ z = -z;
+ }
+ else
+ *sgngam = 1;
+ if (u == 2.0)
+ return ( log(z) );
+ p -= 2.0;
+ x = x + p;
+ p = x * polevl(x, B, 5) / p1evl(x, C, 6);
+ return ( log(z) + p );
+ }
+
+ if (x > MAXLGM)
+ {
+ _SET_ERRNO(ERANGE);
+ mtherr("lgamma", OVERFLOW);
+#ifdef INFINITIES
+ return (*sgngam * INFINITY);
+#else
+ return (*sgngam * MAXNUM);
+#endif
+ }
+
+ q = (x - 0.5) * log(x) - x + LS2PI;
+ if (x > 1.0e8)
+ return (q);
+
+ p = 1.0/(x*x);
+ if (x >= 1000.0)
+ q += (( 7.9365079365079365079365e-4 * p
+ - 2.7777777777777777777778e-3) *p
+ + 0.0833333333333333333333) / x;
+ else
+ q += polevl( p, A, 4 ) / x;
+ return (q);
+}
+
+/* This is the C99 version */
+double lgamma(double x)
+{
+ return (__lgamma_r(x, &signgam));
+}
+
libc/mingw/math/lgammaf.c
@@ -0,0 +1,187 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/* log gamma(x+2), -.5 < x < .5 */
+static const float B[] = {
+ 6.055172732649237E-004,
+ -1.311620815545743E-003,
+ 2.863437556468661E-003,
+ -7.366775108654962E-003,
+ 2.058355474821512E-002,
+ -6.735323259371034E-002,
+ 3.224669577325661E-001,
+ 4.227843421859038E-001
+};
+
+/* log gamma(x+1), -.25 < x < .25 */
+static const float C[] = {
+ 1.369488127325832E-001,
+ -1.590086327657347E-001,
+ 1.692415923504637E-001,
+ -2.067882815621965E-001,
+ 2.705806208275915E-001,
+ -4.006931650563372E-001,
+ 8.224670749082976E-001,
+ -5.772156501719101E-001
+};
+
+/* log( sqrt( 2*pi ) ) */
+static const float LS2PI = 0.91893853320467274178;
+#define MAXLGM 2.035093e36
+static const float PIINV = 0.318309886183790671538;
+
+#include "cephes_mconf.h"
+
+/* Reentrant version */
+/* Logarithm of gamma function */
+float __lgammaf_r(float x, int* sgngamf);
+
+float __lgammaf_r(float x, int* sgngamf)
+{
+ float p, q, w, z;
+ float nx, tx;
+ int i, direction;
+
+ *sgngamf = 1;
+#ifdef NANS
+ if (isnan(x))
+ return (x);
+#endif
+
+#ifdef INFINITIES
+ if (!isfinite(x))
+ return (x);
+#endif
+
+ if (x < 0.0)
+ {
+ q = -x;
+ w = __lgammaf_r(q, sgngamf); /* note this modifies sgngam! */
+ p = floorf(q);
+ if (p == q)
+ {
+lgsing:
+ _SET_ERRNO(EDOM);
+ mtherr("lgamf", SING);
+#ifdef INFINITIES
+ return (INFINITYF);
+#else
+ return( *sgngamf * MAXNUMF );
+#endif
+ }
+ i = p;
+ if ((i & 1) == 0)
+ *sgngamf = -1;
+ else
+ *sgngamf = 1;
+ z = q - p;
+ if (z > 0.5)
+ {
+ p += 1.0;
+ z = p - q;
+ }
+ z = q * sinf(PIF * z);
+ if (z == 0.0)
+ goto lgsing;
+ z = -logf(PIINV * z) - w;
+ return (z);
+ }
+
+ if (x < 6.5)
+ {
+ direction = 0;
+ z = 1.0;
+ tx = x;
+ nx = 0.0;
+ if (x >= 1.5)
+ {
+ while (tx > 2.5)
+ {
+ nx -= 1.0;
+ tx = x + nx;
+ z *=tx;
+ }
+ x += nx - 2.0;
+iv1r5:
+ p = x * polevlf( x, B, 7 );
+ goto cont;
+ }
+ if (x >= 1.25)
+ {
+ z *= x;
+ x -= 1.0; /* x + 1 - 2 */
+ direction = 1;
+ goto iv1r5;
+ }
+ if (x >= 0.75)
+ {
+ x -= 1.0;
+ p = x * polevlf( x, C, 7 );
+ q = 0.0;
+ goto contz;
+ }
+ while (tx < 1.5)
+ {
+ if (tx == 0.0)
+ goto lgsing;
+ z *=tx;
+ nx += 1.0;
+ tx = x + nx;
+ }
+ direction = 1;
+ x += nx - 2.0;
+ p = x * polevlf(x, B, 7);
+
+cont:
+ if (z < 0.0)
+ {
+ *sgngamf = -1;
+ z = -z;
+ }
+ else
+ {
+ *sgngamf = 1;
+ }
+ q = logf(z);
+ if (direction)
+ q = -q;
+contz:
+ return( p + q );
+ }
+
+ if (x > MAXLGM)
+ {
+ _SET_ERRNO(ERANGE);
+ mtherr("lgamf", OVERFLOW);
+#ifdef INFINITIES
+ return (*sgngamf * INFINITYF);
+#else
+ return (*sgngamf * MAXNUMF);
+#endif
+
+ }
+
+/* Note, though an asymptotic formula could be used for x >= 3,
+ * there is cancellation error in the following if x < 6.5. */
+ q = LS2PI - x;
+ q += (x - 0.5) * logf(x);
+
+ if (x <= 1.0e4)
+ {
+ z = 1.0/x;
+ p = z * z;
+ q += (( 6.789774945028216E-004 * p
+ - 2.769887652139868E-003 ) * p
+ + 8.333316229807355E-002 ) * z;
+ }
+ return (q);
+}
+
+/* This is the C99 version */
+float lgammaf(float x)
+{
+ return (__lgammaf_r(x, &signgam));
+}
+
libc/mingw/math/lgammal.c
@@ -0,0 +1,337 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "cephes_mconf.h"
+
+#if UNK
+static uLD S[9] = {
+ { { -1.193945051381510095614E-3L } },
+ { { 7.220599478036909672331E-3L } },
+ { { -9.622023360406271645744E-3L } },
+ { { -4.219773360705915470089E-2L } },
+ { { 1.665386113720805206758E-1L } },
+ { { -4.200263503403344054473E-2L } },
+ { { -6.558780715202540684668E-1L } },
+ { { 5.772156649015328608253E-1L } },
+ { { 1.000000000000000000000E0L } }
+};
+#endif
+#if IBMPC
+static const uLD S[] = {
+ { { 0xbaeb,0xd6d3,0x25e5,0x9c7e,0xbff5, 0, 0, 0 } },
+ { { 0xfe9a,0xceb4,0xc74e,0xec9a,0x3ff7, 0, 0, 0 } },
+ { { 0x9225,0xdfef,0xb0e9,0x9da5,0xbff8, 0, 0, 0 } },
+ { { 0x10b0,0xec17,0x87dc,0xacd7,0xbffa, 0, 0, 0 } },
+ { { 0x6b8d,0x7515,0x1905,0xaa89,0x3ffc, 0, 0, 0 } },
+ { { 0xf183,0x126b,0xf47d,0xac0a,0xbffa, 0, 0, 0 } },
+ { { 0x7bf6,0x57d1,0xa013,0xa7e7,0xbffe, 0, 0, 0 } },
+ { { 0xc7a9,0x7db0,0x67e3,0x93c4,0x3ffe, 0, 0, 0 } },
+ { { 0x0000,0x0000,0x0000,0x8000,0x3fff, 0, 0, 0 } }
+};
+#endif
+#if MIEEE
+static uLD S[27] = {
+ { { 0xbff50000,0x9c7e25e5,0xd6d3baeb, 0 } },
+ { { 0x3ff70000,0xec9ac74e,0xceb4fe9a, 0 } },
+ { { 0xbff80000,0x9da5b0e9,0xdfef9225, 0 } },
+ { { 0xbffa0000,0xacd787dc,0xec1710b0, 0 } },
+ { { 0x3ffc0000,0xaa891905,0x75156b8d, 0 } },
+ { { 0xbffa0000,0xac0af47d,0x126bf183, 0 } },
+ { { 0xbffe0000,0xa7e7a013,0x57d17bf6, 0 } },
+ { { 0x3ffe0000,0x93c467e3,0x7db0c7a9, 0 } },
+ { { 0x3fff0000,0x80000000,0x00000000, 0 } }
+};
+#endif
+
+#if UNK
+static uLD SN[9] = {
+ { { 1.133374167243894382010E-3L } },
+ { { 7.220837261893170325704E-3L } },
+ { { 9.621911155035976733706E-3L } },
+ { { -4.219773343731191721664E-2L } },
+ { { -1.665386113944413519335E-1L } },
+ { { -4.200263503402112910504E-2L } },
+ { { 6.558780715202536547116E-1L } },
+ { { 5.772156649015328608727E-1L } },
+ { { -1.000000000000000000000E0L } }
+};
+#endif
+#if IBMPC
+static const uLD SN[] = {
+ { { 0x5dd1,0x02de,0xb9f7,0x948d,0x3ff5, 0, 0, 0 } },
+ { { 0x989b,0xdd68,0xc5f1,0xec9c,0x3ff7, 0, 0, 0 } },
+ { { 0x2ca1,0x18f0,0x386f,0x9da5,0x3ff8, 0, 0, 0 } },
+ { { 0x783f,0x41dd,0x87d1,0xacd7,0xbffa, 0, 0, 0 } },
+ { { 0x7a5b,0xd76d,0x1905,0xaa89,0xbffc, 0, 0, 0 } },
+ { { 0x7f64,0x1234,0xf47d,0xac0a,0xbffa, 0, 0, 0 } },
+ { { 0x5e26,0x57d1,0xa013,0xa7e7,0x3ffe, 0, 0, 0 } },
+ { { 0xc7aa,0x7db0,0x67e3,0x93c4,0x3ffe, 0, 0, 0 } },
+ { { 0x0000,0x0000,0x0000,0x8000,0xbfff, 0, 0, 0 } }
+};
+#endif
+#if MIEEE
+static uLD SN[] = {
+ { { 0x3ff50000,0x948db9f7,0x02de5dd1, 0 } },
+ { { 0x3ff70000,0xec9cc5f1,0xdd68989b, 0 } },
+ { { 0x3ff80000,0x9da5386f,0x18f02ca1, 0 } },
+ { { 0xbffa0000,0xacd787d1,0x41dd783f, 0 } },
+ { { 0xbffc0000,0xaa891905,0xd76d7a5b, 0 } },
+ { { 0xbffa0000,0xac0af47d,0x12347f64, 0 } },
+ { { 0x3ffe0000,0xa7e7a013,0x57d15e26, 0 } },
+ { { 0x3ffe0000,0x93c467e3,0x7db0c7aa, 0 } },
+ { { 0xbfff0000,0x80000000,0x00000000, 0 } }
+};
+#endif
+
+
+/* A[]: Stirling's formula expansion of log gamma
+ * B[], C[]: log gamma function between 2 and 3
+ */
+
+
+/* log gamma(x) = ( x - 0.5 ) * log(x) - x + LS2PI + 1/x A(1/x^2)
+ * x >= 8
+ * Peak relative error 1.51e-21
+ * Relative spread of error peaks 5.67e-21
+ */
+#if UNK
+static uLD A[7] = {
+ { { 4.885026142432270781165E-3L } },
+ { { -1.880801938119376907179E-3L } },
+ { { 8.412723297322498080632E-4L } },
+ { { -5.952345851765688514613E-4L } },
+ { { 7.936507795855070755671E-4L } },
+ { { -2.777777777750349603440E-3L } },
+ { { 8.333333333333331447505E-2L } }
+};
+#endif
+#if IBMPC
+static const uLD A[] = {
+ { { 0xd984,0xcc08,0x91c2,0xa012,0x3ff7, 0, 0, 0 } },
+ { { 0x3d91,0x0304,0x3da1,0xf685,0xbff5, 0, 0, 0 } },
+ { { 0x3bdc,0xaad1,0xd492,0xdc88,0x3ff4, 0, 0, 0 } },
+ { { 0x8b20,0x9fce,0x844e,0x9c09,0xbff4, 0, 0, 0 } },
+ { { 0xf8f2,0x30e5,0x0092,0xd00d,0x3ff4, 0, 0, 0 } },
+ { { 0x4d88,0x03a8,0x60b6,0xb60b,0xbff6, 0, 0, 0 } },
+ { { 0x9fcc,0xaaaa,0xaaaa,0xaaaa,0x3ffb, 0, 0, 0 } }
+};
+#endif
+#if MIEEE
+static uLD A[] = {
+ { { 0x3ff70000,0xa01291c2,0xcc08d984, 0 } },
+ { { 0xbff50000,0xf6853da1,0x03043d91, 0 } },
+ { { 0x3ff40000,0xdc88d492,0xaad13bdc, 0 } },
+ { { 0xbff40000,0x9c09844e,0x9fce8b20, 0 } },
+ { { 0x3ff40000,0xd00d0092,0x30e5f8f2, 0 } },
+ { { 0xbff60000,0xb60b60b6,0x03a84d88, 0 } },
+ { { 0x3ffb0000,0xaaaaaaaa,0xaaaa9fcc, 0 } }
+};
+#endif
+
+/* log gamma(x+2) = x B(x)/C(x)
+ * 0 <= x <= 1
+ * Peak relative error 7.16e-22
+ * Relative spread of error peaks 4.78e-20
+ */
+#if UNK
+static uLD B[7] = {
+ { { -2.163690827643812857640E3L } },
+ { { -8.723871522843511459790E4L } },
+ { { -1.104326814691464261197E6L } },
+ { { -6.111225012005214299996E6L } },
+ { { -1.625568062543700591014E7L } },
+ { { -2.003937418103815175475E7L } },
+ { { -8.875666783650703802159E6L } }
+};
+static uLD C[7] = {
+ { { -5.139481484435370143617E2L } },
+ { { -3.403570840534304670537E4L } },
+ { { -6.227441164066219501697E5L } },
+ { { -4.814940379411882186630E6L } },
+ { { -1.785433287045078156959E7L } },
+ { { -3.138646407656182662088E7L } },
+ { { -2.099336717757895876142E7L } }
+};
+#endif
+#if IBMPC
+static const uLD B[] = {
+ { { 0x9557,0x4995,0x0da1,0x873b,0xc00a, 0, 0, 0 } },
+ { { 0xfe44,0x9af8,0x5b8c,0xaa63,0xc00f, 0, 0, 0 } },
+ { { 0x5aa8,0x7cf5,0x3684,0x86ce,0xc013, 0, 0, 0 } },
+ { { 0x259a,0x258c,0xf206,0xba7f,0xc015, 0, 0, 0 } },
+ { { 0xbe18,0x1ca3,0xc0a0,0xf80a,0xc016, 0, 0, 0 } },
+ { { 0x168f,0x2c42,0x6717,0x98e3,0xc017, 0, 0, 0 } },
+ { { 0x2051,0x9d55,0x92c8,0x876e,0xc016, 0, 0, 0 } }
+};
+static const uLD C[] = {
+ { { 0xaa77,0xcf2f,0xae76,0x807c,0xc008, 0, 0, 0 } },
+ { { 0xb280,0x0d74,0xb55a,0x84f3,0xc00e, 0, 0, 0 } },
+ { { 0xa505,0xcd30,0x81dc,0x9809,0xc012, 0, 0, 0 } },
+ { { 0x3369,0x4246,0xb8c2,0x92f0,0xc015, 0, 0, 0 } },
+ { { 0x63cf,0x6aee,0xbe6f,0x8837,0xc017, 0, 0, 0 } },
+ { { 0x26bb,0xccc7,0xb009,0xef75,0xc017, 0, 0, 0 } },
+ { { 0x462b,0xbae8,0xab96,0xa02a,0xc017, 0, 0, 0 } }
+};
+#endif
+#if MIEEE
+static uLD B[] = {
+ { { 0xc00a0000,0x873b0da1,0x49959557, 0 } },
+ { { 0xc00f0000,0xaa635b8c,0x9af8fe44, 0 } },
+ { { 0xc0130000,0x86ce3684,0x7cf55aa8, 0 } },
+ { { 0xc0150000,0xba7ff206,0x258c259a, 0 } },
+ { { 0xc0160000,0xf80ac0a0,0x1ca3be18, 0 } },
+ { { 0xc0170000,0x98e36717,0x2c42168f, 0 } },
+ { { 0xc0160000,0x876e92c8,0x9d552051, 0 } }
+};
+static uLD C[] = {
+ { { 0xc0080000,0x807cae76,0xcf2faa77, 0 } },
+ { { 0xc00e0000,0x84f3b55a,0x0d74b280, 0 } },
+ { { 0xc0120000,0x980981dc,0xcd30a505, 0 } },
+ { { 0xc0150000,0x92f0b8c2,0x42463369, 0 } },
+ { { 0xc0170000,0x8837be6f,0x6aee63cf, 0 } },
+ { { 0xc0170000,0xef75b009,0xccc726bb, 0 } },
+ { { 0xc0170000,0xa02aab96,0xbae8462b, 0 } }
+};
+#endif
+
+/* log( sqrt( 2*pi ) ) */
+static const long double LS2PI = 0.91893853320467274178L;
+#if defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
+#define MAXLGM 2.035093e36
+#else
+#define MAXLGM 1.04848146839019521116e+4928L
+#endif /* defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_) */
+
+/* Logarithm of gamma function */
+/* Reentrant version */
+long double __lgammal_r(long double x, int* sgngaml);
+
+long double __lgammal_r(long double x, int* sgngaml)
+{
+ long double p, q, w, z, f, nx;
+ int i;
+
+ *sgngaml = 1;
+#ifdef NANS
+ if (isnanl(x))
+ return(NANL);
+#endif
+#ifdef INFINITIES
+ if (!isfinitel(x))
+ return (INFINITYL);
+#endif
+ if (x < -34.0L)
+ {
+ q = -x;
+ w = __lgammal_r(q, sgngaml); /* note this modifies sgngam! */
+ p = floorl(q);
+ if (p == q)
+ {
+lgsing:
+ _SET_ERRNO(EDOM);
+ mtherr( "lgammal", SING );
+#ifdef INFINITIES
+ return (INFINITYL);
+#else
+ return (MAXNUML);
+#endif
+ }
+ i = p;
+ if ((i & 1) == 0)
+ *sgngaml = -1;
+ else
+ *sgngaml = 1;
+ z = q - p;
+ if (z > 0.5L)
+ {
+ p += 1.0L;
+ z = p - q;
+ }
+ z = q * sinl(PIL * z);
+ if (z == 0.0L)
+ goto lgsing;
+ /* z = LOGPI - logl( z ) - w; */
+ z = logl(PIL/z) - w;
+ return (z);
+ }
+
+ if (x < 13.0L)
+ {
+ z = 1.0L;
+ nx = floorl(x + 0.5L);
+ f = x - nx;
+ while (x >= 3.0L)
+ {
+ nx -= 1.0L;
+ x = nx + f;
+ z *= x;
+ }
+ while (x < 2.0L)
+ {
+ if (fabsl(x) <= 0.03125)
+ goto lsmall;
+ z /= nx + f;
+ nx += 1.0L;
+ x = nx + f;
+ }
+ if (z < 0.0L)
+ {
+ *sgngaml = -1;
+ z = -z;
+ }
+ else
+ *sgngaml = 1;
+ if (x == 2.0L)
+ return ( logl(z) );
+ x = (nx - 2.0L) + f;
+ p = x * polevll(x, B, 6) / p1evll(x, C, 7);
+ return ( logl(z) + p );
+ }
+
+ if (x > MAXLGM)
+ {
+ _SET_ERRNO(ERANGE);
+ mtherr("lgammal", OVERFLOW);
+#ifdef INFINITIES
+ return (*sgngaml * INFINITYL);
+#else
+ return (*sgngaml * MAXNUML);
+#endif
+ }
+
+ q = (x - 0.5L) * logl(x) - x + LS2PI;
+ if (x > 1.0e10L)
+ return(q);
+ p = 1.0L/(x*x);
+ q += polevll(p, A, 6) / x;
+ return (q);
+
+lsmall:
+ if (x == 0.0L)
+ goto lgsing;
+ if (x < 0.0L)
+ {
+ x = -x;
+ q = z / (x * polevll(x, SN, 8));
+ }
+ else
+ q = z / (x * polevll(x, S, 8));
+ if (q < 0.0L)
+ {
+ *sgngaml = -1;
+ q = -q;
+ }
+ else
+ *sgngaml = 1;
+ q = logl(q);
+ return (q);
+}
+
+/* This is the C99 version */
+long double lgammal(long double x)
+{
+ return (__lgammal_r (x, &signgam));
+}
+
libc/mingw/math/llrint.c
@@ -0,0 +1,27 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <fenv.h>
+
+long long llrint (double x)
+{
+ long long retval = 0ll;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+ __asm__ __volatile__ ("fistpll %0" : "=m" (retval) : "t" (x) : "st");
+#else
+ int mode = fegetround();
+ if (mode == FE_DOWNWARD)
+ retval = (long long)floor(x);
+ else if (mode == FE_UPWARD)
+ retval = (long long)ceil(x);
+ else if (mode == FE_TOWARDZERO)
+ retval = x >= 0 ? (long long)floor(x) : (long long)ceil(x);
+ else
+ retval = x >= 0 ? (long long)floor(x + 0.5) : (long long)ceil(x - 0.5);
+#endif
+ return retval;
+}
+
libc/mingw/math/llrintf.c
@@ -0,0 +1,26 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <fenv.h>
+
+long long llrintf (float x)
+{
+ long long retval = 0ll;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+ __asm__ __volatile__ ("fistpll %0" : "=m" (retval) : "t" (x) : "st");
+#else
+ int mode = fegetround();
+ if (mode == FE_DOWNWARD)
+ retval = (long long)floorf(x);
+ else if (mode == FE_UPWARD)
+ retval = (long long)ceilf(x);
+ else if (mode == FE_TOWARDZERO)
+ retval = x >= 0 ? (long long)floorf(x) : (long long)ceilf(x);
+ else
+ retval = x >= 0 ? (long long)floorf(x + 0.5) : (long long)ceilf(x - 0.5);
+#endif
+ return retval;
+}
libc/mingw/math/llrintl.c
@@ -0,0 +1,27 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <fenv.h>
+
+long long llrintl (long double x)
+{
+ long long retval = 0ll;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+ __asm__ __volatile__ ("fistpll %0" : "=m" (retval) : "t" (x) : "st");
+#else
+ int mode = fegetround();
+ if (mode == FE_DOWNWARD)
+ retval = (long long)floor(x);
+ else if (mode == FE_UPWARD)
+ retval = (long long)ceil(x);
+ else if (mode == FE_TOWARDZERO)
+ retval = x >= 0 ? (long long)floor(x) : (long long)ceil(x);
+ else
+ retval = x >= 0 ? (long long)floor(x + 0.5) : (long long)ceil(x - 0.5);
+#endif
+ return retval;
+}
+
libc/mingw/math/llround.c
@@ -0,0 +1,38 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <limits.h>
+#include <errno.h>
+
+long long
+llround (double x)
+{
+ double res;
+
+ if (x >= 0.0)
+ {
+ res = ceil (x);
+ if (res - x > 0.5)
+ res -= 1.0;
+ }
+ else
+ {
+ res = ceil (-x);
+ if (res + x > 0.5)
+ res -= 1.0;
+ res = -res;
+ }
+ if (!isfinite (res)
+ || res > (double) LONG_LONG_MAX
+ || res < (double) LONG_LONG_MIN)
+ {
+ errno = ERANGE;
+ /* Undefined behaviour, so we could return anything. */
+ /* return res > 0.0 ? LONG_LONG_MAX : LONG_LONG_MIN; */
+ }
+ return (long long) res;
+}
+
libc/mingw/math/llroundf.c
@@ -0,0 +1,38 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <limits.h>
+#include <errno.h>
+
+long long
+llroundf (float x)
+{
+ float res;
+
+ if (x >= 0.0F)
+ {
+ res = ceilf (x);
+ if (res - x > 0.5F)
+ res -= 1.0F;
+ }
+ else
+ {
+ res = ceilf (-x);
+ if (res + x > 0.5F)
+ res -= 1.0F;
+ res = -res;
+ }
+ if (!isfinite (res)
+ || res > (float) LONG_LONG_MAX
+ || res < (float) LONG_LONG_MIN)
+ {
+ errno = ERANGE;
+ /* Undefined behaviour, so we could return anything. */
+ /* return res > 0.0F ? LONG_LONG_MAX : LONG_LONG_MIN; */
+ }
+ return (long long) res;
+}
+
libc/mingw/math/llroundl.c
@@ -0,0 +1,38 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <limits.h>
+#include <errno.h>
+
+long long
+llroundl (long double x)
+{
+ long double res;
+
+ if (x >= 0.0L)
+ {
+ res = ceill (x);
+ if (res - x > 0.5L)
+ res -= 1.0L;
+ }
+ else
+ {
+ res = ceill (-x);
+ if (res + x > 0.5L)
+ res -= 1.0L;
+ res = -res;
+ }
+ if (!isfinite (res)
+ || res > (double) LONG_LONG_MAX
+ || res < (double) LONG_LONG_MIN)
+ {
+ errno = ERANGE;
+ /* Undefined behaviour, so we could return anything. */
+ /* return res > 0.0 ? LONG_LONG_MAX : LONG_LONG_MIN; */
+ }
+ return (long long) res;
+}
+
libc/mingw/math/log10f.c
@@ -0,0 +1,11 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+float log10f(float _X)
+{
+ return ((float)log10((double)_X));
+}
libc/mingw/math/logf.c
@@ -0,0 +1,11 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+float logf(float _X)
+{
+ return ((float)log((double)_X));
+}
libc/mingw/math/lrint.c
@@ -0,0 +1,26 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long lrint (double x)
+{
+ long retval = 0L;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+ __asm__ __volatile__ ("fistpl %0" : "=m" (retval) : "t" (x) : "st");
+#elif defined(__arm__) || defined(_ARM_)
+ float temp;
+ __asm__ __volatile__ (
+ "vcvtr.s32.f64 %[tmp], %[src]\n\t"
+ "fmrs %[dst], %[tmp]\n\t"
+ : [dst] "=r" (retval), [tmp] "=t" (temp) : [src] "w" (x));
+#elif defined(__aarch64__) || defined(_ARM64_)
+ __asm__ __volatile__ (
+ "frintx %d1, %d1\n\t"
+ "fcvtzs %w0, %d1\n\t"
+ : "=r" (retval), "+w" (x));
+#endif
+ return retval;
+}
libc/mingw/math/lrintf.c
@@ -0,0 +1,25 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long lrintf (float x)
+{
+ long retval = 0l;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+ __asm__ __volatile__ ("fistpl %0" : "=m" (retval) : "t" (x) : "st");
+#elif defined(__arm__) || defined(_ARM_)
+ __asm__ __volatile__ (
+ "vcvtr.s32.f32 %[src], %[src]\n\t"
+ "fmrs %[dst], %[src]\n\t"
+ : [dst] "=r" (retval), [src] "+w" (x));
+#elif defined(__aarch64__) || defined(_ARM64_)
+ __asm__ __volatile__ (
+ "frintx %s1, %s1\n\t"
+ "fcvtzs %w0, %s1\n\t"
+ : "=r" (retval), "+w" (x));
+#endif
+ return retval;
+}
libc/mingw/math/lrintl.c
@@ -0,0 +1,18 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long lrintl (long double x)
+{
+ long retval = 0l;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+ __asm__ __volatile__ ("fistpl %0" : "=m" (retval) : "t" (x) : "st");
+#elif defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
+ retval = lrint(x);
+#endif
+ return retval;
+}
+
libc/mingw/math/lround.c
@@ -0,0 +1,37 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <limits.h>
+#include <errno.h>
+
+long
+lround (double x)
+{
+ double res;
+
+ if (x >= 0.0)
+ {
+ res = ceil (x);
+ if (res - x > 0.5)
+ res -= 1.0;
+ }
+ else
+ {
+ res = ceil (-x);
+ if (res + x > 0.5)
+ res -= 1.0;
+ res = -res;
+ }
+ if (!isfinite (res)
+ || res > (double) LONG_MAX
+ || res < (double) LONG_MIN)
+ {
+ errno = ERANGE;
+ /* Undefined behaviour, so we could return anything. */
+ /* return res > 0.0 ? LONG_MAX : LONG_MIN; */
+ }
+ return (long) res;
+}
libc/mingw/math/lroundf.c
@@ -0,0 +1,37 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <limits.h>
+#include <errno.h>
+
+long
+lroundf (float x)
+{
+ float res;
+
+ if (x >= 0.0F)
+ {
+ res = ceilf (x);
+ if (res - x > 0.5F)
+ res -= 1.0F;
+ }
+ else
+ {
+ res = ceilf (-x);
+ if (res + x > 0.5F)
+ res -= 1.0F;
+ res = -res;
+ }
+ if (!isfinite (res)
+ || res > (float) LONG_MAX
+ || res < (float) LONG_MIN)
+ {
+ errno = ERANGE;
+ /* Undefined behaviour, so we could return anything. */
+ /* return res > 0.0F ? LONG_MAX : LONG_MIN; */
+ }
+ return (long) res;
+}
libc/mingw/math/lroundl.c
@@ -0,0 +1,37 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+#include <limits.h>
+#include <errno.h>
+
+long
+lroundl (long double x)
+{
+ long double res;
+
+ if (x >= 0.0L)
+ {
+ res = ceill (x);
+ if (res - x > 0.5L)
+ res -= 1.0;
+ }
+ else
+ {
+ res = ceill (-x);
+ if (res + x > 0.5L)
+ res -= 1.0L;
+ res = -res;
+ }
+ if (!isfinite (res)
+ || res > (long double)LONG_MAX
+ || res < (long double)LONG_MIN)
+ {
+ errno = ERANGE;
+ /* Undefined behaviour, so we could return anything. */
+ /* return res > 0.0L ? LONG_MAX : LONG_MIN; */
+ }
+ return (long) res;
+}
libc/mingw/math/modf.c
@@ -0,0 +1,41 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <fenv.h>
+#include <math.h>
+#include <errno.h>
+
+double
+modf (double value, double* iptr)
+{
+ double int_part = 0.0;
+ /* truncate */
+#if defined(_AMD64_) || defined(__x86_64__)
+ asm volatile ("subq $8, %%rsp\n"
+ "fnstcw 4(%%rsp)\n"
+ "movzwl 4(%%rsp), %%eax\n"
+ "orb $12, %%ah\n"
+ "movw %%ax, (%%rsp)\n"
+ "fldcw (%%rsp)\n"
+ "frndint\n"
+ "fldcw 4(%%rsp)\n"
+ "addq $8, %%rsp\n" : "=t" (int_part) : "0" (value) : "eax"); /* round */
+#elif defined(_X86_) || defined(__i386__)
+ asm volatile ("push %%eax\n\tsubl $8, %%esp\n"
+ "fnstcw 4(%%esp)\n"
+ "movzwl 4(%%esp), %%eax\n"
+ "orb $12, %%ah\n"
+ "movw %%ax, (%%esp)\n"
+ "fldcw (%%esp)\n"
+ "frndint\n"
+ "fldcw 4(%%esp)\n"
+ "addl $8, %%esp\n\tpop %%eax\n" : "=t" (int_part) : "0" (value) : "eax"); /* round */
+#else
+ int_part = trunc(value);
+#endif
+ if (iptr)
+ *iptr = int_part;
+ return (isinf (value) ? 0.0 : value - int_part);
+}
libc/mingw/math/modff.c
@@ -0,0 +1,42 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <fenv.h>
+#include <math.h>
+#include <errno.h>
+
+float
+modff (float value, float* iptr)
+{
+ float int_part = 0.0F;
+ /* truncate */
+ /* truncate */
+#if defined(_AMD64_) || defined(__x86_64__)
+ asm volatile ("subq $8, %%rsp\n"
+ "fnstcw 4(%%rsp)\n"
+ "movzwl 4(%%rsp), %%eax\n"
+ "orb $12, %%ah\n"
+ "movw %%ax, (%%rsp)\n"
+ "fldcw (%%rsp)\n"
+ "frndint\n"
+ "fldcw 4(%%rsp)\n"
+ "addq $8, %%rsp\n" : "=t" (int_part) : "0" (value) : "eax"); /* round */
+#elif defined(_X86_) || defined(__i386__)
+ asm volatile ("push %%eax\n\tsubl $8, %%esp\n"
+ "fnstcw 4(%%esp)\n"
+ "movzwl 4(%%esp), %%eax\n"
+ "orb $12, %%ah\n"
+ "movw %%ax, (%%esp)\n"
+ "fldcw (%%esp)\n"
+ "frndint\n"
+ "fldcw 4(%%esp)\n"
+ "addl $8, %%esp\n\tpop %%eax\n" : "=t" (int_part) : "0" (value) : "eax"); /* round */
+#else
+ int_part = truncf(value);
+#endif
+ if (iptr)
+ *iptr = int_part;
+ return (isinf (value) ? 0.0F : value - int_part);
+}
libc/mingw/math/modfl.c
@@ -0,0 +1,41 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <fenv.h>
+#include <math.h>
+#include <errno.h>
+
+long double
+modfl (long double value, long double* iptr)
+{
+ long double int_part = 0.0L;
+ /* truncate */
+#if defined(_AMD64_) || defined(__x86_64__)
+ asm volatile ("subq $8, %%rsp\n"
+ "fnstcw 4(%%rsp)\n"
+ "movzwl 4(%%rsp), %%eax\n"
+ "orb $12, %%ah\n"
+ "movw %%ax, (%%rsp)\n"
+ "fldcw (%%rsp)\n"
+ "frndint\n"
+ "fldcw 4(%%rsp)\n"
+ "addq $8, %%rsp\n" : "=t" (int_part) : "0" (value) : "eax"); /* round */
+#elif defined(_X86_) || defined(__i386__)
+ asm volatile ("push %%eax\n\tsubl $8, %%esp\n"
+ "fnstcw 4(%%esp)\n"
+ "movzwl 4(%%esp), %%eax\n"
+ "orb $12, %%ah\n"
+ "movw %%ax, (%%esp)\n"
+ "fldcw (%%esp)\n"
+ "frndint\n"
+ "fldcw 4(%%esp)\n"
+ "addl $8, %%esp\n\tpop %%eax\n" : "=t" (int_part) : "0" (value) : "eax"); /* round */
+#else
+ int_part = truncl(value);
+#endif
+ if (iptr)
+ *iptr = int_part;
+ return (isinf (value) ? 0.0L : value - int_part);
+}
libc/mingw/math/nextafterf.c
@@ -0,0 +1,32 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+float
+nextafterf (float x, float y)
+{
+ union
+ {
+ float f;
+ unsigned int i;
+ } u;
+ if (isnan (y) || isnan (x))
+ return x + y;
+ if (x == y )
+ /* nextafter (0.0, -O.0) should return -0.0. */
+ return y;
+ u.f = x;
+ if (x == 0.0F)
+ {
+ u.i = 1;
+ return y > 0.0F ? u.f : -u.f;
+ }
+ if (((x > 0.0F) ^ (y > x)) == 0)
+ u.i++;
+ else
+ u.i--;
+ return u.f;
+}
libc/mingw/math/nextafterl.c
@@ -0,0 +1,71 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ nextafterl.c
+ Contributed by Danny Smith <dannysmith@users.sourceforge.net>
+ No copyright claimed, absolutely no warranties.
+
+ 2005-05-09
+*/
+
+#include <math.h>
+
+long double
+nextafterl (long double x, long double y)
+{
+ union {
+ long double ld;
+ struct {
+ /* packed attribute is unnecessary on x86/x64 for these three variables */
+ unsigned long long mantissa;
+ unsigned short expn;
+ unsigned short pad;
+ } parts;
+ } u;
+
+ /* The normal bit is explicit for long doubles, unlike
+ float and double. */
+ static const unsigned long long normal_bit = 0x8000000000000000ull;
+ u.ld = 0.0L;
+ if (isnan (y) || isnan (x))
+ return x + y;
+
+ if (x == y )
+ /* nextafter (0.0, -O.0) should return -0.0. */
+ return y;
+
+ u.ld = x;
+ if (x == 0.0L)
+ {
+ u.parts.mantissa = 1ull;
+ return y > 0.0L ? u.ld : -u.ld;
+ }
+
+ if (((x > 0.0L) ^ (y > x)) == 0)
+ {
+ u.parts.mantissa++;
+ if ((u.parts.mantissa & ~normal_bit) == 0ull)
+ u.parts.expn++;
+ }
+ else
+ {
+ if ((u.parts.mantissa & ~normal_bit) == 0ull)
+ u.parts.expn--;
+ u.parts.mantissa--;
+ }
+
+ /* If we have updated the expn of a normal number,
+ or moved from denormal to normal, [re]set the normal bit. */
+ if (u.parts.expn & 0x7fff)
+ u.parts.mantissa |= normal_bit;
+
+ return u.ld;
+}
+
+/* nexttowardl is the same function with a different name. */
+long double
+nexttowardl (long double, long double) __attribute__ ((alias("nextafterl")));
+
libc/mingw/math/nexttoward.c
@@ -0,0 +1,47 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ nexttoward.c
+ Contributed by Danny Smith <dannysmith@users.sourceforge.net>
+ No copyright claimed, absolutely no warranties.
+
+ 2005-05-10
+*/
+
+#include <math.h>
+
+double
+nexttoward (double x, long double y)
+{
+ union
+ {
+ double d;
+ unsigned long long ll;
+ } u;
+
+ long double xx = x;
+
+ if (isnan (y) || isnan (x))
+ return x + y;
+
+ if (xx == y)
+ /* nextafter (0.0, -O.0) should return -0.0. */
+ return y;
+ u.d = x;
+ if (x == 0.0)
+ {
+ u.ll = 1;
+ return y > 0.0L ? u.d : -u.d;
+ }
+
+ /* Non-extended encodings are lexicographically ordered,
+ with implicit "normal" bit. */
+ if (((x > 0.0) ^ (y > xx)) == 0)
+ u.ll++;
+ else
+ u.ll--;
+ return u.d;
+}
libc/mingw/math/nexttowardf.c
@@ -0,0 +1,43 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ nexttowardf.c
+ Contributed by Danny Smith <dannysmith@users.sourceforge.net>
+ No copyright claimed, absolutely no warranties.
+
+ 2005-05-10
+*/
+
+#include <math.h>
+
+float
+nexttowardf (float x, long double y)
+{
+ union
+ {
+ float f;
+ unsigned int i;
+ } u;
+
+ long double xx = x;
+
+ if (isnan (y) || isnan (x))
+ return x + y;
+ if (xx == y )
+ /* nextafter (0.0, -O.0) should return -0.0. */
+ return y;
+ u.f = x;
+ if (x == 0.0F)
+ {
+ u.i = 1;
+ return y > 0.0L ? u.f : -u.f;
+ }
+ if (((x > 0.0F) ^ (y > xx)) == 0)
+ u.i++;
+ else
+ u.i--;
+ return u.f;
+}
libc/mingw/math/powf.c
@@ -0,0 +1,10 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+float powf (float x, float y)
+{
+ return (float) pow ((double) x, (double) y);
+}
libc/mingw/math/powi.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_DOUBLE 1
+#include "powi.def.h"
libc/mingw/math/powi.def.h
@@ -0,0 +1,153 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+/* IEEE 754 - Elementary Functions - Special Cases
+ * powi (x, +/-0) is 1 for any x (even a zero, quiet NaN, or infinity)
+ * powi (+1, y) is 1 for any y (even a quiet NaN)
+ * powi (+/-0, y) is +/-oo and signals the divideByZero exception for y an odd integer < 0
+ * powi (+/-0, y) is +oo and signals the divideByZero exception for finite y < 0 and not an odd integer
+ * powi (+/-0, y) is +/-0 for finite y > 0 an odd integer
+ * powi (+/-0, y) is +0 for finite y > 0 and not an odd integer
+ powi (-inf, y) = +0 for y<0 and not an odd integer
+ powi (-inf, y) = -inf for y an odd integer > 0
+ powi (-inf, y) = +inf for y>0 and not an odd integer
+ powi (+/-inf, y) is +/-0 with no exception for y an odd integer < 0
+ powi (+/-inf, y) is +0 with no exception for finite y < 0 and not an odd integer
+ powi (+/-inf, y) is +/-inf with no exception for finite y > 0 an odd integer
+ powi (+/-inf, y) is +inf with no exception for finite y > 0 and not an odd integer
+ powi (x, y) signals the invalid operation exception for finite x < 0 and finite non-integer y.
+
+ For x /= 0: lim y->oo (1/x)^y results as: for |x| < 1 that sgn(x)*0 and for |x| > 0 that sgn(x)*Infinity
+
+*/
+#include "../complex/complex_internal.h"
+#include <errno.h>
+#include <limits.h>
+#include <fenv.h>
+#include <math.h>
+#include <errno.h>
+
+__FLT_TYPE __cdecl
+__FLT_ABI(__powi) (__FLT_TYPE x, int y);
+
+__FLT_TYPE __cdecl
+__FLT_ABI(__powi) (__FLT_TYPE x, int y)
+{
+ int x_class = fpclassify (x);
+ int odd_y = y & 1;
+ __FLT_TYPE d, rslt;
+
+ if (y == 0 || x == __FLT_CST(1.0))
+ return __FLT_CST(1.0);
+ else if (x_class == FP_NAN)
+ {
+ rslt = (signbit(x) ? -__FLT_NAN : __FLT_NAN);
+ __FLT_RPT_DOMAIN ("__powi", x, (__FLT_TYPE) y, rslt);
+ return rslt;
+ }
+ else if (x_class == FP_ZERO)
+ {
+ if (y >= 0)
+ {
+ if (!odd_y || !signbit (x))
+ return __FLT_CST (0.0);
+ return -__FLT_CST(0.0);
+ }
+
+ if (!odd_y || !signbit (x))
+ return __FLT_HUGE_VAL;
+ return (signbit(x) ? -__FLT_HUGE_VAL : __FLT_HUGE_VAL);
+ }
+ else if (x_class == FP_INFINITE)
+ {
+ /* pow( -inf, y) = +0 for y<0 and not an odd integer, */
+ if (signbit(x) && y < 0 && !odd_y)
+ return __FLT_CST(0.0);
+ /* pow( -inf, y) = -inf for y an odd integer > 0. */
+ if (signbit(x) && y >= 0 && odd_y)
+ return -__FLT_HUGE_VAL;
+ /* pow( -inf, y) = +inf for y>0 and not an odd integer. */
+ if (signbit(x) && y >= 0 && !odd_y)
+ return __FLT_HUGE_VAL;
+ /* pow (+/-inf, y) is +/-0 with no exception for y an odd integer < 0. */
+ if (y < 0)
+ {
+ /* pow (+/-inf, y) is +0 with no exception for finite y < 0 and not an odd integer. */
+ return (odd_y && signbit(x) ? -__FLT_CST(0.0) : __FLT_CST(0.0));
+ }
+ /* pow (+/-inf, y) is +/-inf with no exception for finite y > 0 an odd integer. */
+ /* pow (+/-inf, y) is +inf with no exception for finite y > 0 and not an odd integer. */
+ return (odd_y && signbit(x) ? -__FLT_HUGE_VAL : __FLT_HUGE_VAL);
+ }
+
+ d = __FLT_ABI(fabs) (x);
+
+ if (y < 0)
+ {
+ d = __FLT_CST(1.0) / d;
+ y = -y;
+ }
+
+ if (!y)
+ rslt = __FLT_CST(1.0);
+ else if (y == 1)
+ rslt = d;
+ else
+ {
+ unsigned int u = (unsigned int) y;
+ rslt = ((u & 1) != 0) ? d : __FLT_CST(1.0);
+ u >>= 1;
+ do
+ {
+ d *= d;
+ if ((u & 1) != 0)
+ rslt *= d;
+ u >>= 1;
+ }
+ while (u > 0);
+ }
+ if (signbit (x) && odd_y)
+ rslt = -rslt;
+ return rslt;
+}
libc/mingw/math/powif.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_FLOAT 1
+#include "powi.def.h"
libc/mingw/math/powil.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "powi.def.h"
libc/mingw/math/rint.c
@@ -0,0 +1,24 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+double rint (double x) {
+ double retval = 0.0;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+ __asm__ __volatile__ ("frndint;" : "=t" (retval) : "0" (x));
+#elif defined(__arm__) || defined(_ARM_)
+ if (isnan(x) || isinf(x))
+ return x;
+ float temp;
+ __asm__ __volatile__ (
+ "vcvtr.s32.f64 %[tmp], %[src]\n\t"
+ "vcvt.f64.s32 %[dst], %[tmp]\n\t"
+ : [dst] "=w" (retval), [tmp] "=t" (temp) : [src] "w" (x));
+#elif defined(__aarch64__) || defined(_ARM64_)
+ __asm__ __volatile__ ("frintx %d0, %d1\n\t" : "=w" (retval) : "w" (x));
+#endif
+ return retval;
+}
libc/mingw/math/rintf.c
@@ -0,0 +1,23 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+float rintf (float x) {
+ float retval = 0.0F;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+ __asm__ __volatile__ ("frndint;": "=t" (retval) : "0" (x));
+#elif defined(__arm__) || defined(_ARM_)
+ if (isnan(x) || isinf(x))
+ return x;
+ __asm__ __volatile__ (
+ "vcvtr.s32.f32 %[dst], %[src]\n\t"
+ "vcvt.f32.s32 %[dst], %[dst]\n\t"
+ : [dst] "=t" (retval) : [src] "w" (x));
+#elif defined(__aarch64__) || defined(_ARM64_)
+ __asm__ __volatile__ ("frintx %s0, %s1\n\t" : "=w" (retval) : "w" (x));
+#endif
+ return retval;
+}
libc/mingw/math/rintl.c
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long double rintl (long double x) {
+ long double retval = 0.0L;
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+ __asm__ __volatile__ ("frndint;": "=t" (retval) : "0" (x));
+#elif defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
+ retval = rint(x);
+#endif
+ return retval;
+}
libc/mingw/math/round.c
@@ -0,0 +1,26 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+double
+round (double x)
+{
+ double res;
+ if (x >= 0.0)
+ {
+ res = ceil (x);
+ if (res - x > 0.5)
+ res -= 1.0;
+ }
+ else
+ {
+ res = ceil (-x);
+ if (res + x > 0.5)
+ res -= 1.0;
+ res = -res;
+ }
+ return res;
+}
libc/mingw/math/roundf.c
@@ -0,0 +1,26 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+float
+roundf (float x)
+{
+ float res;
+ if (x >= 0.0F)
+ {
+ res = ceilf (x);
+ if (res - x > 0.5F)
+ res -= 1.0F;
+ }
+ else
+ {
+ res = ceilf (-x);
+ if (res + x > 0.5F)
+ res -= 1.0F;
+ res = -res;
+ }
+ return res;
+}
libc/mingw/math/roundl.c
@@ -0,0 +1,26 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+
+long double
+roundl (long double x)
+{
+ long double res = 0.0L;
+ if (x >= 0.0L)
+ {
+ res = ceill (x);
+ if (res - x > 0.5L)
+ res -= 1.0L;
+ }
+ else
+ {
+ res = ceill (-x);
+ if (res + x > 0.5L)
+ res -= 1.0L;
+ res = -res;
+ }
+ return res;
+}
libc/mingw/math/s_erf.c
@@ -0,0 +1,347 @@
+/* @(#)s_erf.c 1.3 95/01/18 */
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunSoft, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/* double erf(double x)
+ * double erfc(double x)
+ * x
+ * 2 |\
+ * erf(x) = --------- | exp(-t*t)dt
+ * sqrt(pi) \|
+ * 0
+ *
+ * erfc(x) = 1-erf(x)
+ * Note that
+ * erf(-x) = -erf(x)
+ * erfc(-x) = 2 - erfc(x)
+ *
+ * Method:
+ * 1. For |x| in [0, 0.84375]
+ * erf(x) = x + x*R(x^2)
+ * erfc(x) = 1 - erf(x) if x in [-.84375,0.25]
+ * = 0.5 + ((0.5-x)-x*R) if x in [0.25,0.84375]
+ * where R = P/Q where P is an odd poly of degree 8 and
+ * Q is an odd poly of degree 10.
+ * -57.90
+ * | R - (erf(x)-x)/x | <= 2
+ *
+ * Remark. The formula is derived by noting
+ * erf(x) = (2/sqrt(pi))*(x - x^3/3 + x^5/10 - x^7/42 + ....)
+ * and that
+ * 2/sqrt(pi) = 1.128379167095512573896158903121545171688
+ * is close to one. The interval is chosen because the fix
+ * point of erf(x) is near 0.6174 (i.e., erf(x)=x when x is
+ * near 0.6174), and by some experiment, 0.84375 is chosen to
+ * guarantee the error is less than one ulp for erf.
+ *
+ * 2. For |x| in [0.84375,1.25], let s = |x| - 1, and
+ * c = 0.84506291151 rounded to single (24 bits)
+ * erf(x) = sign(x) * (c + P1(s)/Q1(s))
+ * erfc(x) = (1-c) - P1(s)/Q1(s) if x > 0
+ * 1+(c+P1(s)/Q1(s)) if x < 0
+ * |P1/Q1 - (erf(|x|)-c)| <= 2**-59.06
+ * Remark: here we use the taylor series expansion at x=1.
+ * erf(1+s) = erf(1) + s*Poly(s)
+ * = 0.845.. + P1(s)/Q1(s)
+ * That is, we use rational approximation to approximate
+ * erf(1+s) - (c = (single)0.84506291151)
+ * Note that |P1/Q1|< 0.078 for x in [0.84375,1.25]
+ * where
+ * P1(s) = degree 6 poly in s
+ * Q1(s) = degree 6 poly in s
+ *
+ * 3. For x in [1.25,1/0.35(~2.857143)],
+ * erfc(x) = (1/x)*exp(-x*x-0.5625+R1/S1)
+ * erf(x) = 1 - erfc(x)
+ * where
+ * R1(z) = degree 7 poly in z, (z=1/x^2)
+ * S1(z) = degree 8 poly in z
+ *
+ * 4. For x in [1/0.35,28]
+ * erfc(x) = (1/x)*exp(-x*x-0.5625+R2/S2) if x > 0
+ * = 2.0 - (1/x)*exp(-x*x-0.5625+R2/S2) if -6<x<0
+ * = 2.0 - tiny (if x <= -6)
+ * erf(x) = sign(x)*(1.0 - erfc(x)) if x < 6, else
+ * erf(x) = sign(x)*(1.0 - tiny)
+ * where
+ * R2(z) = degree 6 poly in z, (z=1/x^2)
+ * S2(z) = degree 7 poly in z
+ *
+ * Note1:
+ * To compute exp(-x*x-0.5625+R/S), let s be a single
+ * precision number and s := x; then
+ * -x*x = -s*s + (s-x)*(s+x)
+ * exp(-x*x-0.5626+R/S) =
+ * exp(-s*s-0.5625)*exp((s-x)*(s+x)+R/S);
+ * Note2:
+ * Here 4 and 5 make use of the asymptotic series
+ * exp(-x*x)
+ * erfc(x) ~ ---------- * ( 1 + Poly(1/x^2) )
+ * x*sqrt(pi)
+ * We use rational approximation to approximate
+ * g(s)=f(1/x^2) = log(erfc(x)*x) - x*x + 0.5625
+ * Here is the error bound for R1/S1 and R2/S2
+ * |R1/S1 - f(x)| < 2**(-62.57)
+ * |R2/S2 - f(x)| < 2**(-61.52)
+ *
+ * 5. For inf > x >= 28
+ * erf(x) = sign(x) *(1 - tiny) (raise inexact)
+ * erfc(x) = tiny*tiny (raise underflow) if x > 0
+ * = 2 - tiny if x<0
+ *
+ * 7. Special case:
+ * erf(0) = 0, erf(inf) = 1, erf(-inf) = -1,
+ * erfc(0) = 1, erfc(inf) = 0, erfc(-inf) = 2,
+ * erfc/erf(NaN) is NaN
+ */
+
+
+/* #include "fdlibm.h" */
+
+#include <math.h>
+#include <stdint.h>
+#include <errno.h>
+
+#define __ieee754_exp exp
+
+typedef union
+{
+ double value;
+ struct
+ {
+ uint32_t lsw;
+ uint32_t msw;
+ } parts;
+} ieee_double_shape_type;
+
+
+static inline int __get_hi_word(const double x)
+{
+ ieee_double_shape_type u;
+ u.value = x;
+ return u.parts.msw;
+}
+
+static inline void __trunc_lo_word(double *x)
+{
+ ieee_double_shape_type u;
+ u.value = *x;
+ u.parts.lsw = 0;
+ *x = u.value;
+}
+
+
+static const double
+ tiny= 1e-300,
+ half= 5.00000000000000000000e-01, /* 0x3FE00000, 0x00000000 */
+ one = 1.00000000000000000000e+00, /* 0x3FF00000, 0x00000000 */
+ two = 2.00000000000000000000e+00, /* 0x40000000, 0x00000000 */
+ /* c = (float)0.84506291151 */
+ erx = 8.45062911510467529297e-01, /* 0x3FEB0AC1, 0x60000000 */
+ /*
+ * Coefficients for approximation to erf on [0,0.84375]
+ */
+ efx = 1.28379167095512586316e-01, /* 0x3FC06EBA, 0x8214DB69 */
+ efx8= 1.02703333676410069053e+00, /* 0x3FF06EBA, 0x8214DB69 */
+ pp0 = 1.28379167095512558561e-01, /* 0x3FC06EBA, 0x8214DB68 */
+ pp1 = -3.25042107247001499370e-01, /* 0xBFD4CD7D, 0x691CB913 */
+ pp2 = -2.84817495755985104766e-02, /* 0xBF9D2A51, 0xDBD7194F */
+ pp3 = -5.77027029648944159157e-03, /* 0xBF77A291, 0x236668E4 */
+ pp4 = -2.37630166566501626084e-05, /* 0xBEF8EAD6, 0x120016AC */
+ qq1 = 3.97917223959155352819e-01, /* 0x3FD97779, 0xCDDADC09 */
+ qq2 = 6.50222499887672944485e-02, /* 0x3FB0A54C, 0x5536CEBA */
+ qq3 = 5.08130628187576562776e-03, /* 0x3F74D022, 0xC4D36B0F */
+ qq4 = 1.32494738004321644526e-04, /* 0x3F215DC9, 0x221C1A10 */
+ qq5 = -3.96022827877536812320e-06, /* 0xBED09C43, 0x42A26120 */
+ /*
+ * Coefficients for approximation to erf in [0.84375,1.25]
+ */
+ pa0 = -2.36211856075265944077e-03, /* 0xBF6359B8, 0xBEF77538 */
+ pa1 = 4.14856118683748331666e-01, /* 0x3FDA8D00, 0xAD92B34D */
+ pa2 = -3.72207876035701323847e-01, /* 0xBFD7D240, 0xFBB8C3F1 */
+ pa3 = 3.18346619901161753674e-01, /* 0x3FD45FCA, 0x805120E4 */
+ pa4 = -1.10894694282396677476e-01, /* 0xBFBC6398, 0x3D3E28EC */
+ pa5 = 3.54783043256182359371e-02, /* 0x3FA22A36, 0x599795EB */
+ pa6 = -2.16637559486879084300e-03, /* 0xBF61BF38, 0x0A96073F */
+ qa1 = 1.06420880400844228286e-01, /* 0x3FBB3E66, 0x18EEE323 */
+ qa2 = 5.40397917702171048937e-01, /* 0x3FE14AF0, 0x92EB6F33 */
+ qa3 = 7.18286544141962662868e-02, /* 0x3FB2635C, 0xD99FE9A7 */
+ qa4 = 1.26171219808761642112e-01, /* 0x3FC02660, 0xE763351F */
+ qa5 = 1.36370839120290507362e-02, /* 0x3F8BEDC2, 0x6B51DD1C */
+ qa6 = 1.19844998467991074170e-02, /* 0x3F888B54, 0x5735151D */
+ /*
+ * Coefficients for approximation to erfc in [1.25,1/0.35]
+ */
+ ra0 = -9.86494403484714822705e-03, /* 0xBF843412, 0x600D6435 */
+ ra1 = -6.93858572707181764372e-01, /* 0xBFE63416, 0xE4BA7360 */
+ ra2 = -1.05586262253232909814e+01, /* 0xC0251E04, 0x41B0E726 */
+ ra3 = -6.23753324503260060396e+01, /* 0xC04F300A, 0xE4CBA38D */
+ ra4 = -1.62396669462573470355e+02, /* 0xC0644CB1, 0x84282266 */
+ ra5 = -1.84605092906711035994e+02, /* 0xC067135C, 0xEBCCABB2 */
+ ra6 = -8.12874355063065934246e+01, /* 0xC0545265, 0x57E4D2F2 */
+ ra7 = -9.81432934416914548592e+00, /* 0xC023A0EF, 0xC69AC25C */
+ sa1 = 1.96512716674392571292e+01, /* 0x4033A6B9, 0xBD707687 */
+ sa2 = 1.37657754143519042600e+02, /* 0x4061350C, 0x526AE721 */
+ sa3 = 4.34565877475229228821e+02, /* 0x407B290D, 0xD58A1A71 */
+ sa4 = 6.45387271733267880336e+02, /* 0x40842B19, 0x21EC2868 */
+ sa5 = 4.29008140027567833386e+02, /* 0x407AD021, 0x57700314 */
+ sa6 = 1.08635005541779435134e+02, /* 0x405B28A3, 0xEE48AE2C */
+ sa7 = 6.57024977031928170135e+00, /* 0x401A47EF, 0x8E484A93 */
+ sa8 = -6.04244152148580987438e-02, /* 0xBFAEEFF2, 0xEE749A62 */
+ /*
+ * Coefficients for approximation to erfc in [1/.35,28]
+ */
+ rb0 = -9.86494292470009928597e-03, /* 0xBF843412, 0x39E86F4A */
+ rb1 = -7.99283237680523006574e-01, /* 0xBFE993BA, 0x70C285DE */
+ rb2 = -1.77579549177547519889e+01, /* 0xC031C209, 0x555F995A */
+ rb3 = -1.60636384855821916062e+02, /* 0xC064145D, 0x43C5ED98 */
+ rb4 = -6.37566443368389627722e+02, /* 0xC083EC88, 0x1375F228 */
+ rb5 = -1.02509513161107724954e+03, /* 0xC0900461, 0x6A2E5992 */
+ rb6 = -4.83519191608651397019e+02, /* 0xC07E384E, 0x9BDC383F */
+ sb1 = 3.03380607434824582924e+01, /* 0x403E568B, 0x261D5190 */
+ sb2 = 3.25792512996573918826e+02, /* 0x40745CAE, 0x221B9F0A */
+ sb3 = 1.53672958608443695994e+03, /* 0x409802EB, 0x189D5118 */
+ sb4 = 3.19985821950859553908e+03, /* 0x40A8FFB7, 0x688C246A */
+ sb5 = 2.55305040643316442583e+03, /* 0x40A3F219, 0xCEDF3BE6 */
+ sb6 = 4.74528541206955367215e+02, /* 0x407DA874, 0xE79FE763 */
+ sb7 = -2.24409524465858183362e+01; /* 0xC03670E2, 0x42712D62 */
+
+
+double erf(double x)
+{
+ int hx, ix, i;
+ double R, S, P, Q, s, y, z, r;
+ hx = __get_hi_word(x);
+ ix = hx & 0x7fffffff;
+ if (ix >= 0x7ff00000) { /* erf(nan)=nan */
+ i = ((unsigned)hx>>31)<<1;
+ return (double)(1-i)+one/x; /* erf(+-inf)=+-1 */
+ }
+
+ if (ix < 0x3feb0000) { /* |x|<0.84375 */
+ if (ix < 0x3e300000) { /* |x|<2**-28 */
+ if (ix < 0x00800000)
+ return 0.125*(8.0*x+efx8*x); /*avoid underflow */
+ return x + efx*x;
+ }
+ z = x*x;
+ r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
+ s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
+ y = r/s;
+ return x + x*y;
+ }
+ if (ix < 0x3ff40000) { /* 0.84375 <= |x| < 1.25 */
+ s = fabs(x)-one;
+ P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
+ Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
+ if (hx >= 0)
+ return erx + P/Q;
+ else
+ return -erx - P/Q;
+ }
+ if (ix >= 0x40180000) { /* inf>|x|>=6 */
+ if (hx >= 0)
+ return one-tiny;
+ else
+ return tiny-one;
+ }
+ x = fabs(x);
+ s = one/(x*x);
+ if (ix < 0x4006DB6E) { /* |x| < 1/0.35 */
+ R = ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(
+ ra5+s*(ra6+s*ra7))))));
+ S = one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(
+ sa5+s*(sa6+s*(sa7+s*sa8)))))));
+ } else { /* |x| >= 1/0.35 */
+ R = rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(
+ rb5+s*rb6)))));
+ S = one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(
+ sb5+s*(sb6+s*sb7))))));
+ }
+ z = x;
+ __trunc_lo_word(&z);
+ r = __ieee754_exp(-z*z-0.5625)*__ieee754_exp((z-x)*(z+x)+R/S);
+ if (hx >= 0)
+ return one-r/x;
+ else
+ return r/x-one;
+}
+
+double erfc(double x)
+{
+ int hx,ix;
+ double R,S,P,Q,s,y,z,r;
+ hx = __get_hi_word(x);
+ ix = hx&0x7fffffff;
+ if (ix >= 0x7ff00000) { /* erfc(nan)=nan */
+ /* erfc(+-inf)=0,2 */
+ return (double)(((unsigned)hx>>31)<<1)+one/x;
+ }
+
+ if (ix < 0x3feb0000) { /* |x|<0.84375 */
+ if (ix < 0x3c700000) /* |x|<2**-56 */
+ return one-x;
+ z = x*x;
+ r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
+ s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
+ y = r/s;
+ if (hx < 0x3fd00000) { /* x<1/4 */
+ return one-(x+x*y);
+ } else {
+ r = x*y;
+ r += (x-half);
+ return half - r ;
+ }
+ }
+ if (ix < 0x3ff40000) { /* 0.84375 <= |x| < 1.25 */
+ s = fabs(x)-one;
+ P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
+ Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
+ if (hx >= 0) {
+ z = one-erx; return z - P/Q;
+ } else {
+ z = erx+P/Q; return one+z;
+ }
+ }
+ if (ix < 0x403c0000) { /* |x|<28 */
+ x = fabs(x);
+ s = one/(x*x);
+ if (ix < 0x4006DB6D) { /* |x| < 1/.35 ~ 2.857143*/
+ R = ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(
+ ra5+s*(ra6+s*ra7))))));
+ S = one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(
+ sa5+s*(sa6+s*(sa7+s*sa8)))))));
+ } else { /* |x| >= 1/.35 ~ 2.857143 */
+ if (hx < 0 && ix >= 0x40180000)
+ return two-tiny; /* x < -6 */
+ R = rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(
+ rb5+s*rb6)))));
+ S = one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(
+ sb5+s*(sb6+s*sb7))))));
+ }
+ z = x;
+ __trunc_lo_word(&z);
+ r = __ieee754_exp(-z*z-0.5625)*
+ __ieee754_exp((z-x)*(z+x)+R/S);
+ if (hx > 0)
+ return r/x;
+ else
+ return two-r/x;
+ } else {
+ /* set range error */
+ errno = ERANGE;
+ if (hx > 0)
+ return tiny*tiny;
+ else
+ return two-tiny;
+ }
+}
+
libc/mingw/math/sf_erf.c
@@ -0,0 +1,268 @@
+/* sf_erf.c -- float version of s_erf.c.
+ * Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
+ */
+
+/*
+ * ====================================================
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+ *
+ * Developed at SunPro, a Sun Microsystems, Inc. business.
+ * Permission to use, copy, modify, and distribute this
+ * software is freely granted, provided that this notice
+ * is preserved.
+ * ====================================================
+ */
+
+/*
+#include "fdlibm.h"
+*/
+#include <math.h>
+#include <stdint.h>
+#include <errno.h>
+
+#define __ieee754_expf expf
+
+typedef union
+{
+ float value;
+ uint32_t word;
+} ieee_float_shape_type;
+
+/* Get a 32 bit int from a float. */
+
+static inline int
+__get_float_word(float d)
+{
+ ieee_float_shape_type u;
+ u.value = d;
+ return u.word;
+}
+
+/* Set a float from a 32 bit int. */
+
+#define SET_FLOAT_WORD(d,i) \
+do { \
+ ieee_float_shape_type sf_u; \
+ sf_u.word = (i); \
+ (d) = sf_u.value; \
+} while (0)
+
+static inline void __trunc_float_word(float * x)
+{
+ ieee_float_shape_type u;
+ u.value = * x;
+ u.word &= 0xfffff000;
+}
+
+#ifdef __v810__
+#define const
+#endif
+
+static const float
+ tiny= 1e-30,
+ half= 5.0000000000e-01, /* 0x3F000000 */
+ one = 1.0000000000e+00, /* 0x3F800000 */
+ two = 2.0000000000e+00, /* 0x40000000 */
+ /* c = (subfloat)0.84506291151 */
+ erx = 8.4506291151e-01, /* 0x3f58560b */
+ /*
+ * Coefficients for approximation to erf on [0,0.84375]
+ */
+ efx = 1.2837916613e-01, /* 0x3e0375d4 */
+ efx8= 1.0270333290e+00, /* 0x3f8375d4 */
+ pp0 = 1.2837916613e-01, /* 0x3e0375d4 */
+ pp1 = -3.2504209876e-01, /* 0xbea66beb */
+ pp2 = -2.8481749818e-02, /* 0xbce9528f */
+ pp3 = -5.7702702470e-03, /* 0xbbbd1489 */
+ pp4 = -2.3763017452e-05, /* 0xb7c756b1 */
+ qq1 = 3.9791721106e-01, /* 0x3ecbbbce */
+ qq2 = 6.5022252500e-02, /* 0x3d852a63 */
+ qq3 = 5.0813062117e-03, /* 0x3ba68116 */
+ qq4 = 1.3249473704e-04, /* 0x390aee49 */
+ qq5 = -3.9602282413e-06, /* 0xb684e21a */
+ /*
+ * Coefficients for approximation to erf in [0.84375,1.25]
+ */
+ pa0 = -2.3621185683e-03, /* 0xbb1acdc6 */
+ pa1 = 4.1485610604e-01, /* 0x3ed46805 */
+ pa2 = -3.7220788002e-01, /* 0xbebe9208 */
+ pa3 = 3.1834661961e-01, /* 0x3ea2fe54 */
+ pa4 = -1.1089469492e-01, /* 0xbde31cc2 */
+ pa5 = 3.5478305072e-02, /* 0x3d1151b3 */
+ pa6 = -2.1663755178e-03, /* 0xbb0df9c0 */
+ qa1 = 1.0642088205e-01, /* 0x3dd9f331 */
+ qa2 = 5.4039794207e-01, /* 0x3f0a5785 */
+ qa3 = 7.1828655899e-02, /* 0x3d931ae7 */
+ qa4 = 1.2617121637e-01, /* 0x3e013307 */
+ qa5 = 1.3637083583e-02, /* 0x3c5f6e13 */
+ qa6 = 1.1984500103e-02, /* 0x3c445aa3 */
+ /*
+ * Coefficients for approximation to erfc in [1.25,1/0.35]
+ */
+ ra0 = -9.8649440333e-03, /* 0xbc21a093 */
+ ra1 = -6.9385856390e-01, /* 0xbf31a0b7 */
+ ra2 = -1.0558626175e+01, /* 0xc128f022 */
+ ra3 = -6.2375331879e+01, /* 0xc2798057 */
+ ra4 = -1.6239666748e+02, /* 0xc322658c */
+ ra5 = -1.8460508728e+02, /* 0xc3389ae7 */
+ ra6 = -8.1287437439e+01, /* 0xc2a2932b */
+ ra7 = -9.8143291473e+00, /* 0xc11d077e */
+ sa1 = 1.9651271820e+01, /* 0x419d35ce */
+ sa2 = 1.3765776062e+02, /* 0x4309a863 */
+ sa3 = 4.3456588745e+02, /* 0x43d9486f */
+ sa4 = 6.4538726807e+02, /* 0x442158c9 */
+ sa5 = 4.2900814819e+02, /* 0x43d6810b */
+ sa6 = 1.0863500214e+02, /* 0x42d9451f */
+ sa7 = 6.5702495575e+00, /* 0x40d23f7c */
+ sa8 = -6.0424413532e-02, /* 0xbd777f97 */
+ /*
+ * Coefficients for approximation to erfc in [1/.35,28]
+ */
+ rb0 = -9.8649431020e-03, /* 0xbc21a092 */
+ rb1 = -7.9928326607e-01, /* 0xbf4c9dd4 */
+ rb2 = -1.7757955551e+01, /* 0xc18e104b */
+ rb3 = -1.6063638306e+02, /* 0xc320a2ea */
+ rb4 = -6.3756646729e+02, /* 0xc41f6441 */
+ rb5 = -1.0250950928e+03, /* 0xc480230b */
+ rb6 = -4.8351919556e+02, /* 0xc3f1c275 */
+ sb1 = 3.0338060379e+01, /* 0x41f2b459 */
+ sb2 = 3.2579251099e+02, /* 0x43a2e571 */
+ sb3 = 1.5367296143e+03, /* 0x44c01759 */
+ sb4 = 3.1998581543e+03, /* 0x4547fdbb */
+ sb5 = 2.5530502930e+03, /* 0x451f90ce */
+ sb6 = 4.7452853394e+02, /* 0x43ed43a7 */
+ sb7 = -2.2440952301e+01; /* 0xc1b38712 */
+
+float erff(float x)
+{
+ int32_t hx, ix, i;
+ float R, S, P, Q, s, y, z, r;
+ hx = __get_float_word(x);
+ ix = hx & 0x7fffffff;
+ if (!(ix<0x7f800000L)) { /* erf(nan)=nan */
+ i = ((uint32_t)hx>>31)<<1;
+ return (float)(1-i)+one/x; /* erf(+-inf)=+-1 */
+ }
+
+ if (ix < 0x3f580000) { /* |x|<0.84375 */
+ if (ix < 0x31800000) { /* |x|<2**-28 */
+ if (ix < 0x04000000)
+ /*avoid underflow */
+ return (float)0.125*((float)8.0*x+efx8*x);
+ return x + efx*x;
+ }
+ z = x*x;
+ r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
+ s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
+ y = r/s;
+ return x + x*y;
+ }
+ if (ix < 0x3fa00000) { /* 0.84375 <= |x| < 1.25 */
+ s = fabsf(x)-one;
+ P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
+ Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
+ if (hx >= 0)
+ return erx + P/Q;
+ else
+ return -erx - P/Q;
+ }
+ if (ix >= 0x40c00000) { /* inf>|x|>=6 */
+ if (hx >= 0)
+ return one-tiny;
+ else
+ return tiny-one;
+ }
+ x = fabsf(x);
+ s = one/(x*x);
+ if (ix< 0x4036DB6E) { /* |x| < 1/0.35 */
+ R = ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(
+ ra5+s*(ra6+s*ra7))))));
+ S = one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(
+ sa5+s*(sa6+s*(sa7+s*sa8)))))));
+ } else { /* |x| >= 1/0.35 */
+ R = rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(
+ rb5+s*rb6)))));
+ S = one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(
+ sb5+s*(sb6+s*sb7))))));
+ }
+
+ z = x;
+ __trunc_float_word (&z);
+ r = __ieee754_expf(-z*z-(float)0.5625)*__ieee754_expf((z-x)*(z+x)+R/S);
+ if (hx >= 0)
+ return one-r/x;
+ else
+ return r/x-one;
+}
+
+float erfcf(float x)
+{
+ int32_t hx, ix;
+ float R, S, P, Q, s, y, z, r;
+ hx = __get_float_word(x);
+ ix = hx & 0x7fffffff;
+ if (!(ix < 0x7f800000L)) { /* erfc(nan)=nan */
+ /* erfc(+-inf)=0,2 */
+ return (float)(((uint32_t)hx>>31)<<1)+one/x;
+ }
+
+ if (ix < 0x3f580000) { /* |x|<0.84375 */
+ if (ix < 0x23800000) /* |x|<2**-56 */
+ return one-x;
+ z = x*x;
+ r = pp0+z*(pp1+z*(pp2+z*(pp3+z*pp4)));
+ s = one+z*(qq1+z*(qq2+z*(qq3+z*(qq4+z*qq5))));
+ y = r/s;
+ if (hx < 0x3e800000) { /* x<1/4 */
+ return one-(x+x*y);
+ } else {
+ r = x*y;
+ r += (x-half);
+ return half - r ;
+ }
+ }
+ if (ix < 0x3fa00000) { /* 0.84375 <= |x| < 1.25 */
+ s = fabsf(x)-one;
+ P = pa0+s*(pa1+s*(pa2+s*(pa3+s*(pa4+s*(pa5+s*pa6)))));
+ Q = one+s*(qa1+s*(qa2+s*(qa3+s*(qa4+s*(qa5+s*qa6)))));
+ if (hx >= 0) {
+ z = one-erx; return z - P/Q;
+ } else {
+ z = erx+P/Q; return one+z;
+ }
+ }
+
+ if (ix < 0x41e00000) { /* |x|<28 */
+ x = fabsf(x);
+ s = one/(x*x);
+ if (ix< 0x4036DB6D) { /* |x| < 1/.35 ~ 2.857143*/
+ R = ra0+s*(ra1+s*(ra2+s*(ra3+s*(ra4+s*(
+ ra5+s*(ra6+s*ra7))))));
+ S = one+s*(sa1+s*(sa2+s*(sa3+s*(sa4+s*(
+ sa5+s*(sa6+s*(sa7+s*sa8)))))));
+ } else { /* |x| >= 1/.35 ~ 2.857143 */
+ if (hx < 0 && ix >= 0x40c00000)
+ return two-tiny;/* x < -6 */
+ R = rb0+s*(rb1+s*(rb2+s*(rb3+s*(rb4+s*(
+ rb5+s*rb6)))));
+ S = one+s*(sb1+s*(sb2+s*(sb3+s*(sb4+s*(
+ sb5+s*(sb6+s*sb7))))));
+ }
+
+ z = x;
+ __trunc_float_word (&z);
+ r = __ieee754_expf(-z*z-(float)0.5625)*
+ __ieee754_expf((z-x)*(z+x)+R/S);
+ if (hx > 0)
+ return r/x;
+ else
+ return two-r/x;
+ } else {
+ /* set range error */
+ errno = ERANGE;
+ if (hx > 0)
+ return tiny*tiny;
+ else
+ return two-tiny;
+ }
+}
libc/mingw/math/signbit.c
@@ -0,0 +1,35 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __FP_SIGNBIT 0x0200
+int __signbit (double x);
+
+typedef union __mingw_dbl_type_t {
+ double x;
+ unsigned long long val;
+ __extension__ struct {
+ unsigned int low, high;
+ } lh;
+} __mingw_dbl_type_t;
+
+int __signbit (double x)
+{
+#if defined(__x86_64__) || defined(_AMD64_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
+ __mingw_dbl_type_t hlp;
+
+ hlp.x = x;
+ return ((hlp.lh.high & 0x80000000) != 0);
+#elif defined(__i386__) || defined(_X86_)
+ unsigned short sw;
+ __asm__ __volatile__ ("fxam; fstsw %%ax;"
+ : "=a" (sw)
+ : "t" (x) );
+ return (sw & __FP_SIGNBIT) != 0;
+#endif
+}
+
+#undef signbit
+int __attribute__ ((alias ("__signbit"))) signbit (double);
+
libc/mingw/math/signbitf.c
@@ -0,0 +1,28 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __FP_SIGNBIT 0x0200
+int __signbitf (float x);
+
+typedef union __mingw_flt_type_t {
+ float x;
+ unsigned int val;
+} __mingw_flt_type_t;
+
+int __signbitf (float x)
+{
+#if defined(__x86_64__) || defined(_AMD64_) || defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
+ __mingw_flt_type_t hlp;
+ hlp.x = x;
+ return ((hlp.val & 0x80000000) != 0);
+#elif defined(__i386__) || defined(_X86_)
+ unsigned short sw;
+ __asm__ __volatile__ ("fxam; fstsw %%ax;"
+ : "=a" (sw)
+ : "t" (x) );
+ return (sw & __FP_SIGNBIT) != 0;
+#endif
+}
+int __attribute__ ((alias ("__signbitf"))) signbitf (float);
libc/mingw/math/signbitl.c
@@ -0,0 +1,44 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+
+typedef union __mingw_ldbl_type_t
+{
+ long double x;
+ __extension__ struct {
+ unsigned int low, high;
+ int sign_exponent : 16;
+ int res1 : 16;
+ int res0 : 32;
+ } lh;
+} __mingw_ldbl_type_t;
+
+typedef union __mingw_fp_types_t
+{
+ long double *ld;
+ __mingw_ldbl_type_t *ldt;
+} __mingw_fp_types_t;
+
+#define __FP_SIGNBIT 0x0200
+extern int __signbit (double x);
+int __signbitl (long double x);
+
+
+int __signbitl (long double x) {
+#if defined(__x86_64__) || defined(_AMD64_)
+ __mingw_fp_types_t ld;
+ ld.ld = &x;
+ return ((ld.ldt->lh.sign_exponent & 0x8000) != 0);
+#elif defined(__arm__) || defined(_ARM_) || defined(__aarch64__) || defined(_ARM64_)
+ return __signbit(x);
+#elif defined(__i386__) || defined(_X86_)
+ unsigned short sw;
+ __asm__ __volatile__ ("fxam; fstsw %%ax;"
+ : "=a" (sw)
+ : "t" (x) );
+ return (sw & __FP_SIGNBIT) != 0;
+#endif
+}
+
+int __attribute__ ((alias ("__signbitl"))) signbitl (long double);
libc/mingw/math/signgam.c
@@ -0,0 +1,45 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2012 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+int signgam = 0;
libc/mingw/math/sinhf.c
@@ -0,0 +1,10 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+float sinhf (float x)
+{
+ return (float) sinh (x);
+}
libc/mingw/math/sinhl.c
@@ -0,0 +1,100 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "cephes_mconf.h"
+#include <errno.h>
+
+#ifdef UNK
+static uLD P[] = {
+ { { 1.7550769032975377032681E-6L } },
+ { { 4.1680702175874268714539E-4L } },
+ { { 3.0993532520425419002409E-2L } },
+ { { 9.9999999999999999998002E-1L } }
+};
+static long double Q[] = {
+ { { 1.7453965448620151484660E-8L } },
+ { { -5.9116673682651952419571E-6L } },
+ { { 1.0599252315677389339530E-3L } },
+ { { -1.1403880487744749056675E-1L } },
+ { { 6.0000000000000000000200E0L } }
+};
+#endif
+
+#ifdef IBMPC
+static const uLD P[] = {
+ { { 0xec6a,0xd942,0xfbb3,0xeb8f,0x3feb, 0, 0, 0 } },
+ { { 0x365e,0xb30a,0xe437,0xda86,0x3ff3, 0, 0, 0 } },
+ { { 0x8890,0x01f6,0x2612,0xfde6,0x3ff9, 0, 0, 0 } },
+ { { 0x0000,0x0000,0x0000,0x8000,0x3fff, 0, 0, 0 } }
+};
+static const uLD Q[] = {
+ { { 0x4edd,0x4c21,0xad09,0x95ed,0x3fe5, 0, 0, 0 } },
+ { { 0x4376,0x9b70,0xd605,0xc65c,0xbfed, 0, 0, 0 } },
+ { { 0xc8ad,0x5d21,0x3069,0x8aed,0x3ff5, 0, 0, 0 } },
+ { { 0x9c32,0x6374,0x2d4b,0xe98d,0xbffb, 0, 0, 0 } },
+ { { 0x0000,0x0000,0x0000,0xc000,0x4001, 0, 0, 0 } }
+};
+#endif
+
+#ifdef MIEEE
+static uLD P[] = {
+ { { 0x3feb0000,0xeb8ffbb3,0xd942ec6a, 0 } },
+ { { 0x3ff30000,0xda86e437,0xb30a365e, 0 } },
+ { { 0x3ff90000,0xfde62612,0x01f68890, 0 } },
+ { { 0x3fff0000,0x80000000,0x00000000, 0 } }
+};
+static uLD Q[] = {
+ { { 0x3fe50000,0x95edad09,0x4c214edd, 0 } },
+ { { 0xbfed0000,0xc65cd605,0x9b704376, 0 } },
+ { { 0x3ff50000,0x8aed3069,0x5d21c8ad, 0 } },
+ { { 0xbffb0000,0xe98d2d4b,0x63749c32, 0 } },
+ { { 0x40010000,0xc0000000,0x00000000, 0 } }
+};
+#endif
+
+long double sinhl(long double x)
+{
+ long double a;
+ int x_class = fpclassify (x);
+
+ if (x_class == FP_NAN)
+ {
+ errno = EDOM;
+ return x;
+ }
+ if (x_class == FP_ZERO)
+ return x;
+ if (x_class == FP_INFINITE ||
+ (fabsl (x) > (MAXLOGL + LOGE2L)))
+ {
+ errno = ERANGE;
+#ifdef INFINITIES
+ return (signbit (x) ? -INFINITYL : INFINITYL);
+#else
+ return (signbit (x) ? -MAXNUML : MAXNUML);
+#endif
+ }
+ a = fabsl (x);
+ if (a > 1.0L)
+ {
+ if (a >= (MAXLOGL - LOGE2L))
+ {
+ a = expl(0.5L*a);
+ a = (0.5L * a) * a;
+ if (x < 0.0L)
+ a = -a;
+ return (a);
+ }
+ a = expl(a);
+ a = 0.5L*a - (0.5L/a);
+ if (x < 0.0L)
+ a = -a;
+ return (a);
+ }
+
+ a *= a;
+ return (x + x * a * (polevll(a,P,3)/polevll(a,Q,4)));
+}
+
libc/mingw/math/sqrt.c
@@ -0,0 +1,47 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_DOUBLE 1
+#define X64_ASM "sqrtsd"
+#include "sqrt.def.h"
libc/mingw/math/sqrt.def.h
@@ -0,0 +1,92 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 "../complex/complex_internal.h"
+#include <errno.h>
+
+__FLT_TYPE
+__FLT_ABI (sqrt) (__FLT_TYPE x)
+{
+ __FLT_TYPE res = __FLT_CST (0.0);
+ int x_class = fpclassify (x);
+ if (x_class == FP_NAN || signbit (x))
+ {
+ if (x_class == FP_ZERO)
+ return __FLT_CST (-0.0);
+
+ if (x_class == FP_NAN)
+ {
+ __FLT_RPT_DOMAIN ("sqrt", x, 0.0, x);
+ return x;
+ }
+
+ res = -__FLT_NAN;
+ __FLT_RPT_DOMAIN ("sqrt", x, 0.0, res);
+ return res;
+ }
+ else if (x_class == FP_ZERO)
+ return __FLT_CST (0.0);
+ else if (x_class == FP_INFINITE)
+ return __FLT_HUGE_VAL;
+ else if (x == __FLT_CST (1.0))
+ return __FLT_CST (1.0);
+#if defined(__arm__) || defined(_ARM_)
+#if _NEW_COMPLEX_FLOAT
+ asm volatile ("fsqrts %[dst], %[src];\n" : [dst] "=t" (res) : [src] "t" (x));
+#else
+ asm volatile ("fsqrtd %[dst], %[src];\n" : [dst] "=w" (res) : [src] "w" (x));
+#endif
+#elif defined(__aarch64__) || defined(_ARM64_)
+#if _NEW_COMPLEX_FLOAT
+ asm volatile ("fsqrt %s[dst], %s[src]\n" : [dst] "=w" (res) : [src] "w" (x));
+#else
+ asm volatile ("fsqrt %d[dst], %d[src]\n" : [dst] "=w" (res) : [src] "w" (x));
+#endif
+#elif defined(_X86_) || defined(__i386__) || defined(_AMD64_) || defined(__x86_64__)
+ asm volatile ("fsqrt" : "=t" (res) : "0" (x));
+#else
+#error Not supported on your platform yet
+#endif
+ return res;
+}
libc/mingw/math/sqrtf.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_FLOAT 1
+#include "sqrt.def.h"
libc/mingw/math/sqrtl.c
@@ -0,0 +1,46 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2009, 2010 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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.
+*/
+
+#define _NEW_COMPLEX_LDOUBLE 1
+#include "sqrt.def.h"
libc/mingw/math/tanhf.c
@@ -0,0 +1,10 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <math.h>
+float tanhf (float x)
+{
+ return (float) tanh (x);
+}
libc/mingw/math/tanhl.c
@@ -0,0 +1,92 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "cephes_mconf.h"
+#ifndef _SET_ERRNO
+#define _SET_ERRNO(x)
+#endif
+
+#ifdef UNK
+static uLD P[] = {
+ { { -6.8473739392677100872869E-5L } },
+ { { -9.5658283111794641589011E-1L } },
+ { { -8.4053568599672284488465E1L } },
+ { { -1.3080425704712825945553E3L } }
+};
+static uLD Q[] = {
+ { { 9.6259501838840336946872E1L } },
+ { { 1.8218117903645559060232E3L } },
+ { { 3.9241277114138477845780E3L } }
+};
+#endif
+
+#ifdef IBMPC
+static uLD P[] = {
+ { { 0xd2a4,0x1b0c,0x8f15,0x8f99,0xbff1, 0, 0, 0 } },
+ { { 0x5959,0x9111,0x9cc7,0xf4e2,0xbffe, 0, 0, 0 } },
+ { { 0xb576,0xef5e,0x6d57,0xa81b,0xc005, 0, 0, 0 } },
+ { { 0xe3be,0xbfbd,0x5cbc,0xa381,0xc009, 0, 0, 0 } }
+};
+static uLD Q[] = {
+ { { 0x687f,0xce24,0xdd6c,0xc084,0x4005, 0, 0, 0 } },
+ { { 0x3793,0xc95f,0xfa2f,0xe3b9,0x4009, 0, 0, 0 } },
+ { { 0xd5a2,0x1f9c,0x0b1b,0xf542,0x400a, 0, 0, 0 } }
+};
+#endif
+
+#ifdef MIEEE
+static uLD P[] = {
+ { { 0xbff10000,0x8f998f15,0x1b0cd2a4, 0 } },
+ { { 0xbffe0000,0xf4e29cc7,0x91115959, 0 } },
+ { { 0xc0050000,0xa81b6d57,0xef5eb576, 0 } },
+ { { 0xc0090000,0xa3815cbc,0xbfbde3be, 0 } }
+};
+static uLD Q[] = {
+ { { 0x40050000,0xc084dd6c,0xce24687f, 0 } },
+ { { 0x40090000,0xe3b9fa2f,0xc95f3793, 0 } },
+ { { 0x400a0000,0xf5420b1b,0x1f9cd5a2, 0 } }
+};
+#endif
+
+long double tanhl(long double x)
+{
+ long double s, z;
+
+#ifdef MINUSZERO
+ if (x == 0.0L)
+ return (x);
+#endif
+ if (isnanl(x))
+ {
+ _SET_ERRNO (EDOM);
+ return x;
+ }
+
+ z = fabsl(x);
+ if (z > 0.5L * MAXLOGL)
+ {
+ _SET_ERRNO (ERANGE);
+ if (x > 0)
+ return (1.0L);
+ else
+ return (-1.0L);
+ }
+ if (z >= 0.625L)
+ {
+ s = expl(2.0*z);
+ z = 1.0L - 2.0/(s + 1.0L);
+ if (x < 0)
+ z = -z;
+ }
+ else
+ {
+ s = x * x;
+ z = polevll( s, P, 3 )/p1evll(s, Q, 3);
+ z = x * s * z;
+ z = x + z;
+ }
+ return (z);
+}
+
libc/mingw/math/tgamma.c
@@ -0,0 +1,265 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "cephes_mconf.h"
+
+#ifdef UNK
+static const uD P[7] = {
+ { { 1.60119522476751861407E-4 } },
+ { { 1.19135147006586384913E-3 } },
+ { { 1.04213797561761569935E-2 } },
+ { { 4.76367800457137231464E-2 } },
+ { { 2.07448227648435975150E-1 } },
+ { { 4.94214826801497100753E-1 } },
+ { { 9.99999999999999996796E-1 } }
+};
+static const uD Q[8] = {
+ { { -2.31581873324120129819E-5 } },
+ { { 5.39605580493303397842E-4 } },
+ { { -4.45641913851797240494E-3 } },
+ { { 1.18139785222060435552E-2 } },
+ { { 3.58236398605498653373E-2 } },
+ { { -2.34591795718243348568E-1 } },
+ { { 7.14304917030273074085E-2 } },
+ { { 1.00000000000000000320E0 } }
+};
+#define MAXGAM 171.624376956302725
+static const double LOGPI = 1.14472988584940017414;
+#endif
+
+#ifdef IBMPC
+static const uD P[7] = {
+ { { 0x2153,0x3998,0xfcb8,0x3f24 } },
+ { { 0xbfab,0xe686,0x84e3,0x3f53 } },
+ { { 0x14b0,0xe9db,0x57cd,0x3f85 } },
+ { { 0x23d3,0x18c4,0x63d9,0x3fa8 } },
+ { { 0x7d31,0xdcae,0x8da9,0x3fca } },
+ { { 0xe312,0x3993,0xa137,0x3fdf } },
+ { { 0x0000,0x0000,0x0000,0x3ff0 } }
+};
+static const uD Q[8] = {
+ { { 0xd3af,0x8400,0x487a,0xbef8 } },
+ { { 0x2573,0x2915,0xae8a,0x3f41 } },
+ { { 0xb44a,0xe750,0x40e4,0xbf72 } },
+ { { 0xb117,0x5b1b,0x31ed,0x3f88 } },
+ { { 0xde67,0xe33f,0x5779,0x3fa2 } },
+ { { 0x87c2,0x9d42,0x071a,0xbfce } },
+ { { 0x3c51,0xc9cd,0x4944,0x3fb2 } },
+ { { 0x0000,0x0000,0x0000,0x3ff0 } }
+};
+#define MAXGAM 171.624376956302725
+#endif
+
+#ifdef MIEEE
+static const uD P[7] = {
+ { { 0x3f24,0xfcb8,0x3998,0x2153 } },
+ { { 0x3f53,0x84e3,0xe686,0xbfab } },
+ { { 0x3f85,0x57cd,0xe9db,0x14b0 } },
+ { { 0x3fa8,0x63d9,0x18c4,0x23d3 } },
+ { { 0x3fca,0x8da9,0xdcae,0x7d31 } },
+ { { 0x3fdf,0xa137,0x3993,0xe312 } },
+ { { 0x3ff0,0x0000,0x0000,0x0000 } }
+};
+static const unsigned short Q[8] = {
+ { { 0xbef8,0x487a,0x8400,0xd3af } },
+ { { 0x3f41,0xae8a,0x2915,0x2573 } },
+ { { 0xbf72,0x40e4,0xe750,0xb44a } },
+ { { 0x3f88,0x31ed,0x5b1b,0xb117 } },
+ { { 0x3fa2,0x5779,0xe33f,0xde67 } },
+ { { 0xbfce,0x071a,0x9d42,0x87c2 } },
+ { { 0x3fb2,0x4944,0xc9cd,0x3c51 } },
+ { { 0x3ff0,0x0000,0x0000,0x0000 } }
+};
+#define MAXGAM 171.624376956302725
+#endif
+
+/* Stirling's formula for the gamma function */
+#if UNK
+static const uD STIR[5] = {
+ { { 7.87311395793093628397E-4 } },
+ { { -2.29549961613378126380E-4 } },
+ { { -2.68132617805781232825E-3 } },
+ { { 3.47222221605458667310E-3 } },
+ { { 8.33333333333482257126E-2 } }
+};
+#define MAXSTIR 143.01608
+static const double SQTPI = 2.50662827463100050242E0;
+#endif
+#if IBMPC
+static const uD STIR[5] = {
+ { { 0x7293,0x592d,0xcc72,0x3f49 } },
+ { { 0x1d7c,0x27e6,0x166b,0xbf2e } },
+ { { 0x4fd7,0x07d4,0xf726,0xbf65 } },
+ { { 0xc5fd,0x1b98,0x71c7,0x3f6c } },
+ { { 0x5986,0x5555,0x5555,0x3fb5 } }
+};
+#define MAXSTIR 143.01608
+
+static const union
+{
+ unsigned short s[4];
+ double d;
+} sqt = {{0x2706,0x1ff6,0x0d93,0x4004}};
+#define SQTPI (sqt.d)
+#endif
+#if MIEEE
+static const uD STIR[5] = {
+ { { 0x3f49,0xcc72,0x592d,0x7293 } },
+ { { 0xbf2e,0x166b,0x27e6,0x1d7c } },
+ { { 0xbf65,0xf726,0x07d4,0x4fd7 } },
+ { { 0x3f6c,0x71c7,0x1b98,0xc5fd } },
+ { { 0x3fb5,0x5555,0x5555,0x5986 } }
+};
+#define MAXSTIR 143.01608
+static const uD SQT = {
+ { { 0x4004,0x0d93,0x1ff6,0x2706 } }
+};
+#define SQTPI SQT.d
+#endif
+
+static double stirf (double);
+
+/* Gamma function computed by Stirling's formula.
+ * The polynomial STIR is valid for 33 <= x <= 172.
+ */
+static double stirf(double x)
+{
+ double y, w, v;
+
+ w = 1.0/x;
+ w = 1.0 + w * polevl(w, STIR, 4);
+ y = exp(x);
+ if (x > MAXSTIR)
+ { /* Avoid overflow in pow() */
+ v = pow(x, 0.5 * x - 0.25);
+ y = v * (v / y);
+ }
+ else
+ {
+ y = pow(x, x - 0.5) / y;
+ }
+ y = SQTPI * y * w;
+ return (y);
+}
+
+
+double __tgamma_r(double x, int *sgngam);
+
+double __tgamma_r(double x, int *sgngam)
+{
+ double p, q, z;
+ int i;
+
+ *sgngam = 1;
+#ifdef NANS
+ if (isnan(x))
+ return (x);
+#endif
+#ifdef INFINITIES
+#ifdef NANS
+ if (x == INFINITY)
+ return (x);
+ if (x == -INFINITY)
+ return (NAN);
+#else
+ if (!isfinite(x))
+ return (x);
+#endif
+#endif
+ q = fabs(x);
+
+ if (q > 33.0)
+ {
+ if (x < 0.0)
+ {
+ p = floor(q);
+ if (p == q)
+ {
+gsing:
+ _SET_ERRNO(EDOM);
+ mtherr("tgamma", SING);
+#ifdef INFINITIES
+ return (INFINITY);
+#else
+ return (MAXNUM);
+#endif
+ }
+ i = p;
+ if ((i & 1) == 0)
+ *sgngam = -1;
+ z = q - p;
+ if (z > 0.5)
+ {
+ p += 1.0;
+ z = q - p;
+ }
+ z = q * sin(PI * z);
+ if (z == 0.0)
+ {
+ _SET_ERRNO(ERANGE);
+ mtherr("tgamma", OVERFLOW);
+#ifdef INFINITIES
+ return (*sgngam * INFINITY);
+#else
+ return (*sgngam * MAXNUM);
+#endif
+ }
+ z = fabs(z);
+ z = PI/(z * stirf(q));
+ }
+ else
+ {
+ z = stirf(x);
+ }
+ return (*sgngam * z);
+ }
+
+ z = 1.0;
+ while (x >= 3.0)
+ {
+ x -= 1.0;
+ z *= x;
+ }
+
+ while (x < 0.0)
+ {
+ if (x > -1.E-9)
+ goto Small;
+ z /= x;
+ x += 1.0;
+ }
+
+ while (x < 2.0)
+ {
+ if (x < 1.e-9)
+ goto Small;
+ z /= x;
+ x += 1.0;
+ }
+
+ if (x == 2.0)
+ return (z);
+
+ x -= 2.0;
+ p = polevl( x, P, 6 );
+ q = polevl( x, Q, 7 );
+ return (z * p / q);
+
+Small:
+ if (x == 0.0)
+ {
+ goto gsing;
+ }
+ else
+ return (z/((1.0 + 0.5772156649015329 * x) * x));
+}
+
+/* This is the C99 version */
+double tgamma(double x)
+{
+ int local_sgngam = 0;
+ return (__tgamma_r(x, &local_sgngam));
+}
+
libc/mingw/math/tgammaf.c
@@ -0,0 +1,194 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "cephes_mconf.h"
+
+/* define MAXGAM 34.84425627277176174 */
+
+/* Stirling's formula for the gamma function
+ * gamma(x) = sqrt(2 pi) x^(x-.5) exp(-x) ( 1 + 1/x P(1/x) )
+ * .028 < 1/x < .1
+ * relative error < 1.9e-11
+ */
+static const float STIR[] = {
+ -2.705194986674176E-003,
+ 3.473255786154910E-003,
+ 8.333331788340907E-002,
+};
+static const float MAXSTIR = 26.77;
+static const float SQTPIF = 2.50662827463100050242; /* sqrt( 2 pi ) */
+
+static float stirf(float);
+
+/* Gamma function computed by Stirling's formula,
+ * sqrt(2 pi) x^(x-.5) exp(-x) (1 + 1/x P(1/x))
+ * The polynomial STIR is valid for 33 <= x <= 172.
+ */
+static float stirf( float x )
+{
+ float y, w, v;
+
+ w = 1.0/x;
+ w = 1.0 + w * polevlf(w, STIR, 2);
+ y = expf(-x);
+ if (x > MAXSTIR)
+ { /* Avoid overflow in pow() */
+ v = powf(x, 0.5 * x - 0.25);
+ y *= v;
+ y *= v;
+ }
+ else
+ {
+ y = powf(x, x - 0.5) * y;
+ }
+ y = SQTPIF * y * w;
+ return (y);
+}
+
+
+/* gamma(x+2), 0 < x < 1 */
+static const float P[] = {
+ 1.536830450601906E-003,
+ 5.397581592950993E-003,
+ 4.130370201859976E-003,
+ 7.232307985516519E-002,
+ 8.203960091619193E-002,
+ 4.117857447645796E-001,
+ 4.227867745131584E-001,
+ 9.999999822945073E-001,
+};
+
+float __tgammaf_r( float x, int* sgngamf);
+
+float __tgammaf_r( float x, int* sgngamf)
+{
+ float p, q, z, nz;
+ int i, direction, negative;
+
+#ifdef NANS
+ if (isnan(x))
+ return (x);
+#endif
+#ifdef INFINITIES
+#ifdef NANS
+ if (x == INFINITYF)
+ return (x);
+ if (x == -INFINITYF)
+ return (NANF);
+#else
+ if (!isfinite(x))
+ return (x);
+#endif
+#endif
+
+ *sgngamf = 1;
+ negative = 0;
+ nz = 0.0;
+ if (x < 0.0)
+ {
+ negative = 1;
+ q = -x;
+ p = floorf(q);
+ if (p == q)
+ {
+gsing:
+ _SET_ERRNO(EDOM);
+ mtherr("tgammaf", SING);
+#ifdef INFINITIES
+ return (INFINITYF);
+#else
+ return (MAXNUMF);
+#endif
+ }
+ i = p;
+ if ((i & 1) == 0)
+ *sgngamf = -1;
+ nz = q - p;
+ if (nz > 0.5)
+ {
+ p += 1.0;
+ nz = q - p;
+ }
+ nz = q * sinf(PIF * nz);
+ if (nz == 0.0)
+ {
+ _SET_ERRNO(ERANGE);
+ mtherr("tgamma", OVERFLOW);
+#ifdef INFINITIES
+ return(*sgngamf * INFINITYF);
+#else
+ return(*sgngamf * MAXNUMF);
+#endif
+ }
+ if (nz < 0)
+ nz = -nz;
+ x = q;
+ }
+ if (x >= 10.0)
+ {
+ z = stirf(x);
+ }
+ if (x < 2.0)
+ direction = 1;
+ else
+ direction = 0;
+ z = 1.0;
+ while (x >= 3.0)
+ {
+ x -= 1.0;
+ z *= x;
+ }
+ /*
+ while (x < 0.0)
+ {
+ if (x > -1.E-4)
+ goto Small;
+ z *=x;
+ x += 1.0;
+ }
+ */
+ while (x < 2.0)
+ {
+ if (x < 1.e-4)
+ goto Small;
+ z *=x;
+ x += 1.0;
+ }
+
+ if (direction)
+ z = 1.0/z;
+
+ if (x == 2.0)
+ return (z);
+
+ x -= 2.0;
+ p = z * polevlf(x, P, 7);
+
+gdone:
+ if (negative)
+ {
+ p = *sgngamf * PIF/(nz * p );
+ }
+ return (p);
+
+Small:
+ if (x == 0.0)
+ {
+ goto gsing;
+ }
+ else
+ {
+ p = z / ((1.0 + 0.5772156649015329 * x) * x);
+ goto gdone;
+ }
+}
+
+/* This is the C99 version */
+float tgammaf(float x)
+{
+ int local_sgngamf = 0;
+ return (__tgammaf_r(x, &local_sgngamf));
+}
+
libc/mingw/math/tgammal.c
@@ -0,0 +1,393 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include "cephes_mconf.h"
+
+/*
+gamma(x+2) = gamma(x+2) P(x)/Q(x)
+0 <= x <= 1
+Relative error
+n=7, d=8
+Peak error = 1.83e-20
+Relative error spread = 8.4e-23
+*/
+
+#if UNK
+static const uLD P[8] = {
+ { { 4.212760487471622013093E-5L } },
+ { { 4.542931960608009155600E-4L } },
+ { { 4.092666828394035500949E-3L } },
+ { { 2.385363243461108252554E-2L } },
+ { { 1.113062816019361559013E-1L } },
+ { { 3.629515436640239168939E-1L } },
+ { { 8.378004301573126728826E-1L } },
+ { { 1.000000000000000000009E0L } }
+};
+static const uLD Q[9] = {
+ { { -1.397148517476170440917E-5L } },
+ { { 2.346584059160635244282E-4L } },
+ { { -1.237799246653152231188E-3L } },
+ { { -7.955933682494738320586E-4L } },
+ { { 2.773706565840072979165E-2L } },
+ { { -4.633887671244534213831E-2L } },
+ { { -2.243510905670329164562E-1L } },
+ { { 4.150160950588455434583E-1L } },
+ { { 9.999999999999999999908E-1L } }
+};
+#endif
+#if IBMPC
+static const uLD P[8] = {
+ { { 0x434a,0x3f22,0x2bda,0xb0b2,0x3ff0, 0x0, 0x0, 0x0 } },
+ { { 0xf5aa,0xe82f,0x335b,0xee2e,0x3ff3, 0x0, 0x0, 0x0 } },
+ { { 0xbe6c,0x3757,0xc717,0x861b,0x3ff7, 0x0, 0x0, 0x0 } },
+ { { 0x7f43,0x5196,0xb166,0xc368,0x3ff9, 0x0, 0x0, 0x0 } },
+ { { 0x9549,0x8eb5,0x8c3a,0xe3f4,0x3ffb, 0x0, 0x0, 0x0 } },
+ { { 0x8d75,0x23af,0xc8e4,0xb9d4,0x3ffd, 0x0, 0x0, 0x0 } },
+ { { 0x29cf,0x19b3,0x16c8,0xd67a,0x3ffe, 0x0, 0x0, 0x0 } },
+ { { 0x0000,0x0000,0x0000,0x8000,0x3fff, 0x0, 0x0, 0x0 } }
+};
+static const uLD Q[9] = {
+ { { 0x5473,0x2de8,0x1268,0xea67,0xbfee, 0x0, 0x0, 0x0 } },
+ { { 0x334b,0xc2f0,0xa2dd,0xf60e,0x3ff2, 0x0, 0x0, 0x0 } },
+ { { 0xbeed,0x1853,0xa691,0xa23d,0xbff5, 0x0, 0x0, 0x0 } },
+ { { 0x296e,0x7cb1,0x5dfd,0xd08f,0xbff4, 0x0, 0x0, 0x0 } },
+ { { 0x0417,0x7989,0xd7bc,0xe338,0x3ff9, 0x0, 0x0, 0x0 } },
+ { { 0x3295,0x3698,0xd580,0xbdcd,0xbffa, 0x0, 0x0, 0x0 } },
+ { { 0x75ef,0x3ab7,0x4ad3,0xe5bc,0xbffc, 0x0, 0x0, 0x0 } },
+ { { 0xe458,0x2ec7,0xfd57,0xd47c,0x3ffd, 0x0, 0x0, 0x0 } },
+ { { 0x0000,0x0000,0x0000,0x8000,0x3fff, 0x0, 0x0, 0x0 } }
+};
+#endif
+#if MIEEE
+static const uLD P[8] = {
+ { { 0x3ff00000,0xb0b22bda,0x3f22434a, 0 } },
+ { { 0x3ff30000,0xee2e335b,0xe82ff5aa, 0 } },
+ { { 0x3ff70000,0x861bc717,0x3757be6c, 0 } },
+ { { 0x3ff90000,0xc368b166,0x51967f43, 0 } },
+ { { 0x3ffb0000,0xe3f48c3a,0x8eb59549, 0 } },
+ { { 0x3ffd0000,0xb9d4c8e4,0x23af8d75, 0 } },
+ { { 0x3ffe0000,0xd67a16c8,0x19b329cf, 0 } },
+ { { 0x3fff0000,0x80000000,0x00000000, 0 } }
+};
+static const uLD Q[9] = {
+ { { 0xbfee0000,0xea671268,0x2de85473, 0 } },
+ { { 0x3ff20000,0xf60ea2dd,0xc2f0334b, 0 } },
+ { { 0xbff50000,0xa23da691,0x1853beed, 0 } },
+ { { 0xbff40000,0xd08f5dfd,0x7cb1296e, 0 } },
+ { { 0x3ff90000,0xe338d7bc,0x79890417, 0 } },
+ { { 0xbffa0000,0xbdcdd580,0x36983295, 0 } },
+ { { 0xbffc0000,0xe5bc4ad3,0x3ab775ef, 0 } },
+ { { 0x3ffd0000,0xd47cfd57,0x2ec7e458, 0 } },
+ { { 0x3fff0000,0x80000000,0x00000000, 0 } }
+};
+#endif
+
+#define MAXGAML 1755.455L
+/*static const long double LOGPI = 1.14472988584940017414L;*/
+
+/* Stirling's formula for the gamma function
+gamma(x) = sqrt(2 pi) x^(x-.5) exp(-x) (1 + 1/x P(1/x))
+z(x) = x
+13 <= x <= 1024
+Relative error
+n=8, d=0
+Peak error = 9.44e-21
+Relative error spread = 8.8e-4
+*/
+#if UNK
+static const uLD STIR[9] = {
+ { { 7.147391378143610789273E-4L } },
+ { { -2.363848809501759061727E-5L } },
+ { { -5.950237554056330156018E-4L } },
+ { { 6.989332260623193171870E-5L } },
+ { { 7.840334842744753003862E-4L } },
+ { { -2.294719747873185405699E-4L } },
+ { { -2.681327161876304418288E-3L } },
+ { { 3.472222222230075327854E-3L } },
+ { { 8.333333333333331800504E-2L } }
+};
+#endif
+#if IBMPC
+static const uLD STIR[9] = {
+ { { 0x6ede,0x69f7,0x54e3,0xbb5d,0x3ff4, 0, 0, 0 } },
+ { { 0xc395,0x0295,0x4443,0xc64b,0xbfef, 0, 0, 0 } },
+ { { 0xba6f,0x7c59,0x5e47,0x9bfb,0xbff4, 0, 0, 0 } },
+ { { 0x5704,0x1a39,0xb11d,0x9293,0x3ff1, 0, 0, 0 } },
+ { { 0x30b7,0x1a21,0x98b2,0xcd87,0x3ff4, 0, 0, 0 } },
+ { { 0xbef3,0x7023,0x6a08,0xf09e,0xbff2, 0, 0, 0 } },
+ { { 0x3a1c,0x5ac8,0x3478,0xafb9,0xbff6, 0, 0, 0 } },
+ { { 0xc3c9,0x906e,0x38e3,0xe38e,0x3ff6, 0, 0, 0 } },
+ { { 0xa1d5,0xaaaa,0xaaaa,0xaaaa,0x3ffb, 0, 0, 0 } }
+};
+#endif
+#if MIEEE
+static const uLD STIR[9] = {
+ { { 0x3ff40000,0xbb5d54e3,0x69f76ede, 0 } },
+ { { 0xbfef0000,0xc64b4443,0x0295c395, 0 } },
+ { { 0xbff40000,0x9bfb5e47,0x7c59ba6f, 0 } },
+ { { 0x3ff10000,0x9293b11d,0x1a395704, 0 } },
+ { { 0x3ff40000,0xcd8798b2,0x1a2130b7, 0 } },
+ { { 0xbff20000,0xf09e6a08,0x7023bef3, 0 } },
+ { { 0xbff60000,0xafb93478,0x5ac83a1c, 0 } },
+ { { 0x3ff60000,0xe38e38e3,0x906ec3c9, 0 } },
+ { { 0x3ffb0000,0xaaaaaaaa,0xaaaaa1d5, 0 } }
+};
+#endif
+#define MAXSTIR 1024.0L
+static const long double SQTPI = 2.50662827463100050242E0L;
+
+/* 1/gamma(x) = z P(z)
+ * z(x) = 1/x
+ * 0 < x < 0.03125
+ * Peak relative error 4.2e-23
+ */
+#if UNK
+static const uLD S[9] = {
+ { { -1.193945051381510095614E-3L } },
+ { { 7.220599478036909672331E-3L } },
+ { { -9.622023360406271645744E-3L } },
+ { { -4.219773360705915470089E-2L } },
+ { { 1.665386113720805206758E-1L } },
+ { { -4.200263503403344054473E-2L } },
+ { { -6.558780715202540684668E-1L } },
+ { { 5.772156649015328608253E-1L } },
+ { { 1.000000000000000000000E0L } }
+};
+#endif
+#if IBMPC
+static const uLD S[9] = {
+ { { 0xbaeb,0xd6d3,0x25e5,0x9c7e,0xbff5, 0, 0, 0 } },
+ { { 0xfe9a,0xceb4,0xc74e,0xec9a,0x3ff7, 0, 0, 0 } },
+ { { 0x9225,0xdfef,0xb0e9,0x9da5,0xbff8, 0, 0, 0 } },
+ { { 0x10b0,0xec17,0x87dc,0xacd7,0xbffa, 0, 0, 0 } },
+ { { 0x6b8d,0x7515,0x1905,0xaa89,0x3ffc, 0, 0, 0 } },
+ { { 0xf183,0x126b,0xf47d,0xac0a,0xbffa, 0, 0, 0 } },
+ { { 0x7bf6,0x57d1,0xa013,0xa7e7,0xbffe, 0, 0, 0 } },
+ { { 0xc7a9,0x7db0,0x67e3,0x93c4,0x3ffe, 0, 0, 0 } },
+ { { 0x0000,0x0000,0x0000,0x8000,0x3fff, 0, 0, 0 } }
+};
+#endif
+#if MIEEE
+static const long S[9] = {
+ { { 0xbff50000,0x9c7e25e5,0xd6d3baeb, 0 } },
+ { { 0x3ff70000,0xec9ac74e,0xceb4fe9a, 0 } },
+ { { 0xbff80000,0x9da5b0e9,0xdfef9225, 0 } },
+ { { 0xbffa0000,0xacd787dc,0xec1710b0, 0 } },
+ { { 0x3ffc0000,0xaa891905,0x75156b8d, 0 } },
+ { { 0xbffa0000,0xac0af47d,0x126bf183, 0 } },
+ { { 0xbffe0000,0xa7e7a013,0x57d17bf6, 0 } },
+ { { 0x3ffe0000,0x93c467e3,0x7db0c7a9, 0 } },
+ { { 0x3fff0000,0x80000000,0x00000000, 0 } }
+};
+#endif
+/* 1/gamma(-x) = z P(z)
+ * z(x) = 1/x
+ * 0 < x < 0.03125
+ * Peak relative error 5.16e-23
+ * Relative error spread = 2.5e-24
+ */
+#if UNK
+static const uLD SN[9] = {
+ { { 1.133374167243894382010E-3L } },
+ { { 7.220837261893170325704E-3L } },
+ { { 9.621911155035976733706E-3L } },
+ { { -4.219773343731191721664E-2L } },
+ { { -1.665386113944413519335E-1L } },
+ { { -4.200263503402112910504E-2L } },
+ { { 6.558780715202536547116E-1L } },
+ { { 5.772156649015328608727E-1L } },
+ { { -1.000000000000000000000E0L } }
+};
+#endif
+#if IBMPC
+static const uLD SN[9] = {
+ { { 0x5dd1,0x02de,0xb9f7,0x948d,0x3ff5, 0, 0, 0 } },
+ { { 0x989b,0xdd68,0xc5f1,0xec9c,0x3ff7, 0, 0, 0 } },
+ { { 0x2ca1,0x18f0,0x386f,0x9da5,0x3ff8, 0, 0, 0 } },
+ { { 0x783f,0x41dd,0x87d1,0xacd7,0xbffa, 0, 0, 0 } },
+ { { 0x7a5b,0xd76d,0x1905,0xaa89,0xbffc, 0, 0, 0 } },
+ { { 0x7f64,0x1234,0xf47d,0xac0a,0xbffa, 0, 0, 0 } },
+ { { 0x5e26,0x57d1,0xa013,0xa7e7,0x3ffe, 0, 0, 0 } },
+ { { 0xc7aa,0x7db0,0x67e3,0x93c4,0x3ffe, 0, 0, 0 } },
+ { { 0x0000,0x0000,0x0000,0x8000,0xbfff, 0, 0, 0 } }
+};
+#endif
+#if MIEEE
+static const uLD SN[9] = {
+ { { 0x3ff50000,0x948db9f7,0x02de5dd1, 0 } },
+ { { 0x3ff70000,0xec9cc5f1,0xdd68989b, 0 } },
+ { { 0x3ff80000,0x9da5386f,0x18f02ca1, 0 } },
+ { { 0xbffa0000,0xacd787d1,0x41dd783f, 0 } },
+ { { 0xbffc0000,0xaa891905,0xd76d7a5b, 0 } },
+ { { 0xbffa0000,0xac0af47d,0x12347f64, 0 } },
+ { { 0x3ffe0000,0xa7e7a013,0x57d15e26, 0 } },
+ { { 0x3ffe0000,0x93c467e3,0x7db0c7aa, 0 } },
+ { { 0xbfff0000,0x80000000,0x00000000, 0 } }
+};
+#endif
+
+static long double stirf (long double);
+
+/* Gamma function computed by Stirling's formula. */
+
+static long double stirf(long double x)
+{
+ long double y, w, v;
+
+ w = 1.0L/x;
+ /* For large x, use rational coefficients from the analytical expansion. */
+ if (x > 1024.0L)
+ w = (((((6.97281375836585777429E-5L * w
+ + 7.84039221720066627474E-4L) * w
+ - 2.29472093621399176955E-4L) * w
+ - 2.68132716049382716049E-3L) * w
+ + 3.47222222222222222222E-3L) * w
+ + 8.33333333333333333333E-2L) * w
+ + 1.0L;
+ else
+ w = 1.0L + w * polevll( w, STIR, 8 );
+ y = expl(x);
+ if (x > MAXSTIR)
+ { /* Avoid overflow in pow() */
+ v = powl(x, 0.5L * x - 0.25L);
+ y = v * (v / y);
+ }
+ else
+ {
+ y = powl(x, x - 0.5L) / y;
+ }
+ y = SQTPI * y * w;
+ return (y);
+}
+
+long double __tgammal_r(long double, int *);
+
+long double __tgammal_r(long double x, int* sgngaml)
+{
+ long double p, q, z;
+ int i;
+
+ *sgngaml = 1;
+#ifdef NANS
+ if (isnanl(x))
+ return (NANL);
+#endif
+#ifdef INFINITIES
+#ifdef NANS
+ if (x == INFINITYL)
+ return (x);
+ if (x == -INFINITYL)
+ return (NANL);
+#else
+ if (!isfinite(x))
+ return (x);
+#endif
+#endif
+ q = fabsl(x);
+
+ if (q > 13.0L)
+ {
+ if (q > MAXGAML)
+ goto goverf;
+ if (x < 0.0L)
+ {
+ p = floorl(q);
+ if (p == q)
+ {
+gsing:
+ _SET_ERRNO(EDOM);
+ mtherr("tgammal", SING);
+#ifdef INFINITIES
+ return (INFINITYL);
+#else
+ return (*sgngaml * MAXNUML);
+#endif
+ }
+ i = p;
+ if ((i & 1) == 0)
+ *sgngaml = -1;
+ z = q - p;
+ if (z > 0.5L)
+ {
+ p += 1.0L;
+ z = q - p;
+ }
+ z = q * sinl(PIL * z);
+ z = fabsl(z) * stirf(q);
+ if (z <= PIL/MAXNUML)
+ {
+goverf:
+ _SET_ERRNO(ERANGE);
+ mtherr("tgammal", OVERFLOW);
+#ifdef INFINITIES
+ return(*sgngaml * INFINITYL);
+#else
+ return(*sgngaml * MAXNUML);
+#endif
+ }
+ z = PIL/z;
+ }
+ else
+ {
+ z = stirf(x);
+ }
+ return (*sgngaml * z);
+ }
+
+ z = 1.0L;
+ while (x >= 3.0L)
+ {
+ x -= 1.0L;
+ z *= x;
+ }
+
+ while (x < -0.03125L)
+ {
+ z /= x;
+ x += 1.0L;
+ }
+
+ if (x <= 0.03125L)
+ goto Small;
+
+ while (x < 2.0L)
+ {
+ z /= x;
+ x += 1.0L;
+ }
+
+ if (x == 2.0L)
+ return (z);
+
+ x -= 2.0L;
+ p = polevll( x, P, 7 );
+ q = polevll( x, Q, 8 );
+ return (z * p / q);
+
+Small:
+ if (x == 0.0L)
+ {
+ goto gsing;
+ }
+ else
+ {
+ if (x < 0.0L)
+ {
+ x = -x;
+ q = z / (x * polevll(x, SN, 8));
+ }
+ else
+ q = z / (x * polevll(x, S, 8));
+ }
+ return q;
+}
+
+/* This is the C99 version. */
+long double tgammal(long double x)
+{
+ int local_sgngaml = 0;
+ return (__tgammal_r(x, &local_sgngaml));
+}
+
libc/mingw/math/truncl.c
@@ -0,0 +1,26 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <fenv.h>
+#include <math.h>
+
+long double
+truncl (long double _x)
+{
+#if defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__)
+ return trunc(_x);
+#else
+ long double retval = 0.0L;
+ unsigned short saved_cw;
+ unsigned short tmp_cw;
+ __asm__ __volatile__ ("fnstcw %0;" : "=m" (saved_cw)); /* save FPU control word */
+ tmp_cw = (saved_cw & ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO))
+ | FE_TOWARDZERO;
+ __asm__ __volatile__ ("fldcw %0;" : : "m" (tmp_cw));
+ __asm__ __volatile__ ("frndint;" : "=t" (retval) : "0" (_x)); /* round towards zero */
+ __asm__ __volatile__ ("fldcw %0;" : : "m" (saved_cw) ); /* restore saved control word */
+ return retval;
+#endif /* defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) */
+}
libc/mingw/misc/alarm.c
@@ -0,0 +1,14 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <_mingw.h>
+
+unsigned int alarm(unsigned int);
+
+unsigned int alarm(unsigned int __UNUSED_PARAM(seconds))
+{
+ return 0;
+}
libc/mingw/misc/assert.c
@@ -0,0 +1,31 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <signal.h>
+
+void __cdecl _wassert (const wchar_t *, const wchar_t *,unsigned);
+void __cdecl _assert (const char *, const char *, unsigned);
+
+void __cdecl
+_assert (const char *_Message, const char *_File, unsigned _Line)
+{
+ wchar_t *m, *f;
+ int i;
+ m = (wchar_t *) malloc ((strlen (_Message) + 1) * sizeof (wchar_t));
+ f = (wchar_t *) malloc ((strlen (_File) + 1) * sizeof (wchar_t));
+ for (i = 0; _Message[i] != 0; i++)
+ m[i] = ((wchar_t) _Message[i]) & 0xff;
+ m[i] = 0;
+ for (i = 0; _File[i] != 0; i++)
+ f[i] = ((wchar_t) _File[i]) & 0xff;
+ f[i] = 0;
+ _wassert (m, f, _Line);
+ free (m);
+ free (f);
+}
libc/mingw/misc/basename.c
@@ -0,0 +1,135 @@
+/* basename.c
+ *
+ * $Id: basename.c,v 1.2 2007/03/08 23:15:58 keithmarshall Exp $
+ *
+ * Provides an implementation of the "basename" function, conforming
+ * to SUSv3, with extensions to accommodate Win32 drive designators,
+ * and suitable for use on native Microsoft(R) Win32 platforms.
+ *
+ * Written by Keith Marshall <keithmarshall@users.sourceforge.net>
+ *
+ * This is free software. You may redistribute and/or modify it as you
+ * see fit, without restriction of copyright.
+ *
+ * This software is provided "as is", in the hope that it may be useful,
+ * but WITHOUT WARRANTY OF ANY KIND, not even any implied warranty of
+ * MERCHANTABILITY, nor of FITNESS FOR ANY PARTICULAR PURPOSE. At no
+ * time will the author accept any form of liability for any damages,
+ * however caused, resulting from the use of this software.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libgen.h>
+#include <locale.h>
+
+#ifndef __cdecl
+#define __cdecl
+#endif
+
+char * __cdecl
+basename (char *path)
+{
+ static char *retfail = NULL;
+ size_t len;
+ /* to handle path names for files in multibyte character locales,
+ * we need to set up LC_CTYPE to match the host file system locale
+ */
+ char *locale = setlocale (LC_CTYPE, NULL);
+
+ if (locale != NULL)
+ locale = strdup (locale);
+ setlocale (LC_CTYPE, "");
+
+ if (path && *path)
+ {
+ /* allocate sufficient local storage space,
+ * in which to create a wide character reference copy of path
+ */
+ wchar_t refcopy[1 + (len = mbstowcs (NULL, path, 0))];
+ /* create the wide character reference copy of path,
+ * and step over the drive designator, if present ...
+ */
+ wchar_t *refpath = refcopy;
+
+ if ((len = mbstowcs( refpath, path, len)) > 1 && refpath[1] == L':')
+ {
+ /* FIXME: maybe should confirm *refpath is a valid drive designator */
+ refpath += 2;
+ }
+ /* ensure that our wide character reference path is NUL terminated */
+ refcopy[len] = L'\0';
+ /* check again, just to ensure we still have a non-empty path name ... */
+ if (*refpath)
+ {
+ /* and, when we do, process it in the wide character domain ...
+ * scanning from left to right, to the char after the final dir separator. */
+ wchar_t *refname;
+
+ for (refname = refpath; *refpath; ++refpath)
+ {
+ if (*refpath == L'/' || *refpath == L'\\')
+ {
+ /* we found a dir separator ...
+ * step over it, and any others which immediately follow it. */
+ while (*refpath == L'/' || *refpath == L'\\')
+ ++refpath;
+ /* if we didn't reach the end of the path string ... */
+ if (*refpath)
+ /* then we have a new candidate for the base name. */
+ refname = refpath;
+ /* otherwise ...
+ * strip off any trailing dir separators which we found. */
+ else
+ while (refpath > refname
+ && (*--refpath == L'/' || *refpath == L'\\') )
+ *refpath = L'\0';
+ }
+ }
+ /* in the wide character domain ...
+ * refname now points at the resolved base name ... */
+ if (*refname)
+ {
+ /* if it's not empty,
+ * then we transform the full normalised path back into
+ * the multibyte character domain, and skip over the dirname,
+ * to return the resolved basename. */
+ if ((len = wcstombs( path, refcopy, len)) != (size_t)(-1))
+ path[len] = '\0';
+ *refname = L'\0';
+ if ((len = wcstombs( NULL, refcopy, 0 )) != (size_t)(-1))
+ path += len;
+ }
+ else
+ {
+ /* the basename is empty, so return the default value of "/",
+ * transforming from wide char to multibyte char domain, and
+ * returning it in our own buffer. */
+ retfail = realloc (retfail, len = 1 + wcstombs (NULL, L"/", 0));
+ wcstombs (path = retfail, L"/", len);
+ }
+ /* restore the caller's locale, clean up, and return the result */
+ setlocale (LC_CTYPE, locale);
+ free (locale);
+ return path;
+ }
+ /* or we had an empty residual path name, after the drive designator,
+ * in which case we simply fall through ... */
+ }
+ /* and, if we get to here ...
+ * the path name is either NULL, or it decomposes to an empty string;
+ * in either case, we return the default value of "." in our own buffer,
+ * reloading it with the correct value, transformed from the wide char
+ * to the multibyte char domain, just in case the caller trashed it
+ * after a previous call.
+ */
+ retfail = realloc (retfail, len = 1 + wcstombs( NULL, L".", 0));
+ wcstombs (retfail, L".", len);
+
+ /* restore the caller's locale, clean up, and return the result. */
+ setlocale (LC_CTYPE, locale);
+ free (locale);
+ return retfail;
+}
libc/mingw/misc/btowc.c
@@ -0,0 +1,26 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include "mb_wc_common.h"
+#include <wchar.h>
+#include <stdio.h>
+#include <windows.h>
+
+wint_t btowc (int c)
+{
+ if (c == EOF)
+ return (WEOF);
+ else
+ {
+ unsigned char ch = c;
+ wchar_t wc = WEOF;
+ MultiByteToWideChar (___lc_codepage_func(), MB_ERR_INVALID_CHARS,
+ (char*)&ch, 1, &wc, 1);
+ return wc;
+ }
+}
libc/mingw/misc/delay-f.c
@@ -0,0 +1,13 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include <windows.h>
+#include <delayimp.h>
+
+PfnDliHook __pfnDliFailureHook2 = NULL;
libc/mingw/misc/delay-n.c
@@ -0,0 +1,13 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include <windows.h>
+#include <delayimp.h>
+
+PfnDliHook __pfnDliNotifyHook2 = NULL;
libc/mingw/misc/delayimp.c
@@ -0,0 +1,279 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ *
+ * This file is derived from Microsoft implementation file delayhlp.cpp, which
+ * is free for users to modify and derive.
+ */
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include <windows.h>
+#include <delayimp.h>
+
+static size_t __strlen(const char *sz)
+{
+ const char *szEnd = sz;
+ while(*szEnd++ != 0)
+ ;
+ return szEnd - sz - 1;
+}
+
+static int __memcmp(const void *pv1,const void *pv2,size_t cb)
+{
+ if(!cb)
+ return 0;
+ while(--cb && *(char *)pv1 == *(char *)pv2) {
+ pv1 = ((char *)pv1) + 1;
+ pv2 = ((char *)pv2) + 1;
+ }
+ return *((unsigned char *)pv1) - *((unsigned char *)pv2);
+}
+
+static void *__memcpy(void *pvDst,const void *pvSrc,size_t cb)
+{
+ void *pvRet = pvDst;
+ while(cb--) {
+ *(char *)pvDst = *(char *)pvSrc;
+ pvDst = ((char *)pvDst) + 1;
+ pvSrc = ((char *)pvSrc) + 1;
+ }
+ return pvRet;
+}
+
+static unsigned IndexFromPImgThunkData(PCImgThunkData pitdCur,PCImgThunkData pitdBase)
+{
+ return (unsigned) (pitdCur - pitdBase);
+}
+
+#define __ImageBase __MINGW_LSYMBOL(_image_base__)
+extern IMAGE_DOS_HEADER __ImageBase;
+
+#define PtrFromRVA(RVA) (((PBYTE)&__ImageBase) + (RVA))
+
+typedef struct UnloadInfo *PUnloadInfo;
+typedef struct UnloadInfo {
+ PUnloadInfo puiNext;
+ PCImgDelayDescr pidd;
+} UnloadInfo;
+
+static unsigned CountOfImports(PCImgThunkData pitdBase)
+{
+ unsigned cRet = 0;
+ PCImgThunkData pitd = pitdBase;
+ while(pitd->u1.Function) {
+ pitd++;
+ cRet++;
+ }
+ return cRet;
+}
+
+PUnloadInfo __puiHead = 0;
+
+static UnloadInfo *add_ULI(PCImgDelayDescr pidd_)
+{
+ UnloadInfo *ret = (UnloadInfo *) LocalAlloc(LPTR,sizeof(UnloadInfo));
+ ret->pidd = pidd_;
+ ret->puiNext = __puiHead;
+ __puiHead = ret;
+ return ret;
+}
+
+static void del_ULI(UnloadInfo *p)
+{
+ if (p) {
+ PUnloadInfo *ppui = &__puiHead;
+ while(*ppui && *ppui!=p) {
+ ppui = &((*ppui)->puiNext);
+ }
+ if(*ppui==p) *ppui = p->puiNext;
+ LocalFree((void *)p);
+ }
+}
+
+typedef struct InternalImgDelayDescr {
+ DWORD grAttrs;
+ LPCSTR szName;
+ HMODULE *phmod;
+ PImgThunkData pIAT;
+ PCImgThunkData pINT;
+ PCImgThunkData pBoundIAT;
+ PCImgThunkData pUnloadIAT;
+ DWORD dwTimeStamp;
+} InternalImgDelayDescr;
+
+typedef InternalImgDelayDescr *PIIDD;
+typedef const InternalImgDelayDescr *PCIIDD;
+
+static PIMAGE_NT_HEADERS WINAPI PinhFromImageBase(HMODULE hmod)
+{
+ return (PIMAGE_NT_HEADERS) (((PBYTE)(hmod)) + ((PIMAGE_DOS_HEADER)(hmod))->e_lfanew);
+}
+
+static void WINAPI OverlayIAT(PImgThunkData pitdDst,PCImgThunkData pitdSrc)
+{
+ __memcpy(pitdDst,pitdSrc,CountOfImports(pitdDst) * sizeof(IMAGE_THUNK_DATA));
+}
+
+static DWORD WINAPI TimeStampOfImage(PIMAGE_NT_HEADERS pinh)
+{
+ return pinh->FileHeader.TimeDateStamp;
+}
+
+static int WINAPI FLoadedAtPreferredAddress(PIMAGE_NT_HEADERS pinh,HMODULE hmod)
+{
+ return ((UINT_PTR)(hmod)) == pinh->OptionalHeader.ImageBase;
+}
+
+#if(defined(_X86_) && !defined(__x86_64))
+#undef InterlockedExchangePointer
+#define InterlockedExchangePointer(Target,Value) (PVOID)(LONG_PTR)InterlockedExchange((PLONG)(Target),(LONG)(LONG_PTR)(Value))
+/*typedef unsigned long *PULONG_PTR;*/
+#endif
+
+FARPROC WINAPI __delayLoadHelper2(PCImgDelayDescr pidd,FARPROC *ppfnIATEntry);
+
+FARPROC WINAPI __delayLoadHelper2(PCImgDelayDescr pidd,FARPROC *ppfnIATEntry)
+{
+ InternalImgDelayDescr idd = {
+ pidd->grAttrs,(LPCTSTR) PtrFromRVA(pidd->rvaDLLName),(HMODULE *) PtrFromRVA(pidd->rvaHmod),
+ (PImgThunkData) PtrFromRVA(pidd->rvaIAT), (PCImgThunkData) PtrFromRVA(pidd->rvaINT),
+ (PCImgThunkData) PtrFromRVA(pidd->rvaBoundIAT), (PCImgThunkData) PtrFromRVA(pidd->rvaUnloadIAT),
+ pidd->dwTimeStamp};
+ DelayLoadInfo dli = {
+ sizeof(DelayLoadInfo),pidd,ppfnIATEntry,idd.szName,{ 0, { NULL } },0,0,0
+ };
+ HMODULE hmod;
+ unsigned iIAT, iINT;
+ PCImgThunkData pitd;
+ FARPROC pfnRet;
+
+ if(!(idd.grAttrs & dlattrRva)) {
+ PDelayLoadInfo rgpdli[1] = { &dli};
+ RaiseException(VcppException(ERROR_SEVERITY_ERROR,ERROR_INVALID_PARAMETER),0,1,(PULONG_PTR)(rgpdli));
+ return 0;
+ }
+ hmod = *idd.phmod;
+ iIAT = IndexFromPImgThunkData((PCImgThunkData)(ppfnIATEntry),idd.pIAT);
+ iINT = iIAT;
+ pitd = &(idd.pINT[iINT]);
+
+ dli.dlp.fImportByName = !IMAGE_SNAP_BY_ORDINAL(pitd->u1.Ordinal);
+ if(dli.dlp.fImportByName)
+ dli.dlp.szProcName =
+ (LPCSTR)
+ (
+ ((PIMAGE_IMPORT_BY_NAME) PtrFromRVA(
+ (RVA)((UINT_PTR)(pitd->u1.AddressOfData))
+ )
+ )->Name
+ );
+ else dli.dlp.dwOrdinal = (DWORD)(IMAGE_ORDINAL(pitd->u1.Ordinal));
+ pfnRet = NULL;
+ if(__pfnDliNotifyHook2) {
+ pfnRet = ((*__pfnDliNotifyHook2)(dliStartProcessing,&dli));
+ if(pfnRet!=NULL) goto HookBypass;
+ }
+ if(hmod==0) {
+ if(__pfnDliNotifyHook2)
+ hmod = (HMODULE) (((*__pfnDliNotifyHook2)(dliNotePreLoadLibrary,&dli)));
+ if(hmod==0) hmod = LoadLibrary(dli.szDll);
+ if(hmod==0) {
+ dli.dwLastError = GetLastError();
+ if(__pfnDliFailureHook2)
+ hmod = (HMODULE) ((*__pfnDliFailureHook2)(dliFailLoadLib,&dli));
+ if(hmod==0) {
+ PDelayLoadInfo rgpdli[1] = { &dli};
+ RaiseException(VcppException(ERROR_SEVERITY_ERROR,ERROR_MOD_NOT_FOUND),0,1,(PULONG_PTR)(rgpdli));
+ return dli.pfnCur;
+ }
+ }
+ HMODULE hmodT = (HMODULE)(InterlockedExchangePointer((PVOID *) idd.phmod,(PVOID)(hmod)));
+ if(hmodT!=hmod) {
+ if(pidd->rvaUnloadIAT) add_ULI(pidd);
+ } else FreeLibrary(hmod);
+ }
+ dli.hmodCur = hmod;
+ if(__pfnDliNotifyHook2) pfnRet = (*__pfnDliNotifyHook2)(dliNotePreGetProcAddress,&dli);
+ if(pfnRet==0) {
+ if(pidd->rvaBoundIAT && pidd->dwTimeStamp) {
+ PIMAGE_NT_HEADERS pinh = (PIMAGE_NT_HEADERS) (PinhFromImageBase(hmod));
+ if(pinh->Signature==IMAGE_NT_SIGNATURE &&
+ TimeStampOfImage(pinh)==idd.dwTimeStamp &&
+ FLoadedAtPreferredAddress(pinh,hmod)) {
+ pfnRet = (FARPROC) ((UINT_PTR)(idd.pBoundIAT[iIAT].u1.Function));
+ if(pfnRet!=0) goto SetEntryHookBypass;
+ }
+ }
+ pfnRet = GetProcAddress(hmod,dli.dlp.szProcName);
+ }
+ if(!pfnRet) {
+ dli.dwLastError = GetLastError();
+ if(__pfnDliFailureHook2) pfnRet = (*__pfnDliFailureHook2)(dliFailGetProc,&dli);
+ if(!pfnRet) {
+ PDelayLoadInfo rgpdli[1] = { &dli};
+ RaiseException(VcppException(ERROR_SEVERITY_ERROR,ERROR_PROC_NOT_FOUND),0,1,(PULONG_PTR)(rgpdli));
+ pfnRet = dli.pfnCur;
+ }
+ }
+SetEntryHookBypass:
+ *ppfnIATEntry = pfnRet;
+HookBypass:
+ if(__pfnDliNotifyHook2) {
+ dli.dwLastError = 0;
+ dli.hmodCur = hmod;
+ dli.pfnCur = pfnRet;
+ (*__pfnDliNotifyHook2)(dliNoteEndProcessing,&dli);
+ }
+ return pfnRet;
+}
+
+WINBOOL WINAPI __FUnloadDelayLoadedDLL2(LPCSTR szDll)
+{
+ WINBOOL fRet = FALSE;
+ PUnloadInfo pui = __puiHead;
+
+ for(pui = __puiHead;pui;pui = pui->puiNext) {
+ LPCSTR szName = (LPCTSTR) PtrFromRVA(pui->pidd->rvaDLLName);
+ size_t cbName = __strlen(szName);
+ if(cbName==__strlen(szDll) && __memcmp(szDll,szName,cbName)==0) break;
+ }
+ if(pui && pui->pidd->rvaUnloadIAT) {
+ PCImgDelayDescr pidd = pui->pidd;
+ HMODULE *phmod = (HMODULE *) PtrFromRVA(pidd->rvaHmod);
+ HMODULE hmod = *phmod;
+ OverlayIAT((PImgThunkData) PtrFromRVA(pidd->rvaIAT), (PCImgThunkData) PtrFromRVA(pidd->rvaUnloadIAT));
+ FreeLibrary(hmod);
+ *phmod = NULL;
+ del_ULI((UnloadInfo *) pui);
+ fRet = TRUE;
+ }
+ return fRet;
+}
+
+HRESULT WINAPI __HrLoadAllImportsForDll(LPCSTR szDll)
+{
+ HRESULT hrRet = HRESULT_FROM_WIN32(ERROR_MOD_NOT_FOUND);
+ PIMAGE_NT_HEADERS pinh = PinhFromImageBase((HMODULE) (&__ImageBase));
+ if(pinh->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT].Size) {
+ PCImgDelayDescr pidd;
+ pidd = (PCImgDelayDescr) PtrFromRVA(pinh->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT].VirtualAddress);
+ while(pidd->rvaDLLName) {
+ LPCSTR szDllCur = (LPCSTR) PtrFromRVA(pidd->rvaDLLName);
+ size_t cchDllCur = __strlen(szDllCur);
+ if(cchDllCur==__strlen(szDll) && __memcmp(szDll,szDllCur,cchDllCur)==0) break;
+ pidd++;
+ }
+ if(pidd->rvaDLLName) {
+ FARPROC *ppfnIATEntry = (FARPROC *) PtrFromRVA(pidd->rvaIAT);
+ size_t cpfnIATEntries = CountOfImports((PCImgThunkData) (ppfnIATEntry));
+ FARPROC *ppfnIATEntryMax = ppfnIATEntry + cpfnIATEntries;
+ for(;ppfnIATEntry < ppfnIATEntryMax;ppfnIATEntry++) {
+ __delayLoadHelper2(pidd,ppfnIATEntry);
+ }
+ hrRet = S_OK;
+ }
+ }
+ return hrRet;
+}
libc/mingw/misc/difftime.c
@@ -0,0 +1,21 @@
+#define __CRT__NO_INLINE
+#include <time.h>
+#include <memory.h>
+
+/* FIXME: Relying on _USE_32BIT_TIME_T, which is a user-macro,
+during CRT compilation is plainly broken. Need an appropriate
+implementation to provide users the ability of compiling the
+CRT only with 32-bit time_t behavior. */
+
+#ifndef _USE_32BIT_TIME_T
+double __cdecl difftime(time_t _Time1,time_t _Time2)
+{
+ return _difftime64(_Time1,_Time2);
+}
+#else
+double __cdecl difftime(time_t _Time1,time_t _Time2)
+{
+ return _difftime32(_Time1,_Time2);
+}
+#endif
+
libc/mingw/misc/difftime32.c
@@ -0,0 +1,9 @@
+#include <time.h>
+
+double __cdecl _difftime32(__time32_t _Time1,__time32_t _Time2)
+{
+ __time32_t r = _Time1 - _Time2;
+ if (r > _Time1)
+ return -((double) (_Time2 - _Time1));
+ return (double) r;
+}
libc/mingw/misc/difftime64.c
@@ -0,0 +1,9 @@
+#include <time.h>
+
+double __cdecl _difftime64(__time64_t _Time1,__time64_t _Time2)
+{
+ __time64_t r = _Time1 - _Time2;
+ if (r > _Time1)
+ return -((double) (_Time2 - _Time1));
+ return (double) r;
+}
libc/mingw/misc/dirent.c
@@ -0,0 +1,325 @@
+/*
+ * dirent.c
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within the package.
+ *
+ * Derived from DIRLIB.C by Matt J. Weinstein
+ * This note appears in the DIRLIB.H
+ * DIRLIB.H by M. J. Weinstein Released to public domain 1-Jan-89
+ *
+ * Updated by Jeremy Bettis <jeremy@hksys.com>
+ * Significantly revised and rewinddir, seekdir and telldir added by Colin
+ * Peters <colin@fu.is.saga-u.ac.jp>
+ *
+ */
+
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+
+#include <stdlib.h>
+#include <errno.h>
+#include <string.h>
+#include <io.h>
+#include <direct.h>
+#include <dirent.h>
+
+#include <windows.h> /* for GetFileAttributes */
+
+#include <tchar.h>
+#define SUFFIX _T("*")
+#define SLASH _T("\\")
+
+
+/*
+ * opendir
+ *
+ * Returns a pointer to a DIR structure appropriately filled in to begin
+ * searching a directory.
+ */
+_TDIR *
+_topendir (const _TCHAR *szPath)
+{
+ _TDIR *nd;
+ unsigned int rc;
+ _TCHAR szFullPath[MAX_PATH];
+
+ errno = 0;
+
+ if (!szPath)
+ {
+ errno = EFAULT;
+ return (_TDIR *) 0;
+ }
+
+ if (szPath[0] == _T('\0'))
+ {
+ errno = ENOTDIR;
+ return (_TDIR *) 0;
+ }
+
+ /* Attempt to determine if the given path really is a directory. */
+ rc = GetFileAttributes (szPath);
+ if (rc == INVALID_FILE_ATTRIBUTES)
+ {
+ /* call GetLastError for more error info */
+ errno = ENOENT;
+ return (_TDIR *) 0;
+ }
+ if (!(rc & FILE_ATTRIBUTE_DIRECTORY))
+ {
+ /* Error, entry exists but not a directory. */
+ errno = ENOTDIR;
+ return (_TDIR *) 0;
+ }
+
+ /* Make an absolute pathname. */
+ _tfullpath (szFullPath, szPath, MAX_PATH);
+
+ /* Allocate enough space to store DIR structure and the complete
+ * directory path given. */
+ nd = (_TDIR *) malloc (sizeof (_TDIR) + (_tcslen (szFullPath)
+ + _tcslen (SLASH)
+ + _tcslen (SUFFIX) + 1)
+ * sizeof (_TCHAR));
+
+ if (!nd)
+ {
+ /* Error, out of memory. */
+ errno = ENOMEM;
+ return (_TDIR *) 0;
+ }
+
+ /* Create the search expression. */
+ _tcscpy (nd->dd_name, szFullPath);
+
+ /* Add on a slash if the path does not end with one. */
+ if (nd->dd_name[0] != _T('\0') &&
+ nd->dd_name[_tcslen (nd->dd_name) - 1] != _T('/') &&
+ nd->dd_name[_tcslen (nd->dd_name) - 1] != _T('\\'))
+ {
+ _tcscat (nd->dd_name, SLASH);
+ }
+
+ /* Add on the search pattern */
+ _tcscat (nd->dd_name, SUFFIX);
+
+ /* Initialize handle to -1 so that a premature closedir doesn't try
+ * to call _findclose on it. */
+ nd->dd_handle = -1;
+
+ /* Initialize the status. */
+ nd->dd_stat = 0;
+
+ /* Initialize the dirent structure. ino and reclen are invalid under
+ * Win32, and name simply points at the appropriate part of the
+ * findfirst_t structure. */
+ nd->dd_dir.d_ino = 0;
+ nd->dd_dir.d_reclen = 0;
+ nd->dd_dir.d_namlen = 0;
+ memset (nd->dd_dir.d_name, 0, 260 * sizeof(nd->dd_dir.d_name[0]) /*FILENAME_MAX*/);
+
+ return nd;
+}
+
+
+/*
+ * readdir
+ *
+ * Return a pointer to a dirent structure filled with the information on the
+ * next entry in the directory.
+ */
+struct _tdirent *
+_treaddir (_TDIR * dirp)
+{
+ errno = 0;
+
+ /* Check for valid DIR struct. */
+ if (!dirp)
+ {
+ errno = EFAULT;
+ return (struct _tdirent *) 0;
+ }
+
+ if (dirp->dd_stat < 0)
+ {
+ /* We have already returned all files in the directory
+ * (or the structure has an invalid dd_stat). */
+ return (struct _tdirent *) 0;
+ }
+ else if (dirp->dd_stat == 0)
+ {
+ /* We haven't started the search yet. */
+ /* Start the search */
+ dirp->dd_handle = _tfindfirst (dirp->dd_name, &(dirp->dd_dta));
+
+ if (dirp->dd_handle == -1)
+ {
+ /* Whoops! Seems there are no files in that
+ * directory. */
+ dirp->dd_stat = -1;
+ }
+ else
+ {
+ dirp->dd_stat = 1;
+ }
+ }
+ else
+ {
+ /* Get the next search entry. */
+ if (_tfindnext (dirp->dd_handle, &(dirp->dd_dta)))
+ {
+ /* We are off the end or otherwise error.
+ _findnext sets errno to ENOENT if no more file
+ Undo this. */
+ DWORD winerr = GetLastError ();
+ if (winerr == ERROR_NO_MORE_FILES)
+ errno = 0;
+ _findclose (dirp->dd_handle);
+ dirp->dd_handle = -1;
+ dirp->dd_stat = -1;
+ }
+ else
+ {
+ /* Update the status to indicate the correct
+ * number. */
+ dirp->dd_stat++;
+ }
+ }
+
+ if (dirp->dd_stat > 0)
+ {
+ /* Successfully got an entry. Everything about the file is
+ * already appropriately filled in except the length of the
+ * file name. */
+ dirp->dd_dir.d_namlen = _tcslen (dirp->dd_dta.name);
+ _tcscpy (dirp->dd_dir.d_name, dirp->dd_dta.name);
+ return &dirp->dd_dir;
+ }
+
+ return (struct _tdirent *) 0;
+}
+
+
+/*
+ * closedir
+ *
+ * Frees up resources allocated by opendir.
+ */
+int
+_tclosedir (_TDIR * dirp)
+{
+ int rc;
+
+ errno = 0;
+ rc = 0;
+
+ if (!dirp)
+ {
+ errno = EFAULT;
+ return -1;
+ }
+
+ if (dirp->dd_handle != -1)
+ {
+ rc = _findclose (dirp->dd_handle);
+ }
+
+ /* Delete the dir structure. */
+ free (dirp);
+
+ return rc;
+}
+
+/*
+ * rewinddir
+ *
+ * Return to the beginning of the directory "stream". We simply call findclose
+ * and then reset things like an opendir.
+ */
+void
+_trewinddir (_TDIR * dirp)
+{
+ errno = 0;
+
+ if (!dirp)
+ {
+ errno = EFAULT;
+ return;
+ }
+
+ if (dirp->dd_handle != -1)
+ {
+ _findclose (dirp->dd_handle);
+ }
+
+ dirp->dd_handle = -1;
+ dirp->dd_stat = 0;
+}
+
+/*
+ * telldir
+ *
+ * Returns the "position" in the "directory stream" which can be used with
+ * seekdir to go back to an old entry. We simply return the value in stat.
+ */
+long
+_ttelldir (_TDIR * dirp)
+{
+ errno = 0;
+
+ if (!dirp)
+ {
+ errno = EFAULT;
+ return -1;
+ }
+ return dirp->dd_stat;
+}
+
+/*
+ * seekdir
+ *
+ * Seek to an entry previously returned by telldir. We rewind the directory
+ * and call readdir repeatedly until either dd_stat is the position number
+ * or -1 (off the end). This is not perfect, in that the directory may
+ * have changed while we weren't looking. But that is probably the case with
+ * any such system.
+ */
+void
+_tseekdir (_TDIR * dirp, long lPos)
+{
+ errno = 0;
+
+ if (!dirp)
+ {
+ errno = EFAULT;
+ return;
+ }
+
+ if (lPos < -1)
+ {
+ /* Seeking to an invalid position. */
+ errno = EINVAL;
+ return;
+ }
+ else if (lPos == -1)
+ {
+ /* Seek past end. */
+ if (dirp->dd_handle != -1)
+ {
+ _findclose (dirp->dd_handle);
+ }
+ dirp->dd_handle = -1;
+ dirp->dd_stat = -1;
+ }
+ else
+ {
+ /* Rewind and read forward to the appropriate index. */
+ _trewinddir (dirp);
+
+ while ((dirp->dd_stat < lPos) && _treaddir (dirp))
+ ;
+ }
+}
+
libc/mingw/misc/dirname.c
@@ -0,0 +1,183 @@
+/* dirname.c
+ *
+ * $Id: dirname.c,v 1.2 2007/03/08 23:15:58 keithmarshall Exp $
+ *
+ * Provides an implementation of the "dirname" function, conforming
+ * to SUSv3, with extensions to accommodate Win32 drive designators,
+ * and suitable for use on native Microsoft(R) Win32 platforms.
+ *
+ * Written by Keith Marshall <keithmarshall@users.sourceforge.net>
+ *
+ * This is free software. You may redistribute and/or modify it as you
+ * see fit, without restriction of copyright.
+ *
+ * This software is provided "as is", in the hope that it may be useful,
+ * but WITHOUT WARRANTY OF ANY KIND, not even any implied warranty of
+ * MERCHANTABILITY, nor of FITNESS FOR ANY PARTICULAR PURPOSE. At no
+ * time will the author accept any form of liability for any damages,
+ * however caused, resulting from the use of this software.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <libgen.h>
+#include <locale.h>
+
+#ifndef __cdecl /* If compiling on any non-Win32 platform ... */
+#define __cdecl /* this may not be defined. */
+#endif
+
+char * __cdecl
+dirname(char *path)
+{
+ static char *retfail = NULL;
+ size_t len;
+ /* to handle path names for files in multibyte character locales,
+ * we need to set up LC_CTYPE to match the host file system locale. */
+ char *locale = setlocale (LC_CTYPE, NULL);
+
+ if (locale != NULL)
+ locale = strdup (locale);
+ setlocale (LC_CTYPE, "");
+
+ if (path && *path)
+ {
+ /* allocate sufficient local storage space,
+ * in which to create a wide character reference copy of path. */
+ wchar_t refcopy[1 + (len = mbstowcs (NULL, path, 0))];
+ /* create the wide character reference copy of path */
+ wchar_t *refpath = refcopy;
+
+ len = mbstowcs (refpath, path, len);
+ refcopy[len] = L'\0';
+ /* SUSv3 identifies a special case, where path is exactly equal to "//";
+ * (we will also accept "\\" in the Win32 context, but not "/\" or "\/",
+ * and neither will we consider paths with an initial drive designator).
+ * For this special case, SUSv3 allows the implementation to choose to
+ * return "/" or "//", (or "\" or "\\", since this is Win32); we will
+ * simply return the path unchanged, (i.e. "//" or "\\"). */
+ if (len > 1 && (refpath[0] == L'/' || refpath[0] == L'\\'))
+ {
+ if (refpath[1] == refpath[0] && refpath[2] == L'\0')
+ {
+ setlocale (LC_CTYPE, locale);
+ free (locale);
+ return path;
+ }
+ }
+ /* For all other cases ...
+ * step over the drive designator, if present ... */
+ else if (len > 1 && refpath[1] == L':')
+ {
+ /* FIXME: maybe should confirm *refpath is a valid drive designator. */
+ refpath += 2;
+ }
+ /* check again, just to ensure we still have a non-empty path name ... */
+ if (*refpath)
+ {
+# undef basename
+# define basename __the_basename /* avoid shadowing. */
+ /* reproduce the scanning logic of the "basename" function
+ * to locate the basename component of the current path string,
+ * (but also remember where the dirname component starts). */
+ wchar_t *refname, *basename;
+ for (refname = basename = refpath; *refpath; ++refpath)
+ {
+ if (*refpath == L'/' || *refpath == L'\\')
+ {
+ /* we found a dir separator ...
+ * step over it, and any others which immediately follow it. */
+ while (*refpath == L'/' || *refpath == L'\\')
+ ++refpath;
+ /* if we didn't reach the end of the path string ... */
+ if (*refpath)
+ /* then we have a new candidate for the base name. */
+ basename = refpath;
+ else
+ /* we struck an early termination of the path string,
+ * with trailing dir separators following the base name,
+ * so break out of the for loop, to avoid overrun. */
+ break;
+ }
+ }
+ /* now check,
+ * to confirm that we have distinct dirname and basename components. */
+ if (basename > refname)
+ {
+ /* and, when we do ...
+ * backtrack over all trailing separators on the dirname component,
+ * (but preserve exactly two initial dirname separators, if identical),
+ * and add a NUL terminator in their place. */
+ do --basename;
+ while (basename > refname && (*basename == L'/' || *basename == L'\\'));
+ if (basename == refname && (refname[0] == L'/' || refname[0] == L'\\')
+ && refname[1] == refname[0] && refname[2] != L'/' && refname[2] != L'\\')
+ ++basename;
+ *++basename = L'\0';
+ /* if the resultant dirname begins with EXACTLY two dir separators,
+ * AND both are identical, then we preserve them. */
+ refpath = refcopy;
+ while ((*refpath == L'/' || *refpath == L'\\'))
+ ++refpath;
+ if ((refpath - refcopy) > 2 || refcopy[1] != refcopy[0])
+ refpath = refcopy;
+ /* and finally ...
+ * we remove any residual, redundantly duplicated separators from the dirname,
+ * reterminate, and return it. */
+ refname = refpath;
+ while (*refpath)
+ {
+ if ((*refname++ = *refpath) == L'/' || *refpath++ == L'\\')
+ {
+ while (*refpath == L'/' || *refpath == L'\\')
+ ++refpath;
+ }
+ }
+ *refname = L'\0';
+ /* finally ...
+ * transform the resolved dirname back into the multibyte char domain,
+ * restore the caller's locale, and return the resultant dirname. */
+ if ((len = wcstombs( path, refcopy, len )) != (size_t)(-1))
+ path[len] = '\0';
+ }
+ else
+ {
+ /* either there were no dirname separators in the path name,
+ * or there was nothing else ... */
+ if (*refname == L'/' || *refname == L'\\')
+ {
+ /* it was all separators, so return one. */
+ ++refname;
+ }
+ else
+ {
+ /* there were no separators, so return '.'. */
+ *refname++ = L'.';
+ }
+ /* add a NUL terminator, in either case,
+ * then transform to the multibyte char domain,
+ * using our own buffer. */
+ *refname = L'\0';
+ retfail = realloc (retfail, len = 1 + wcstombs (NULL, refcopy, 0));
+ wcstombs (path = retfail, refcopy, len);
+ }
+ /* restore caller's locale, clean up, and return the resolved dirname. */
+ setlocale (LC_CTYPE, locale);
+ free (locale);
+ return path;
+ }
+# undef basename
+ }
+ /* path is NULL, or an empty string; default return value is "." ...
+ * return this in our own buffer, regenerated by wide char transform,
+ * in case the caller trashed it after a previous call.
+ */
+ retfail = realloc (retfail, len = 1 + wcstombs (NULL, L".", 0));
+ wcstombs (retfail, L".", len);
+ /* restore caller's locale, clean up, and return the default dirname. */
+ setlocale (LC_CTYPE, locale);
+ free (locale);
+ return retfail;
+}
libc/mingw/misc/execv.c
@@ -0,0 +1,6 @@
+#include <process.h>
+
+int __cdecl execv(const char *_Filename,char *const _ArgList[])
+{
+ return _execv (_Filename, (const char *const *)_ArgList);
+}
libc/mingw/misc/execve.c
@@ -0,0 +1,6 @@
+#include <process.h>
+
+int __cdecl execve(const char *_Filename,char *const _ArgList[],char *const _Env[])
+{
+ return _execve (_Filename, (const char *const *)_ArgList, (const char * const *)_Env);
+}
libc/mingw/misc/execvp.c
@@ -0,0 +1,6 @@
+#include <process.h>
+
+int __cdecl execvp(const char *_Filename,char *const _ArgList[])
+{
+ return _execvp (_Filename, (const char *const *)_ArgList);
+}
libc/mingw/misc/execvpe.c
@@ -0,0 +1,6 @@
+#include <process.h>
+
+int __cdecl execvpe(const char *_Filename,char *const _ArgList[],char *const _Env[])
+{
+ return _execvpe (_Filename, (const char *const *)_ArgList, (const char *const *)_Env);
+}
libc/mingw/misc/feclearexcept.c
@@ -0,0 +1,74 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <fenv.h>
+
+#if !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__))
+int __mingw_has_sse (void);
+
+int __mingw_has_sse(void)
+{
+ int cpuInfo[4],infoType = 1;
+
+#ifndef _WIN64
+ int o_flag, n_flag;
+
+ __asm__ volatile ("pushfl\n\tpopl %0" : "=mr" (o_flag));
+ n_flag = o_flag ^ 0x200000;
+ __asm__ volatile ("pushl %0\n\tpopfl" : : "g" (n_flag));
+ __asm__ volatile ("pushfl\n\tpopl %0" : "=mr" (n_flag));
+ if (n_flag == o_flag)
+ return 0;
+#endif
+
+ __asm__ __volatile__ (
+ "cpuid"
+ : "=a" (cpuInfo[0]), "=b" (cpuInfo[1]), "=c" (cpuInfo[2]),
+ "=d" (cpuInfo[3])
+ : "a" (infoType));
+ if (cpuInfo[3] & 0x2000000)
+ return 1;
+ return 0;
+}
+#endif /* !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__)) */
+
+/* 7.6.2.1
+ The feclearexcept function clears the supported exceptions
+ represented by its argument. */
+
+int feclearexcept (int excepts)
+{
+ fenv_t _env;
+#if defined(_ARM_) || defined(__arm__)
+ __asm__ volatile ("fmrx %0, FPSCR" : "=r" (_env));
+ _env.__cw &= ~(excepts & FE_ALL_EXCEPT);
+ __asm__ volatile ("fmxr FPSCR, %0" : : "r" (_env));
+#elif defined(_ARM64_) || defined(__aarch64__)
+ unsigned __int64 fpcr;
+ (void) _env;
+ __asm__ volatile ("mrs %0, fpcr" : "=r" (fpcr));
+ fpcr &= ~(excepts & FE_ALL_EXCEPT);
+ __asm__ volatile ("msr fpcr, %0" : : "r" (fpcr));
+#else
+ int _mxcsr;
+ if (excepts == FE_ALL_EXCEPT)
+ {
+ __asm__ volatile ("fnclex");
+ }
+ else
+ {
+ __asm__ volatile ("fnstenv %0" : "=m" (_env));
+ _env.__status_word &= ~(excepts & FE_ALL_EXCEPT);
+ __asm__ volatile ("fldenv %0" : : "m" (_env));
+ }
+ if (__mingw_has_sse ())
+ {
+ __asm__ volatile ("stmxcsr %0" : "=m" (_mxcsr));
+ _mxcsr &= ~(((excepts & FE_ALL_EXCEPT)));
+ __asm__ volatile ("ldmxcsr %0" : : "m" (_mxcsr));
+ }
+#endif /* defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) */
+ return (0);
+}
libc/mingw/misc/fegetenv.c
@@ -0,0 +1,39 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <fenv.h>
+
+#if !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__))
+int __mingw_has_sse (void);
+#endif /* !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__)) */
+
+/* 7.6.4.1
+ The fegetenv function stores the current floating-point environment
+ in the object pointed to by envp. */
+
+int fegetenv (fenv_t * envp)
+{
+#if defined(_ARM_) || defined(__arm__)
+ __asm__ volatile ("fmrx %0, FPSCR" : "=r" (*envp));
+#elif defined(_ARM64_) || defined(__aarch64__)
+ unsigned __int64 fpcr;
+ __asm__ volatile ("mrs %0, fpcr" : "=r" (fpcr));
+ envp->__cw = fpcr;
+#else
+ __asm__ __volatile__ ("fnstenv %0;": "=m" (*envp));
+ /* fnstenv sets control word to non-stop for all exceptions, so we
+ need to reload our env to restore the original mask. */
+ __asm__ __volatile__ ("fldenv %0" : : "m" (*envp));
+ if (__mingw_has_sse ())
+ {
+ int _mxcsr;
+ __asm__ __volatile__ ("stmxcsr %0" : "=m" (_mxcsr));
+ envp->__unused0 = (((unsigned int) _mxcsr) >> 16);
+ envp->__unused1 = (((unsigned int) _mxcsr) & 0xffff);
+ }
+#endif /* defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) */
+ return 0;
+}
+
libc/mingw/misc/fegetexceptflag.c
@@ -0,0 +1,39 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <fenv.h>
+
+#if !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__))
+extern int __mingw_has_sse (void);
+#endif /* !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__)) */
+
+/* 7.6.2.2
+ The fegetexceptflag function stores an implementation-defined
+ representation of the exception flags indicated by the argument
+ excepts in the object pointed to by the argument flagp. */
+
+int fegetexceptflag (fexcept_t * flagp, int excepts)
+{
+#if defined(_ARM_) || defined(__arm__)
+ fenv_t _env;
+ __asm__ volatile ("fmrx %0, FPSCR" : "=r" (_env));
+ *flagp = _env.__cw & excepts & FE_ALL_EXCEPT;
+#elif defined(_ARM64_) || defined(__aarch64__)
+ unsigned __int64 fpcr;
+ __asm__ volatile ("mrs %0, fpcr" : "=r" (fpcr));
+ *flagp = fpcr & excepts & FE_ALL_EXCEPT;
+#else
+ int _mxcsr;
+ unsigned short _status;
+
+ __asm__ volatile ("fnstsw %0" : "=am" (_status));
+ _mxcsr = 0;
+ if (__mingw_has_sse ())
+ __asm__ volatile ("stmxcsr %0" : "=m" (_mxcsr));
+
+ *flagp = (_mxcsr | _status) & excepts & FE_ALL_EXCEPT;
+#endif /* defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) */
+ return 0;
+}
libc/mingw/misc/fegetround.c
@@ -0,0 +1,28 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <fenv.h>
+
+/* 7.6.3.1
+ The fegetround function returns the value of the rounding direction
+ macro representing the current rounding direction. */
+
+int
+fegetround (void)
+{
+#if defined(_ARM_) || defined(__arm__)
+ fenv_t _env;
+ __asm__ volatile ("fmrx %0, FPSCR" : "=r" (_env));
+ return (_env.__cw & (FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO));
+#elif defined(_ARM64_) || defined(__aarch64__)
+ unsigned __int64 fpcr;
+ __asm__ volatile ("mrs %0, fpcr" : "=r" (fpcr));
+ return (fpcr & (FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO));
+#else
+ int _control;
+ __asm__ volatile ("fnstcw %0" : "=m" (*&_control));
+ return (_control & (FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO));
+#endif /* defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) */
+}
libc/mingw/misc/feholdexcept.c
@@ -0,0 +1,35 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <fenv.h>
+
+/* 7.6.4.2
+ The feholdexcept function saves the current floating-point
+ environment in the object pointed to by envp, clears the exception
+ flags, and then installs a non-stop (continue on exceptions) mode,
+ if available, for all exceptions. */
+
+int feholdexcept (fenv_t * envp)
+{
+#if defined(_ARM_) || defined(__arm__)
+ fenv_t _env;
+ __asm__ volatile ("fmrx %0, FPSCR" : "=r" (_env));
+ envp->__cw = _env.__cw;
+ _env.__cw &= ~(FE_ALL_EXCEPT);
+ __asm__ volatile ("fmxr FPSCR, %0" : : "r" (_env));
+#elif defined(_ARM64_) || defined(__aarch64__)
+ unsigned __int64 fpcr;
+ __asm__ volatile ("mrs %0, fpcr" : "=r" (fpcr));
+ envp->__cw = fpcr;
+ fpcr &= ~(FE_ALL_EXCEPT);
+ __asm__ volatile ("msr fpcr, %0" : : "r" (fpcr));
+#else
+ __asm__ __volatile__ ("fnstenv %0;" : "=m" (* envp)); /* save current into envp */
+ /* fnstenv sets control word to non-stop for all exceptions, so all we
+ need to do is clear the exception flags. */
+ __asm__ __volatile__ ("fnclex");
+#endif /* defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) */
+ return 0;
+}
libc/mingw/misc/feraiseexcept.c
@@ -0,0 +1,36 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <fenv.h>
+
+/* 7.6.2.3
+ The feraiseexcept function raises the supported exceptions
+ represented by its argument The order in which these exceptions
+ are raised is unspecified, except as stated in F.7.6.
+ Whether the feraiseexcept function additionally raises
+ the inexact exception whenever it raises the overflow
+ or underflow exception is implementation-defined. */
+
+int feraiseexcept (int excepts)
+{
+ fenv_t _env;
+#if defined(_ARM_) || defined(__arm__)
+ __asm__ volatile ("fmrx %0, FPSCR" : "=r" (_env));
+ _env.__cw |= excepts & FE_ALL_EXCEPT;
+ __asm__ volatile ("fmxr FPSCR, %0" : : "r" (_env));
+#elif defined(_ARM64_) || defined(__aarch64__)
+ unsigned __int64 fpcr;
+ (void) _env;
+ __asm__ volatile ("mrs %0, fpcr" : "=r" (fpcr));
+ fpcr |= excepts & FE_ALL_EXCEPT;
+ __asm__ volatile ("msr fpcr, %0" : : "r" (fpcr));
+#else
+ __asm__ volatile ("fnstenv %0;" : "=m" (_env));
+ _env.__status_word |= excepts & FE_ALL_EXCEPT;
+ __asm__ volatile ("fldenv %0;"
+ "fwait;" : : "m" (_env));
+#endif /* defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) */
+ return 0;
+}
libc/mingw/misc/fesetenv.c
@@ -0,0 +1,83 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw.h>
+#include <fenv.h>
+#include <float.h>
+
+#if !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__))
+extern int __mingw_has_sse (void);
+#endif /* !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__)) */
+
+/* 7.6.4.3
+ The fesetenv function establishes the floating-point environment
+ represented by the object pointed to by envp. The argument envp
+ points to an object set by a call to fegetenv or feholdexcept, or
+ equal the macro FE_DFL_ENV or an implementation-defined environment
+ macro. Note that fesetenv merely installs the state of the exception
+ flags represented through its argument, and does not raise these
+ exceptions.
+ */
+
+extern void (* __MINGW_IMP_SYMBOL(_fpreset))(void);
+extern void _fpreset(void);
+
+int fesetenv (const fenv_t * envp)
+{
+#if defined(_ARM_) || defined(__arm__)
+ if (envp == FE_DFL_ENV)
+ /* Use the choice made at app startup */
+ _fpreset();
+ else
+ __asm__ volatile ("fmxr FPSCR, %0" : : "r" (*envp));
+#elif defined(_ARM64_) || defined(__aarch64__)
+ if (envp == FE_DFL_ENV) {
+ /* Use the choice made at app startup */
+ _fpreset();
+ } else {
+ unsigned __int64 fpcr = envp->__cw;
+ __asm__ volatile ("msr fpcr, %0" : : "r" (fpcr));
+ }
+#else
+ if (envp == FE_PC64_ENV)
+ /*
+ * fninit initializes the control register to 0x37f,
+ * the status register to zero and the tag word to 0FFFFh.
+ * The other registers are unaffected.
+ */
+ __asm__ __volatile__ ("fninit");
+
+ else if (envp == FE_PC53_ENV)
+ /*
+ * MS _fpreset() does same *except* it sets control word
+ * to 0x27f (53-bit precison).
+ * We force calling _fpreset in msvcrt.dll
+ */
+
+ (* __MINGW_IMP_SYMBOL(_fpreset))();
+
+ else if (envp == FE_DFL_ENV)
+ /* Use the choice made at app startup */
+ _fpreset();
+
+ else
+ {
+ fenv_t env = *envp;
+ int _mxcsr;
+ __asm__ ("fnstenv %0\n"
+ "stmxcsr %1" : "=m" (*&env), "=m" (*&_mxcsr));
+ /*_mxcsr = ((int)envp->__unused0 << 16) | (int)envp->__unused1; *//* mxcsr low and high */
+ env.__unused0 = 0xffff;
+ env.__unused1 = 0xffff;
+ __asm__ volatile ("fldenv %0" : : "m" (env)
+ : "st", "st(1)", "st(2)", "st(3)", "st(4)",
+ "st(5)", "st(6)", "st(7)");
+ if (__mingw_has_sse ())
+ __asm__ volatile ("ldmxcsr %0" : : "m" (*&_mxcsr));
+ }
+
+#endif /* defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) */
+ return 0;
+}
libc/mingw/misc/fesetexceptflag.c
@@ -0,0 +1,56 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <fenv.h>
+
+#if !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__))
+extern int __mingw_has_sse (void);
+#endif /* !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__)) */
+
+/* 7.6.2.4
+ The fesetexceptflag function sets the complete status for those
+ exception flags indicated by the argument excepts, according to the
+ representation in the object pointed to by flagp. The value of
+ *flagp shall have been set by a previous call to fegetexceptflag
+ whose second argument represented at least those exceptions
+ represented by the argument excepts. This function does not raise
+ exceptions, but only sets the state of the flags. */
+
+int fesetexceptflag (const fexcept_t * flagp, int excepts)
+{
+ fenv_t _env;
+
+ excepts &= FE_ALL_EXCEPT;
+
+#if defined(_ARM_) || defined(__arm__)
+ __asm__ volatile ("fmrx %0, FPSCR" : "=r" (_env));
+ _env.__cw &= ~excepts;
+ _env.__cw |= (*flagp & excepts);
+ __asm__ volatile ("fmxr FPSCR, %0" : : "r" (_env));
+#elif defined(_ARM64_) || defined(__aarch64__)
+ unsigned __int64 fpcr;
+ (void) _env;
+ __asm__ volatile ("mrs %0, fpcr" : "=r" (fpcr));
+ fpcr &= ~excepts;
+ fpcr |= (*flagp & excepts);
+ __asm__ volatile ("msr fpcr, %0" : : "r" (fpcr));
+#else
+ __asm__ volatile ("fnstenv %0;" : "=m" (_env));
+ _env.__status_word &= ~excepts;
+ _env.__status_word |= (*flagp & excepts);
+ __asm__ volatile ("fldenv %0;" : : "m" (_env));
+
+ if (__mingw_has_sse ())
+ {
+ int sse_cw;
+ __asm__ volatile ("stmxcsr %0;" : "=m" (sse_cw));
+ sse_cw &= ~(excepts << 7);
+ sse_cw |= ((*flagp & excepts) << 7);
+ __asm__ volatile ("ldmxcsr %0" : : "m" (sse_cw));
+ }
+
+#endif /* defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) */
+ return 0;
+}
libc/mingw/misc/fesetround.c
@@ -0,0 +1,57 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <fenv.h>
+
+#if !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__))
+int __mingw_has_sse (void);
+#endif /* !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__)) */
+
+ /* 7.6.3.2
+ The fesetround function establishes the rounding direction
+ represented by its argument round. If the argument is not equal
+ to the value of a rounding direction macro, the rounding direction
+ is not changed. */
+
+int fesetround (int mode)
+{
+#if defined(_ARM_) || defined(__arm__)
+ fenv_t _env;
+ if ((mode & ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO)) != 0)
+ return -1;
+ __asm__ volatile ("fmrx %0, FPSCR" : "=r" (_env));
+ _env.__cw &= ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO);
+ _env.__cw |= mode;
+ __asm__ volatile ("fmxr FPSCR, %0" : : "r" (_env));
+#elif defined(_ARM64_) || defined(__aarch64__)
+ unsigned __int64 fpcr;
+ if ((mode & ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO)) != 0)
+ return -1;
+ __asm__ volatile ("mrs %0, fpcr" : "=r" (fpcr));
+ fpcr &= ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO);
+ fpcr |= mode;
+ __asm__ volatile ("msr fpcr, %0" : : "r" (fpcr));
+#else
+ unsigned short _cw;
+ if ((mode & ~(FE_TONEAREST | FE_DOWNWARD | FE_UPWARD | FE_TOWARDZERO))
+ != 0)
+ return -1;
+ __asm__ volatile ("fnstcw %0;": "=m" (*&_cw));
+ _cw &= ~0xc00;
+ _cw |= mode;
+ __asm__ volatile ("fldcw %0;" : : "m" (*&_cw));
+
+ if (__mingw_has_sse ())
+ {
+ int mxcsr;
+
+ __asm__ volatile ("stmxcsr %0" : "=m" (*&mxcsr));
+ mxcsr &= ~0x6000;
+ mxcsr |= mode << 3;
+ __asm__ volatile ("ldmxcsr %0" : : "m" (*&mxcsr));
+ }
+#endif /* defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) */
+ return 0;
+}
libc/mingw/misc/fetestexcept.c
@@ -0,0 +1,43 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <fenv.h>
+
+#if !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__))
+extern int __mingw_has_sse (void);
+#endif /* !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__)) */
+
+/* 7.6.2.5
+ The fetestexcept function determines which of a specified subset of
+ the exception flags are currently set. The excepts argument
+ specifies the exception flags to be queried.
+ The fetestexcept function returns the value of the bitwise OR of the
+ exception macros corresponding to the currently set exceptions
+ included in excepts. */
+
+int fetestexcept (int excepts)
+{
+#if defined(_ARM_) || defined(__arm__)
+ fenv_t _env;
+ __asm__ volatile ("fmrx %0, FPSCR" : "=r" (_env));
+ return _env.__cw & excepts & FE_ALL_EXCEPT;
+#elif defined(_ARM64_) || defined(__aarch64__)
+ unsigned __int64 fpcr;
+ __asm__ volatile ("mrs %0, fpcr" : "=r" (fpcr));
+ return fpcr & excepts & FE_ALL_EXCEPT;
+#else
+ unsigned short _sw;
+ __asm__ __volatile__ ("fnstsw %%ax" : "=a" (_sw));
+
+ if (__mingw_has_sse ())
+ {
+ int sse_sw;
+ __asm__ __volatile__ ("stmxcsr %0;" : "=m" (sse_sw));
+ _sw |= sse_sw;
+ }
+ return _sw & excepts & FE_ALL_EXCEPT;
+#endif /* defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__) */
+}
libc/mingw/misc/feupdateenv.c
@@ -0,0 +1,25 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <fenv.h>
+
+/* 7.6.4.4
+ The feupdateenv function saves the currently raised exceptions in
+ its automatic storage, installs the floating-point environment
+ represented by the object pointed to by envp, and then raises the
+ saved exceptions. The argument envp shall point to an object
+ set by a call to feholdexcept or fegetenv, or equal the macro
+ FE_DFL_ENV or an implementation-defined environment macro. */
+
+/* FIXME: this works but surely there must be a better way. */
+
+int feupdateenv (const fenv_t * envp)
+{
+ unsigned int _fexcept = fetestexcept (FE_ALL_EXCEPT); /*save excepts */
+ fesetenv (envp); /* install the env */
+ feraiseexcept (_fexcept); /* raise the execept */
+ return 0;
+}
+
libc/mingw/misc/ftruncate.c
@@ -0,0 +1,8 @@
+
+int _chsize(int _FileHandle,long _Size);
+int ftruncate(int __fd,int __length);
+
+int ftruncate(int __fd,int __length)
+{
+ return _chsize (__fd,__length);
+}
libc/mingw/misc/ftw.c
@@ -0,0 +1,463 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <malloc.h>
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+#include <fcntl.h>
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <ftw.h>
+
+#ifdef IMPL_FTW64
+#define stat stat64
+#define nftw nftw64
+#define ftw ftw64
+#endif
+
+typedef struct dir_data_t {
+ DIR *h;
+ char *buf;
+} dir_data_t;
+
+typedef struct node_t {
+ struct node_t *l, *r;
+ unsigned int colored : 1;
+} node_t;
+
+typedef struct ctx_t {
+ node_t *objs;
+ dir_data_t **dirs;
+ char *buf;
+ struct FTW ftw;
+ int (*fcb) (const char *, const struct stat *, int , struct FTW *);
+ size_t cur_dir, msz_dir, buf_sz;
+ int flags;
+ dev_t dev;
+} ctx_t;
+
+static int add_object (ctx_t *);
+static int do_dir (ctx_t *, struct stat *, dir_data_t *);
+static int do_entity (ctx_t *, dir_data_t *, const char *, size_t);
+static int do_it (const char *, int, void *, int, int);
+
+static int open_directory (ctx_t *, dir_data_t *);
+
+static void
+prepare_for_insert (int forced, node_t **bp, node_t **pp1, node_t **pp2, int p1_c, int p2_c)
+{
+ node_t *p1, *p2, **rp, **lp, *b = *bp;
+
+ rp = &(*bp)->r;
+ lp = &(*bp)->l;
+
+ if (!forced && ((*lp) == NULL || (*lp)->colored == 0 || (*rp) == NULL || (*rp)->colored == 0))
+ return;
+
+ b->colored = 1;
+
+ if (*rp)
+ (*rp)->colored = 0;
+
+ if (*lp)
+ (*lp)->colored = 0;
+
+ if (!pp1 || (*pp1)->colored == 0)
+ return;
+
+ p1 = *pp1;
+ p2 = *pp2;
+
+ if ((p1_c > 0) == (p2_c > 0))
+ {
+ *pp2 = *pp1;
+ p1->colored = 0;
+ p2->colored = 1;
+ *(p1_c < 0 ? &p2->l : &p2->r) = (p1_c < 0 ? p1->r : p1->l);
+ *(p1_c < 0 ? &p1->r : &p1->l) = p2;
+ return;
+ }
+
+ b->colored = 0;
+ p1->colored = p2->colored = 1;
+ *(p1_c < 0 ? &p1->l : &p1->r) = (p1_c < 0 ? *rp : *lp);
+ *(p1_c < 0 ? rp : lp) = p1;
+ *(p1_c < 0 ? &p2->r : &p2->l) = (p1_c < 0 ? *lp : *rp);
+ *(p1_c < 0 ? lp : rp) = p2;
+ *pp2 = b;
+}
+
+static int
+add_object (ctx_t *ctx)
+{
+ node_t **bp, **np, *b, *n, **pp1 = NULL, **pp2 = NULL;
+ int c = 0, p1_c = 0, p2_c = 0;
+
+ if (ctx->objs)
+ ctx->objs->colored = 0;
+
+ np = bp = &ctx->objs;
+
+ if (ctx->objs != NULL)
+ {
+ c = 1;
+
+ do
+ {
+ b = *bp;
+ prepare_for_insert (0, bp, pp1, pp2, p1_c, p2_c);
+ np = &b->r;
+
+ if (*np == NULL)
+ break;
+
+ pp2 = pp1;
+ p2_c = p1_c;
+ pp1 = bp;
+ p1_c = 1;
+ bp = np;
+ }
+ while (*np != NULL);
+ }
+
+ if (!(n = (node_t *) malloc (sizeof (node_t))))
+ return -1;
+
+ *np = n;
+ n->l = n->r = NULL;
+ n->colored = 1;
+
+ if (np != bp)
+ prepare_for_insert (1, np, bp, pp1, c, p1_c);
+
+ return 0;
+}
+
+static int
+open_directory (ctx_t *ctx, dir_data_t *dirp)
+{
+ DIR *st;
+ struct dirent *d;
+ char *buf, *h;
+ size_t cur_sz, buf_sz, sz;
+ int sv_e, ret = 0;
+
+ if (ctx->dirs[ctx->cur_dir] != NULL)
+ {
+ if (!(buf = malloc (1024)))
+ return -1;
+
+ st = ctx->dirs[ctx->cur_dir]->h;
+
+ buf_sz = 1024;
+ cur_sz = 0;
+
+ while ((d = readdir (st)) != NULL)
+ {
+ sz = strlen (d->d_name);
+
+ if ((cur_sz + sz + 2) >= buf_sz)
+ {
+ buf_sz += ((2 * sz) < 1024 ? 1024 : (2 * sz));
+ if (!(h = (char *) realloc (buf, buf_sz)))
+ {
+ sv_e = errno;
+ free (buf);
+ errno = (sv_e);
+
+ return -1;
+ }
+
+ buf = h;
+ }
+
+ *((char *) memcpy (buf + cur_sz, d->d_name, sz) + sz) = 0;
+ cur_sz += sz + 1;
+ }
+
+ buf[cur_sz++] = 0;
+
+ ctx->dirs[ctx->cur_dir]->buf = realloc (buf, cur_sz);
+
+ if (ctx->dirs[ctx->cur_dir]->buf == NULL)
+ {
+ sv_e = errno;
+ free (buf);
+ errno = sv_e;
+ ret = -1;
+ }
+ else
+ {
+ closedir (st);
+
+ ctx->dirs[ctx->cur_dir]->h = NULL;
+ ctx->dirs[ctx->cur_dir] = NULL;
+ }
+ }
+
+ if (!ret)
+ {
+ dirp->h = opendir (ctx->buf);
+
+ if (dirp->h == NULL)
+ ret = -1;
+ else
+ {
+ dirp->buf = NULL;
+ ctx->dirs[ctx->cur_dir] = dirp;
+ ctx->cur_dir += 1;
+
+ if (ctx->cur_dir == ctx->msz_dir)
+ ctx->cur_dir = 0;
+ }
+ }
+
+ return ret;
+}
+
+
+static int
+do_entity (ctx_t *ctx, dir_data_t *dir, const char *name, size_t namlen)
+{
+ struct stat st;
+ char *h;
+ size_t cnt_sz;
+ int ret = 0, flag = 0;
+
+ if (name[0] == '.' && (name[1] == 0 || (name[1] == '.' && name[2] == 0)))
+ return 0;
+
+ cnt_sz = ctx->ftw.base + namlen + 2;
+
+ if (ctx->buf_sz < cnt_sz)
+ {
+ ctx->buf_sz = cnt_sz * 2;
+
+ if (!(h = (char *) realloc (ctx->buf, ctx->buf_sz)))
+ return -1;
+
+ ctx->buf = h;
+ }
+
+ *((char *) memcpy (ctx->buf + ctx->ftw.base, name, namlen) + namlen) = 0;
+
+ name = ctx->buf;
+
+ if (stat (name, &st) < 0)
+ {
+ if (errno != EACCES && errno != ENOENT)
+ ret = -1;
+ else
+ flag = FTW_NS;
+
+ if (!(ctx->flags & FTW_PHYS))
+ stat (name, &st);
+ }
+ else
+ flag = (S_ISDIR (st.st_mode) ? FTW_D : FTW_F);
+
+ if (!ret && (flag == FTW_NS || !(ctx->flags & FTW_MOUNT) || st.st_dev == ctx->dev))
+ {
+ if (flag == FTW_D)
+ {
+ if ((ctx->flags & FTW_PHYS) || !(ret = add_object (ctx)))
+ ret = do_dir (ctx, &st, dir);
+ }
+ else
+ ret = (*ctx->fcb) (ctx->buf, &st, flag, &ctx->ftw);
+ }
+
+ if ((ctx->flags & FTW_ACTIONRETVAL) && ret == FTW_SKIP_SUBTREE)
+ ret = 0;
+
+ return ret;
+}
+
+
+static int
+do_dir (ctx_t *ctx, struct stat *st, __UNUSED_PARAM(dir_data_t *old_dir))
+{
+ dir_data_t dir;
+ struct dirent *d;
+ char *startp, *runp, *endp;
+ int sv_e, ret, previous_base = ctx->ftw.base;
+
+ if ((ret = open_directory (ctx, &dir)) != 0)
+ {
+ if (errno == EACCES)
+ ret = (*ctx->fcb) (ctx->buf, st, FTW_DNR, &ctx->ftw);
+
+ return ret;
+ }
+
+ if (!(ctx->flags & FTW_DEPTH) && (ret = (*ctx->fcb) (ctx->buf, st, FTW_D, &ctx->ftw)) != 0)
+ {
+ sv_e = errno;
+ closedir (dir.h);
+ errno = sv_e;
+
+ if (ctx->cur_dir-- == 0)
+ ctx->cur_dir = ctx->msz_dir - 1;
+
+ ctx->dirs[ctx->cur_dir] = NULL;
+
+ return ret;
+ }
+
+ ctx->ftw.level += 1;
+ startp = memchr (ctx->buf, 0, 1024);
+
+ if (startp[-1] != '/')
+ *startp++ = '/';
+
+ ctx->ftw.base = (startp - ctx->buf);
+
+ while (dir.h != NULL && (d = readdir (dir.h)) != NULL
+ && !(ret = do_entity (ctx, &dir, d->d_name, strlen (d->d_name))))
+ ;
+
+ if (dir.h != NULL)
+ {
+ sv_e = errno;
+ closedir (dir.h);
+ errno = sv_e;
+
+ if (ctx->cur_dir-- == 0)
+ ctx->cur_dir = ctx->msz_dir - 1;
+
+ ctx->dirs[ctx->cur_dir] = NULL;
+ }
+ else
+ {
+ runp = dir.buf;
+
+ while (!ret && *runp != 0)
+ {
+ endp = strchr (runp, 0);
+ ret = do_entity (ctx, &dir, runp, endp - runp);
+ runp = endp + 1;
+ }
+
+ sv_e = errno;
+ free (dir.buf);
+ errno = sv_e;
+ }
+
+ if ((ctx->flags & FTW_ACTIONRETVAL) && ret == FTW_SKIP_SIBLINGS)
+ ret = 0;
+
+ ctx->buf[ctx->ftw.base - 1] = 0;
+ ctx->ftw.level -= 1;
+ ctx->ftw.base = previous_base;
+
+ if (!ret && (ctx->flags & FTW_DEPTH))
+ ret = (*ctx->fcb) (ctx->buf, st, FTW_DP, &ctx->ftw);
+
+ return ret;
+}
+
+static void
+free_objs (node_t *r)
+{
+ if (r->l)
+ free_objs (r->l);
+
+ if (r->r)
+ free_objs (r->r);
+
+ free (r);
+}
+
+static int
+do_it (const char *dir, __UNUSED_PARAM(int is_nftw), void *fcb, int descriptors, int flags)
+{
+ struct ctx_t ctx;
+ struct stat st;
+ int ret = 0;
+ int sv_e;
+ char *cp;
+
+ if (dir[0] == 0)
+ {
+ errno = (ENOENT);
+ return -1;
+ }
+
+ ctx.msz_dir = descriptors < 1 ? 1 : descriptors;
+ ctx.cur_dir = 0;
+ ctx.dirs = (dir_data_t **) alloca (ctx.msz_dir * sizeof (dir_data_t *));
+ memset (ctx.dirs, 0, ctx.msz_dir * sizeof (dir_data_t *));
+
+ ctx.buf_sz = 2 * strlen (dir);
+
+ if (ctx.buf_sz <= 1024)
+ ctx.buf_sz = 1024;
+
+ ctx.buf = (char *) malloc (ctx.buf_sz);
+
+ if (ctx.buf == NULL)
+ return -1;
+
+ cp = strcpy (ctx.buf, dir) + strlen (dir);
+
+ while (cp > (ctx.buf + 1) && cp[-1] == '/')
+ --cp;
+
+ *cp = 0;
+
+ while (cp > ctx.buf && cp[-1] != '/')
+ --cp;
+
+ ctx.ftw.level = 0;
+ ctx.ftw.base = cp - ctx.buf;
+ ctx.flags = flags;
+ ctx.fcb = (int (*) (const char *, const struct stat *, int , struct FTW *)) fcb;
+ ctx.objs = NULL;
+
+ if (!ret)
+ {
+ if (stat (ctx.buf, &st) < 0)
+ ret = -1;
+ else if (S_ISDIR (st.st_mode))
+ {
+ ctx.dev = st.st_dev;
+
+ if (!(flags & FTW_PHYS))
+ ret = add_object (&ctx);
+
+ if (!ret)
+ ret = do_dir (&ctx, &st, NULL);
+ }
+ else
+ ret = (*ctx.fcb) (ctx.buf, &st, FTW_F, &ctx.ftw);
+
+ if ((flags & FTW_ACTIONRETVAL) && (ret == FTW_SKIP_SUBTREE || ret == FTW_SKIP_SIBLINGS))
+ ret = 0;
+ }
+
+ sv_e = errno;
+ if (ctx.objs)
+ free_objs (ctx.objs);
+ free (ctx.buf);
+ errno = (sv_e);
+
+ return ret;
+}
+
+int
+ftw (const char *path, int (*fcb) (const char *, const struct stat *, int), int descriptors)
+{
+ return do_it (path, 0, fcb, descriptors, 0);
+}
+
+int
+nftw (const char *path, int (*fcb) (const char *, const struct stat *, int , struct FTW *), int descriptors, int flags)
+{
+ return do_it (path, 1, fcb, descriptors, flags);
+}
libc/mingw/misc/ftw64.c
@@ -0,0 +1,8 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+
+#define IMPL_FTW64 1
+
+#include "ftw.c"
libc/mingw/misc/fwide.c
@@ -0,0 +1,23 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#define __CRT__NO_INLINE
+#include <wchar.h>
+#include <stdio.h>
+
+#if 0
+int fwide(FILE *stream,int mode)
+{
+ return -1; /* limited to byte orientation */
+}
+#endif
+
+int __cdecl fwide(FILE *_F,int _M)
+{
+ (void)_F;
+ return (_M);
+}
+
libc/mingw/misc/getlogin.c
@@ -0,0 +1,22 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <stddef.h>
+#include <errno.h>
+#include <unistd.h>
+#include <windows.h>
+
+char *getlogin(void);
+
+char *getlogin(void)
+{
+ static char user_name[MAX_PATH];
+ DWORD length = sizeof (user_name);
+
+ if (GetUserName (user_name, &length))
+ return user_name;
+ return NULL;
+}
+
libc/mingw/misc/getopt.c
@@ -0,0 +1,562 @@
+/* $OpenBSD: getopt_long.c,v 1.23 2007/10/31 12:34:57 chl Exp $ */
+/* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */
+
+/*
+ * Copyright (c) 2002 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Sponsored in part by the Defense Advanced Research Projects
+ * Agency (DARPA) and Air Force Research Laboratory, Air Force
+ * Materiel Command, USAF, under agreement number F39502-99-1-0512.
+ */
+/*-
+ * Copyright (c) 2000 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Dieter Baron and Thomas Klausner.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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 <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <windows.h>
+
+#define REPLACE_GETOPT /* use this getopt as the system getopt(3) */
+
+#ifdef REPLACE_GETOPT
+int opterr = 1; /* if error message should be printed */
+int optind = 1; /* index into parent argv vector */
+int optopt = '?'; /* character checked for validity */
+#undef optreset /* see getopt.h */
+#define optreset __mingw_optreset
+int optreset; /* reset getopt */
+char *optarg; /* argument associated with option */
+#endif
+
+#define PRINT_ERROR ((opterr) && (*options != ':'))
+
+#define FLAG_PERMUTE 0x01 /* permute non-options to the end of argv */
+#define FLAG_ALLARGS 0x02 /* treat non-options as args to option "-1" */
+#define FLAG_LONGONLY 0x04 /* operate as getopt_long_only */
+
+/* return values */
+#define BADCH (int)'?'
+#define BADARG ((*options == ':') ? (int)':' : (int)'?')
+#define INORDER (int)1
+
+#ifndef __CYGWIN__
+#define __progname __argv[0]
+#else
+extern char __declspec(dllimport) *__progname;
+#endif
+
+#ifdef __CYGWIN__
+static char EMSG[] = "";
+#else
+#define EMSG ""
+#endif
+
+static int getopt_internal(int, char * const *, const char *,
+ const struct option *, int *, int);
+static int parse_long_options(char * const *, const char *,
+ const struct option *, int *, int);
+static int gcd(int, int);
+static void permute_args(int, int, int, char * const *);
+
+static char *place = EMSG; /* option letter processing */
+
+/* XXX: set optreset to 1 rather than these two */
+static int nonopt_start = -1; /* first non option argument (for permute) */
+static int nonopt_end = -1; /* first option after non options (for permute) */
+
+/* Error messages */
+static const char recargchar[] = "option requires an argument -- %c";
+static const char recargstring[] = "option requires an argument -- %s";
+static const char ambig[] = "ambiguous option -- %.*s";
+static const char noarg[] = "option doesn't take an argument -- %.*s";
+static const char illoptchar[] = "unknown option -- %c";
+static const char illoptstring[] = "unknown option -- %s";
+
+static void
+_vwarnx(const char *fmt,va_list ap)
+{
+ (void)fprintf(stderr,"%s: ",__progname);
+ if (fmt != NULL)
+ (void)vfprintf(stderr,fmt,ap);
+ (void)fprintf(stderr,"\n");
+}
+
+static void
+warnx(const char *fmt,...)
+{
+ va_list ap;
+ va_start(ap,fmt);
+ _vwarnx(fmt,ap);
+ va_end(ap);
+}
+
+/*
+ * Compute the greatest common divisor of a and b.
+ */
+static int
+gcd(int a, int b)
+{
+ int c;
+
+ c = a % b;
+ while (c != 0) {
+ a = b;
+ b = c;
+ c = a % b;
+ }
+
+ return (b);
+}
+
+/*
+ * Exchange the block from nonopt_start to nonopt_end with the block
+ * from nonopt_end to opt_end (keeping the same order of arguments
+ * in each block).
+ */
+static void
+permute_args(int panonopt_start, int panonopt_end, int opt_end,
+ char * const *nargv)
+{
+ int cstart, cyclelen, i, j, ncycle, nnonopts, nopts, pos;
+ char *swap;
+
+ /*
+ * compute lengths of blocks and number and size of cycles
+ */
+ nnonopts = panonopt_end - panonopt_start;
+ nopts = opt_end - panonopt_end;
+ ncycle = gcd(nnonopts, nopts);
+ cyclelen = (opt_end - panonopt_start) / ncycle;
+
+ for (i = 0; i < ncycle; i++) {
+ cstart = panonopt_end+i;
+ pos = cstart;
+ for (j = 0; j < cyclelen; j++) {
+ if (pos >= panonopt_end)
+ pos -= nnonopts;
+ else
+ pos += nopts;
+ swap = nargv[pos];
+ /* LINTED const cast */
+ ((char **) nargv)[pos] = nargv[cstart];
+ /* LINTED const cast */
+ ((char **)nargv)[cstart] = swap;
+ }
+ }
+}
+
+/*
+ * parse_long_options --
+ * Parse long options in argc/argv argument vector.
+ * Returns -1 if short_too is set and the option does not match long_options.
+ */
+static int
+parse_long_options(char * const *nargv, const char *options,
+ const struct option *long_options, int *idx, int short_too)
+{
+ char *current_argv, *has_equal;
+ size_t current_argv_len;
+ int i, ambiguous, match;
+
+#define IDENTICAL_INTERPRETATION(_x, _y) \
+ (long_options[(_x)].has_arg == long_options[(_y)].has_arg && \
+ long_options[(_x)].flag == long_options[(_y)].flag && \
+ long_options[(_x)].val == long_options[(_y)].val)
+
+ current_argv = place;
+ match = -1;
+ ambiguous = 0;
+
+ optind++;
+
+ if ((has_equal = strchr(current_argv, '=')) != NULL) {
+ /* argument found (--option=arg) */
+ current_argv_len = has_equal - current_argv;
+ has_equal++;
+ } else
+ current_argv_len = strlen(current_argv);
+
+ for (i = 0; long_options[i].name; i++) {
+ /* find matching long option */
+ if (strncmp(current_argv, long_options[i].name,
+ current_argv_len))
+ continue;
+
+ if (strlen(long_options[i].name) == current_argv_len) {
+ /* exact match */
+ match = i;
+ ambiguous = 0;
+ break;
+ }
+ /*
+ * If this is a known short option, don't allow
+ * a partial match of a single character.
+ */
+ if (short_too && current_argv_len == 1)
+ continue;
+
+ if (match == -1) /* partial match */
+ match = i;
+ else if (!IDENTICAL_INTERPRETATION(i, match))
+ ambiguous = 1;
+ }
+ if (ambiguous) {
+ /* ambiguous abbreviation */
+ if (PRINT_ERROR)
+ warnx(ambig, (int)current_argv_len,
+ current_argv);
+ optopt = 0;
+ return (BADCH);
+ }
+ if (match != -1) { /* option found */
+ if (long_options[match].has_arg == no_argument
+ && has_equal) {
+ if (PRINT_ERROR)
+ warnx(noarg, (int)current_argv_len,
+ current_argv);
+ /*
+ * XXX: GNU sets optopt to val regardless of flag
+ */
+ if (long_options[match].flag == NULL)
+ optopt = long_options[match].val;
+ else
+ optopt = 0;
+ return (BADARG);
+ }
+ if (long_options[match].has_arg == required_argument ||
+ long_options[match].has_arg == optional_argument) {
+ if (has_equal)
+ optarg = has_equal;
+ else if (long_options[match].has_arg ==
+ required_argument) {
+ /*
+ * optional argument doesn't use next nargv
+ */
+ optarg = nargv[optind++];
+ }
+ }
+ if ((long_options[match].has_arg == required_argument)
+ && (optarg == NULL)) {
+ /*
+ * Missing argument; leading ':' indicates no error
+ * should be generated.
+ */
+ if (PRINT_ERROR)
+ warnx(recargstring,
+ current_argv);
+ /*
+ * XXX: GNU sets optopt to val regardless of flag
+ */
+ if (long_options[match].flag == NULL)
+ optopt = long_options[match].val;
+ else
+ optopt = 0;
+ --optind;
+ return (BADARG);
+ }
+ } else { /* unknown option */
+ if (short_too) {
+ --optind;
+ return (-1);
+ }
+ if (PRINT_ERROR)
+ warnx(illoptstring, current_argv);
+ optopt = 0;
+ return (BADCH);
+ }
+ if (idx)
+ *idx = match;
+ if (long_options[match].flag) {
+ *long_options[match].flag = long_options[match].val;
+ return (0);
+ } else
+ return (long_options[match].val);
+#undef IDENTICAL_INTERPRETATION
+}
+
+/*
+ * getopt_internal --
+ * Parse argc/argv argument vector. Called by user level routines.
+ */
+static int
+getopt_internal(int nargc, char * const *nargv, const char *options,
+ const struct option *long_options, int *idx, int flags)
+{
+ char *oli; /* option letter list index */
+ int optchar, short_too;
+ static int posixly_correct = -1;
+
+ if (options == NULL)
+ return (-1);
+
+ /*
+ * XXX Some GNU programs (like cvs) set optind to 0 instead of
+ * XXX using optreset. Work around this braindamage.
+ */
+ if (optind == 0)
+ optind = optreset = 1;
+
+ /*
+ * Disable GNU extensions if POSIXLY_CORRECT is set or options
+ * string begins with a '+'.
+ *
+ * CV, 2009-12-14: Check POSIXLY_CORRECT anew if optind == 0 or
+ * optreset != 0 for GNU compatibility.
+ */
+ if (posixly_correct == -1 || optreset != 0)
+ posixly_correct = (getenv("POSIXLY_CORRECT") != NULL);
+ if (*options == '-')
+ flags |= FLAG_ALLARGS;
+ else if (posixly_correct || *options == '+')
+ flags &= ~FLAG_PERMUTE;
+ if (*options == '+' || *options == '-')
+ options++;
+
+ optarg = NULL;
+ if (optreset)
+ nonopt_start = nonopt_end = -1;
+start:
+ if (optreset || !*place) { /* update scanning pointer */
+ optreset = 0;
+ if (optind >= nargc) { /* end of argument vector */
+ place = EMSG;
+ if (nonopt_end != -1) {
+ /* do permutation, if we have to */
+ permute_args(nonopt_start, nonopt_end,
+ optind, nargv);
+ optind -= nonopt_end - nonopt_start;
+ }
+ else if (nonopt_start != -1) {
+ /*
+ * If we skipped non-options, set optind
+ * to the first of them.
+ */
+ optind = nonopt_start;
+ }
+ nonopt_start = nonopt_end = -1;
+ return (-1);
+ }
+ if (*(place = nargv[optind]) != '-' ||
+ (place[1] == '\0' && strchr(options, '-') == NULL)) {
+ place = EMSG; /* found non-option */
+ if (flags & FLAG_ALLARGS) {
+ /*
+ * GNU extension:
+ * return non-option as argument to option 1
+ */
+ optarg = nargv[optind++];
+ return (INORDER);
+ }
+ if (!(flags & FLAG_PERMUTE)) {
+ /*
+ * If no permutation wanted, stop parsing
+ * at first non-option.
+ */
+ return (-1);
+ }
+ /* do permutation */
+ if (nonopt_start == -1)
+ nonopt_start = optind;
+ else if (nonopt_end != -1) {
+ permute_args(nonopt_start, nonopt_end,
+ optind, nargv);
+ nonopt_start = optind -
+ (nonopt_end - nonopt_start);
+ nonopt_end = -1;
+ }
+ optind++;
+ /* process next argument */
+ goto start;
+ }
+ if (nonopt_start != -1 && nonopt_end == -1)
+ nonopt_end = optind;
+
+ /*
+ * If we have "-" do nothing, if "--" we are done.
+ */
+ if (place[1] != '\0' && *++place == '-' && place[1] == '\0') {
+ optind++;
+ place = EMSG;
+ /*
+ * We found an option (--), so if we skipped
+ * non-options, we have to permute.
+ */
+ if (nonopt_end != -1) {
+ permute_args(nonopt_start, nonopt_end,
+ optind, nargv);
+ optind -= nonopt_end - nonopt_start;
+ }
+ nonopt_start = nonopt_end = -1;
+ return (-1);
+ }
+ }
+
+ /*
+ * Check long options if:
+ * 1) we were passed some
+ * 2) the arg is not just "-"
+ * 3) either the arg starts with -- we are getopt_long_only()
+ */
+ if (long_options != NULL && place != nargv[optind] &&
+ (*place == '-' || (flags & FLAG_LONGONLY))) {
+ short_too = 0;
+ if (*place == '-')
+ place++; /* --foo long option */
+ else if (*place != ':' && strchr(options, *place) != NULL)
+ short_too = 1; /* could be short option too */
+
+ optchar = parse_long_options(nargv, options, long_options,
+ idx, short_too);
+ if (optchar != -1) {
+ place = EMSG;
+ return (optchar);
+ }
+ }
+
+ if ((optchar = (int)*place++) == (int)':' ||
+ (optchar == (int)'-' && *place != '\0') ||
+ (oli = strchr(options, optchar)) == NULL) {
+ /*
+ * If the user specified "-" and '-' isn't listed in
+ * options, return -1 (non-option) as per POSIX.
+ * Otherwise, it is an unknown option character (or ':').
+ */
+ if (optchar == (int)'-' && *place == '\0')
+ return (-1);
+ if (!*place)
+ ++optind;
+ if (PRINT_ERROR)
+ warnx(illoptchar, optchar);
+ optopt = optchar;
+ return (BADCH);
+ }
+ if (long_options != NULL && optchar == 'W' && oli[1] == ';') {
+ /* -W long-option */
+ if (*place) /* no space */
+ /* NOTHING */;
+ else if (++optind >= nargc) { /* no arg */
+ place = EMSG;
+ if (PRINT_ERROR)
+ warnx(recargchar, optchar);
+ optopt = optchar;
+ return (BADARG);
+ } else /* white space */
+ place = nargv[optind];
+ optchar = parse_long_options(nargv, options, long_options,
+ idx, 0);
+ place = EMSG;
+ return (optchar);
+ }
+ if (*++oli != ':') { /* doesn't take argument */
+ if (!*place)
+ ++optind;
+ } else { /* takes (optional) argument */
+ optarg = NULL;
+ if (*place) /* no white space */
+ optarg = place;
+ else if (oli[1] != ':') { /* arg not optional */
+ if (++optind >= nargc) { /* no arg */
+ place = EMSG;
+ if (PRINT_ERROR)
+ warnx(recargchar, optchar);
+ optopt = optchar;
+ return (BADARG);
+ } else
+ optarg = nargv[optind];
+ }
+ place = EMSG;
+ ++optind;
+ }
+ /* dump back option letter */
+ return (optchar);
+}
+
+#ifdef REPLACE_GETOPT
+/*
+ * getopt --
+ * Parse argc/argv argument vector.
+ *
+ * [eventually this will replace the BSD getopt]
+ */
+int
+getopt(int nargc, char * const *nargv, const char *options)
+{
+
+ /*
+ * We don't pass FLAG_PERMUTE to getopt_internal() since
+ * the BSD getopt(3) (unlike GNU) has never done this.
+ *
+ * Furthermore, since many privileged programs call getopt()
+ * before dropping privileges it makes sense to keep things
+ * as simple (and bug-free) as possible.
+ */
+ return (getopt_internal(nargc, nargv, options, NULL, NULL, 0));
+}
+#endif /* REPLACE_GETOPT */
+
+/*
+ * getopt_long --
+ * Parse argc/argv argument vector.
+ */
+int
+getopt_long(int nargc, char * const *nargv, const char *options,
+ const struct option *long_options, int *idx)
+{
+
+ return (getopt_internal(nargc, nargv, options, long_options, idx,
+ FLAG_PERMUTE));
+}
+
+/*
+ * getopt_long_only --
+ * Parse argc/argv argument vector.
+ */
+int
+getopt_long_only(int nargc, char * const *nargv, const char *options,
+ const struct option *long_options, int *idx)
+{
+
+ return (getopt_internal(nargc, nargv, options, long_options, idx,
+ FLAG_PERMUTE|FLAG_LONGONLY));
+}
libc/mingw/misc/gettimeofday.c
@@ -0,0 +1,73 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <time.h>
+#include <sys/time.h>
+#include <sys/timeb.h>
+#include <errno.h>
+#include <windows.h>
+
+#define FILETIME_1970 116444736000000000ull /* seconds between 1/1/1601 and 1/1/1970 */
+#define HECTONANOSEC_PER_SEC 10000000ull
+
+int getntptimeofday (struct timespec *, struct timezone *);
+
+int getntptimeofday (struct timespec *tp, struct timezone *z)
+{
+ int res = 0;
+ union {
+ unsigned long long ns100; /*time since 1 Jan 1601 in 100ns units */
+ FILETIME ft;
+ } _now;
+ TIME_ZONE_INFORMATION TimeZoneInformation;
+ DWORD tzi;
+
+ if (z != NULL)
+ {
+ if ((tzi = GetTimeZoneInformation(&TimeZoneInformation)) != TIME_ZONE_ID_INVALID) {
+ z->tz_minuteswest = TimeZoneInformation.Bias;
+ if (tzi == TIME_ZONE_ID_DAYLIGHT)
+ z->tz_dsttime = 1;
+ else
+ z->tz_dsttime = 0;
+ }
+ else
+ {
+ z->tz_minuteswest = 0;
+ z->tz_dsttime = 0;
+ }
+ }
+
+ if (tp != NULL) {
+ GetSystemTimeAsFileTime (&_now.ft); /* 100-nanoseconds since 1-1-1601 */
+ /* The actual accuracy on XP seems to be 125,000 nanoseconds = 125 microseconds = 0.125 milliseconds */
+ _now.ns100 -= FILETIME_1970; /* 100 nano-seconds since 1-1-1970 */
+ tp->tv_sec = _now.ns100 / HECTONANOSEC_PER_SEC; /* seconds since 1-1-1970 */
+ tp->tv_nsec = (long) (_now.ns100 % HECTONANOSEC_PER_SEC) * 100; /* nanoseconds */
+ }
+ return res;
+}
+
+int __cdecl gettimeofday (struct timeval *p, void *z)
+{
+ struct timespec tp;
+
+ if (getntptimeofday (&tp, (struct timezone *) z))
+ return -1;
+ p->tv_sec=tp.tv_sec;
+ p->tv_usec=(tp.tv_nsec/1000);
+ return 0;
+}
+
+int __cdecl mingw_gettimeofday (struct timeval *p, struct timezone *z)
+{
+ struct timespec tp;
+
+ if (getntptimeofday (&tp, z))
+ return -1;
+ p->tv_sec=tp.tv_sec;
+ p->tv_usec=(tp.tv_nsec/1000);
+ return 0;
+}
libc/mingw/misc/imaxabs.c
@@ -0,0 +1,22 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ This source code was extracted from the Q8 package created and
+ placed in the PUBLIC DOMAIN by Doug Gwyn <gwyn@arl.mil>
+ last edit: 1999/11/05 gwyn@arl.mil
+
+ Implements subclause 7.8.2 of ISO/IEC 9899:1999 (E).
+
+ This particular implementation requires the matching <inttypes.h>.
+*/
+#define __CRT__NO_INLINE
+#include <inttypes.h>
+
+intmax_t
+imaxabs (intmax_t _j)
+ { return _j >= 0 ? _j : -_j; }
+
+long long __attribute__ ((alias ("imaxabs"))) llabs (long long);
libc/mingw/misc/imaxdiv.c
@@ -0,0 +1,31 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ This source code was extracted from the Q8 package created and
+ placed in the PUBLIC DOMAIN by Doug Gwyn <gwyn@arl.mil>
+ last edit: 1999/11/05 gwyn@arl.mil
+
+
+ last edit: 1999/11/05 gwyn@arl.mil
+
+ Implements subclause 7.8.2 of ISO/IEC 9899:1999 (E).
+
+*/
+
+#include <inttypes.h>
+#include <stdlib.h>
+
+imaxdiv_t
+imaxdiv(intmax_t numer, intmax_t denom)
+{
+ imaxdiv_t result;
+ result.quot = numer / denom;
+ result.rem = numer % denom;
+ return result;
+}
+
+lldiv_t __attribute__ ((alias ("imaxdiv")))
+lldiv (long long, long long);
libc/mingw/misc/isblank.c
@@ -0,0 +1,7 @@
+#define __NO_CTYPE_LINES
+#include <ctype.h>
+
+int __cdecl isblank (int _C)
+{
+ return (_isctype(_C, _BLANK) || _C == '\t');
+}
libc/mingw/misc/iswblank.c
@@ -0,0 +1,7 @@
+#define _CRT_WCTYPE_NOINLINE
+#include <ctype.h>
+
+int __cdecl iswblank (wint_t _C)
+{
+ return (iswctype(_C, _BLANK) || _C == '\t');
+}
libc/mingw/misc/mb_wc_common.h
@@ -0,0 +1,9 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <_mingw.h>
+
+unsigned int __cdecl ___lc_codepage_func(void);
libc/mingw/misc/mbrtowc.c
@@ -0,0 +1,159 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include "mb_wc_common.h"
+#include <wchar.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <windows.h>
+
+static int __MINGW_ATTRIB_NONNULL(1) __MINGW_ATTRIB_NONNULL(4)
+__mbrtowc_cp (wchar_t * __restrict__ pwc, const char * __restrict__ s,
+ size_t n, mbstate_t* __restrict__ ps,
+ const unsigned int cp, const unsigned int mb_max)
+{
+ union {
+ mbstate_t val;
+ char mbcs[4];
+ } shift_state;
+
+ /* Do the prelim checks */
+ if (s == NULL)
+ return 0;
+
+ if (n == 0)
+ /* The standard doesn't mention this case explicitly. Tell
+ caller that the conversion from a non-null s is incomplete. */
+ return -2;
+
+ /* Save the current shift state, in case we need it in DBCS case. */
+ shift_state.val = *ps;
+ *ps = 0;
+
+ if (!*s)
+ {
+ *pwc = 0;
+ return 0;
+ }
+
+ if (mb_max > 1)
+ {
+ if (shift_state.mbcs[0] != 0)
+ {
+ /* Complete the mb char with the trailing byte. */
+ shift_state.mbcs[1] = *s; /* the second byte */
+ if (MultiByteToWideChar(cp, MB_ERR_INVALID_CHARS,
+ shift_state.mbcs, 2, pwc, 1)
+ == 0)
+ {
+ /* An invalid trailing byte */
+ errno = EILSEQ;
+ return -1;
+ }
+ return 2;
+ }
+ else if (IsDBCSLeadByteEx (cp, *s))
+ {
+ /* If told to translate one byte, just save the leadbyte
+ in *ps. */
+ if (n < 2)
+ {
+ ((char*) ps)[0] = *s;
+ return -2;
+ }
+ /* Else translate the first two bytes */
+ else if (MultiByteToWideChar (cp, MB_ERR_INVALID_CHARS,
+ s, 2, pwc, 1)
+ == 0)
+ {
+ errno = EILSEQ;
+ return -1;
+ }
+ return 2;
+ }
+ }
+
+ /* Fall through to single byte char */
+ if (cp == 0)
+ *pwc = (wchar_t)(unsigned char)*s;
+
+ else if (MultiByteToWideChar (cp, MB_ERR_INVALID_CHARS, s, 1, pwc, 1)
+ == 0)
+ {
+ errno = EILSEQ;
+ return -1;
+ }
+
+ return 1;
+}
+
+size_t
+mbrtowc (wchar_t * __restrict__ pwc, const char * __restrict__ s,
+ size_t n, mbstate_t* __restrict__ ps)
+{
+ static mbstate_t internal_mbstate = 0;
+ wchar_t byte_bucket = 0;
+ wchar_t* dst = pwc ? pwc : &byte_bucket;
+
+ return (size_t) __mbrtowc_cp (dst, s, n, ps ? ps : &internal_mbstate,
+ ___lc_codepage_func(), MB_CUR_MAX);
+}
+
+
+size_t
+mbsrtowcs (wchar_t* __restrict__ dst, const char ** __restrict__ src,
+ size_t len, mbstate_t* __restrict__ ps)
+{
+ int ret =0 ;
+ size_t n = 0;
+ static mbstate_t internal_mbstate = 0;
+ mbstate_t* internal_ps = ps ? ps : &internal_mbstate;
+ const unsigned int cp = ___lc_codepage_func();
+ const unsigned int mb_max = MB_CUR_MAX;
+
+ if (src == NULL || *src == NULL) /* undefined behavior */
+ return 0;
+
+ if (dst != NULL)
+ {
+ while (n < len
+ && (ret = __mbrtowc_cp(dst, *src, len - n,
+ internal_ps, cp, mb_max))
+ > 0)
+ {
+ ++dst;
+ *src += ret;
+ n += ret;
+ }
+
+ if (n < len && ret == 0)
+ *src = (char *)NULL;
+ }
+ else
+ {
+ wchar_t byte_bucket = 0;
+ while ((ret = __mbrtowc_cp (&byte_bucket, *src, mb_max,
+ internal_ps, cp, mb_max))
+ > 0)
+ {
+ *src += ret;
+ n += ret;
+ }
+ }
+ return n;
+}
+
+size_t
+mbrlen (const char * __restrict__ s, size_t n,
+ mbstate_t * __restrict__ ps)
+{
+ static mbstate_t s_mbstate = 0;
+ wchar_t byte_bucket = 0;
+ return __mbrtowc_cp (&byte_bucket, s, n, (ps) ? ps : &s_mbstate,
+ ___lc_codepage_func(), MB_CUR_MAX);
+}
libc/mingw/misc/mbsinit.c
@@ -0,0 +1,32 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/* This source code was extracted from the Q8 package created and placed
+ in the PUBLIC DOMAIN by Doug Gwyn <gwyn@arl.mil>
+ last edit: 1999/11/05 gwyn@arl.mil
+
+ Implements subclause 7.24 of ISO/IEC 9899:1999 (E).
+
+ It supports an encoding where all char codes are mapped
+ to the *same* code values within a wchar_t or wint_t,
+ so long as no other wchar_t codes are used by the program.
+
+*/
+
+#define __CRT__NO_INLINE
+#include <wchar.h>
+
+#if 0
+int mbsinit(const mbstate_t *ps)
+{
+ return 1; /* don't have shift states */
+}
+#endif
+
+int __cdecl mbsinit(const mbstate_t *_P)
+{
+ return (!_P || *_P == 0);
+}
+
libc/mingw/misc/mempcpy.c
@@ -0,0 +1,12 @@
+#define __CRT__NO_INLINE
+#include <string.h>
+
+void * __cdecl
+mempcpy (void *d, const void *s, size_t len)
+{
+ char *r = ((char *) d) + len;
+ if (len != 0)
+ memcpy (d, s, len);
+ return r;
+}
+
libc/mingw/misc/mingw-aligned-malloc.c
@@ -0,0 +1,123 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ __mingw_aligned_malloc and friends, implemented using Microsoft's public
+ interfaces and with the help of the algorithm description provided
+ by Wu Yongwei: http://sourceforge.net/mailarchive/message.php?msg_id=3847075
+
+ I hereby place this implementation in the public domain.
+ -- Steven G. Johnson (stevenj@alum.mit.edu)
+*/
+
+#include <stdlib.h>
+#include <errno.h>
+#include <stddef.h> /* ptrdiff_t */
+#include <stdint.h> /* uintptr_t */
+#include <string.h> /* memmove */
+
+/* Forward declarations: */
+void *__mingw_aligned_offset_malloc (size_t, size_t, size_t);
+
+#define NOT_POWER_OF_TWO(n) (((n) & ((n) - 1)))
+#define UI(p) ((uintptr_t) (p))
+#define CP(p) ((char *) p)
+
+#define PTR_ALIGN(p0, alignment, offset) \
+ ((void *) (((UI(p0) + (alignment + sizeof(void*)) + offset) \
+ & (~UI(alignment - 1))) \
+ - offset))
+
+/* Pointer must sometimes be aligned; assume sizeof(void*) is a power of two. */
+#define ORIG_PTR(p) (*(((void **) (UI(p) & (~UI(sizeof(void*) - 1)))) - 1))
+
+void *
+__mingw_aligned_offset_malloc (size_t size, size_t alignment, size_t offset)
+{
+ void *p0, *p;
+
+ if (NOT_POWER_OF_TWO (alignment))
+ {
+ errno = EINVAL;
+ return ((void *) 0);
+ }
+ if (size == 0)
+ return ((void *) 0);
+ if (alignment < sizeof (void *))
+ alignment = sizeof (void *);
+
+ /* Including the extra sizeof(void*) is overkill on a 32-bit
+ machine, since malloc is already 8-byte aligned, as long
+ as we enforce alignment >= 8 ...but oh well. */
+
+ p0 = malloc (size + (alignment + sizeof (void *)));
+ if (!p0)
+ return ((void *) 0);
+ p = PTR_ALIGN (p0, alignment, offset);
+ ORIG_PTR (p) = p0;
+ return p;
+}
+
+void *
+__mingw_aligned_malloc (size_t size, size_t alignment)
+{
+ return __mingw_aligned_offset_malloc (size, alignment, 0);
+}
+
+void
+__mingw_aligned_free (void *memblock)
+{
+ if (memblock)
+ free (ORIG_PTR (memblock));
+}
+
+void *
+__mingw_aligned_offset_realloc (void *memblock, size_t size,
+ size_t alignment, size_t offset)
+{
+ void *p0, *p;
+ ptrdiff_t shift;
+
+ if (!memblock)
+ return __mingw_aligned_offset_malloc (size, alignment, offset);
+ if (NOT_POWER_OF_TWO (alignment))
+ goto bad;
+ if (size == 0)
+ {
+ __mingw_aligned_free (memblock);
+ return ((void *) 0);
+ }
+ if (alignment < sizeof (void *))
+ alignment = sizeof (void *);
+
+ p0 = ORIG_PTR (memblock);
+ /* It is an error for the alignment to change. */
+ if (memblock != PTR_ALIGN (p0, alignment, offset))
+ goto bad;
+ shift = CP (memblock) - CP (p0);
+
+ p0 = realloc (p0, size + (alignment + sizeof (void *)));
+ if (!p0)
+ return ((void *) 0);
+ p = PTR_ALIGN (p0, alignment, offset);
+
+ /* Relative shift of actual data may be different from before, ugh. */
+ if (shift != CP (p) - CP (p0))
+ /* ugh, moves more than necessary if size is increased. */
+ memmove (CP (p), CP (p0) + shift, size);
+
+ ORIG_PTR (p) = p0;
+ return p;
+
+bad:
+ errno = EINVAL;
+ return ((void *) 0);
+}
+
+void *
+__mingw_aligned_realloc (void *memblock, size_t size, size_t alignment)
+{
+ return __mingw_aligned_offset_realloc (memblock, size, alignment, 0);
+}
libc/mingw/misc/mingw-fseek.c
@@ -0,0 +1,104 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <windows.h>
+#include <stdio.h>
+#include <io.h>
+#include <stdlib.h>
+
+#define ZEROBLOCKSIZE 512
+static int __mingw_fseek_called;
+
+int __mingw_fseek (FILE *fp, int offset, int whence);
+
+int
+__mingw_fseek (FILE *fp, int offset, int whence)
+{
+# undef fseek
+ __mingw_fseek_called = 1;
+ return fseek (fp, offset, whence);
+}
+
+int __mingw_fseeko64 (FILE *fp, long offset, int whence);
+
+int
+__mingw_fseeko64 (FILE *fp, long offset, int whence)
+{
+# undef fseeko64
+ __mingw_fseek_called = 1;
+ return fseeko64 (fp, offset, whence);
+}
+
+size_t __mingw_fwrite (const void *buffer, size_t size, size_t count, FILE *fp);
+
+size_t
+__mingw_fwrite (const void *buffer, size_t size, size_t count, FILE *fp)
+{
+# undef fwrite
+ if ((_osver & 0x8000) && __mingw_fseek_called)
+ {
+ ULARGE_INTEGER actual_length;
+ LARGE_INTEGER current_position;
+
+ memset (¤t_position, 0, sizeof (LARGE_INTEGER));
+ __mingw_fseek_called = 0;
+ fflush (fp);
+ actual_length.LowPart = GetFileSize ((HANDLE) _get_osfhandle (fileno (fp)),
+ &actual_length.HighPart);
+ if (actual_length.LowPart == 0xFFFFFFFF
+ && GetLastError() != NO_ERROR )
+ return -1;
+ current_position.LowPart = SetFilePointer ((HANDLE) _get_osfhandle (fileno (fp)),
+ current_position.LowPart,
+ ¤t_position.HighPart,
+ FILE_CURRENT);
+ if (current_position.LowPart == 0xFFFFFFFF
+ && GetLastError() != NO_ERROR )
+ return -1;
+
+#ifdef DEBUG
+ printf ("__mingw_fwrite: current %I64u, actual %I64u\n",
+ current_position.QuadPart, actual_length.QuadPart);
+#endif /* DEBUG */
+ if ((size_t)current_position.QuadPart > (size_t)actual_length.QuadPart)
+ {
+ static char __mingw_zeros[ZEROBLOCKSIZE];
+ long long numleft;
+
+ SetFilePointer ((HANDLE) _get_osfhandle (fileno (fp)),
+ 0, 0, FILE_END);
+ numleft = current_position.QuadPart - actual_length.QuadPart;
+
+#ifdef DEBUG
+ printf ("__mingw_fwrite: Seeking %I64d bytes past end\n", numleft);
+#endif /* DEBUG */
+ while (numleft > 0LL)
+ {
+ DWORD nzeros = (numleft > ZEROBLOCKSIZE)
+ ? ZEROBLOCKSIZE : numleft;
+ DWORD written;
+ if (! WriteFile ((HANDLE) _get_osfhandle (fileno (fp)),
+ __mingw_zeros, nzeros, &written, NULL))
+ {
+ /* Best we can hope for, or at least DJ says so. */
+ SetFilePointer ((HANDLE) _get_osfhandle (fileno (fp)),
+ 0, 0, FILE_BEGIN);
+ return -1;
+ }
+ if (written < nzeros)
+ {
+ /* Likewise. */
+ SetFilePointer ((HANDLE) _get_osfhandle (fileno (fp)),
+ 0, 0, FILE_BEGIN);
+ return -1;
+ }
+
+ numleft -= written;
+ }
+ FlushFileBuffers ((HANDLE) _get_osfhandle (fileno (fp)));
+ }
+ }
+ return fwrite (buffer, size, count, fp);
+}
libc/mingw/misc/mingw_getsp.S
@@ -0,0 +1,152 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+ .file "mingw_getsp.S"
+ .text
+#ifdef _WIN64
+ .align 8
+#else
+ .align 4
+#endif
+ .globl __MINGW_USYMBOL(mingw_getsp)
+ .def __MINGW_USYMBOL(mingw_getsp); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(mingw_getsp):
+#if defined(_AMD64_) || defined(__x86_64__)
+ leaq 8(%rsp),%rax
+ ret
+#elif defined(_X86_) || defined(__i386__)
+ lea 4(%esp),%eax
+ ret
+#elif defined(_ARM_) || defined(__arm__)
+ mov r0, sp
+ bx lr
+#elif defined(_ARM64_) || defined(__aarch64__)
+ mov x0, sp
+ ret
+#endif
+
+/* On ARM:
+ * Error: cannot represent BFD_RELOC_32_PCREL relocation in this object file format
+ * But anyway, nothing is needed here as libarm32/libmsvcrt.a is exporting longjmp
+ ldr ip, 1f
+ ldr pc, [pc, ip]
+ 1: .long __imp_longjmp - (1b + 4)
+*/
+#if !(defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__))
+ .globl __MINGW_USYMBOL(longjmp)
+ .def __MINGW_USYMBOL(longjmp); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(longjmp):
+#if defined(_AMD64_) || defined(__x86_64__)
+#ifndef __SEH__
+ xorq %rax,%rax
+ movq %rax, (%rcx)
+#endif
+ leaq __MINGW_IMP_LSYMBOL(longjmp)(%rip), %rax
+ jmpq *(%rax)
+#elif defined(_X86_) || defined(__i386__)
+ jmp *__imp__longjmp
+#endif
+#endif /* !(defined(_ARM_) || defined(__arm__)) */
+
+#if defined(_ARM_) || defined(__arm__) || defined(_ARM64_) || defined(__aarch64__)
+ .globl __MINGW_USYMBOL(__mingw_setjmp)
+ .def __MINGW_USYMBOL(__mingw_setjmp); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(__mingw_setjmp):
+#if defined(_ARM_) || defined(__arm__)
+ mov r1, #0
+ str r1, [r0] /* jmp_buf->Frame */
+ str r4, [r0, #0x4] /* jmp_buf->R4 */
+ str r5, [r0, #0x8] /* jmp_buf->R5 */
+ str r6, [r0, #0xc] /* jmp_buf->R6 */
+ str r7, [r0, #0x10] /* jmp_buf->R7 */
+ str r8, [r0, #0x14] /* jmp_buf->R8 */
+ str r9, [r0, #0x18] /* jmp_buf->R9 */
+ str r10, [r0, #0x1c] /* jmp_buf->R10 */
+ str r11, [r0, #0x20] /* jmp_buf->R11 */
+ str sp, [r0, #0x24] /* jmp_buf->Sp */
+ str lr, [r0, #0x28] /* jmp_buf->Pc */
+ vmrs r2, fpscr
+ str r2, [r0, #0x2c] /* jmp_buf->Fpscr */
+ vstr d8, [r0, #0x30] /* jmp_buf->D[0] */
+ vstr d9, [r0, #0x38] /* jmp_buf->D[1] */
+ vstr d10, [r0, #0x40] /* jmp_buf->D[2] */
+ vstr d11, [r0, #0x48] /* jmp_buf->D[3] */
+ vstr d12, [r0, #0x50] /* jmp_buf->D[4] */
+ vstr d13, [r0, #0x58] /* jmp_buf->D[5] */
+ vstr d14, [r0, #0x60] /* jmp_buf->D[6] */
+ vstr d15, [r0, #0x68] /* jmp_buf->D[7] */
+ mov r0, #0
+ bx lr
+#elif defined(_ARM64_) || defined(__aarch64__)
+ str xzr, [x0] /* jmp_buf->Frame */
+ stp x19, x20, [x0, #0x10] /* jmp_buf->X19, X20 */
+ stp x21, x22, [x0, #0x20] /* jmp_buf->X21, X22 */
+ stp x23, x24, [x0, #0x30] /* jmp_buf->X23, X24 */
+ stp x25, x26, [x0, #0x40] /* jmp_buf->X25, X26 */
+ stp x27, x28, [x0, #0x50] /* jmp_buf->X27, X28 */
+ stp x29, x30, [x0, #0x60] /* jmp_buf->Fp, Lr */
+ mov x2, sp
+ str x2, [x0, #0x70] /* jmp_buf->Sp */
+ mrs x2, fpcr
+ str w2, [x0, #0x78] /* jmp_buf->Fpcr */
+ mrs x2, fpsr
+ str w2, [x0, #0x7c] /* jmp_buf->Fpsr */
+ stp d8, d9, [x0, #0x80] /* jmp_buf->D[0-1] */
+ stp d10, d11, [x0, #0x90] /* jmp_buf->D[2-3] */
+ stp d12, d13, [x0, #0xa0] /* jmp_buf->D[4-5] */
+ stp d14, d15, [x0, #0xb0] /* jmp_buf->D[6-7] */
+ mov x0, #0
+ ret
+#endif
+
+ .globl __MINGW_USYMBOL(__mingw_longjmp)
+ .def __MINGW_USYMBOL(__mingw_longjmp); .scl 2; .type 32; .endef
+__MINGW_USYMBOL(__mingw_longjmp):
+#if defined(_ARM_) || defined(__arm__)
+ ldr r4, [r0, #0x4] /* jmp_buf->R4 */
+ ldr r5, [r0, #0x8] /* jmp_buf->R5 */
+ ldr r6, [r0, #0xc] /* jmp_buf->R6 */
+ ldr r7, [r0, #0x10] /* jmp_buf->R7 */
+ ldr r8, [r0, #0x14] /* jmp_buf->R8 */
+ ldr r9, [r0, #0x18] /* jmp_buf->R9 */
+ ldr r10, [r0, #0x1c] /* jmp_buf->R10 */
+ ldr r11, [r0, #0x20] /* jmp_buf->R11 */
+ ldr sp, [r0, #0x24] /* jmp_buf->Sp */
+ ldr r2, [r0, #0x28] /* jmp_buf->Pc */
+ ldr r3, [r0, #0x2c] /* jmp_buf->Fpscr */
+ vmsr fpscr, r3
+ vldr d8, [r0, #0x30] /* jmp_buf->D[0] */
+ vldr d9, [r0, #0x38] /* jmp_buf->D[1] */
+ vldr d10, [r0, #0x40] /* jmp_buf->D[2] */
+ vldr d11, [r0, #0x48] /* jmp_buf->D[3] */
+ vldr d12, [r0, #0x50] /* jmp_buf->D[4] */
+ vldr d13, [r0, #0x58] /* jmp_buf->D[5] */
+ vldr d14, [r0, #0x60] /* jmp_buf->D[6] */
+ vldr d15, [r0, #0x68] /* jmp_buf->D[7] */
+ mov r0, r1 /* retval */
+ bx r2
+#elif defined(_ARM64_) || defined(__aarch64__)
+ ldp x19, x20, [x0, #0x10] /* jmp_buf->X19, X20 */
+ ldp x21, x22, [x0, #0x20] /* jmp_buf->X21, X22 */
+ ldp x23, x24, [x0, #0x30] /* jmp_buf->X23, X24 */
+ ldp x25, x26, [x0, #0x40] /* jmp_buf->X25, X26 */
+ ldp x27, x28, [x0, #0x50] /* jmp_buf->X27, X28 */
+ ldp x29, x30, [x0, #0x60] /* jmp_buf->Fp, Lr */
+ ldr x2, [x0, #0x70] /* jmp_buf->Sp */
+ mov sp, x2
+ ldr w2, [x0, #0x78] /* jmp_buf->Fpcr */
+ msr fpcr, x2
+ ldr w2, [x0, #0x7c] /* jmp_buf->Fpsr */
+ msr fpsr, x2
+ ldp d8, d9, [x0, #0x80] /* jmp_buf->D[0-1] */
+ ldp d10, d11, [x0, #0x90] /* jmp_buf->D[2-3] */
+ ldp d12, d13, [x0, #0xa0] /* jmp_buf->D[4-5] */
+ ldp d14, d15, [x0, #0xb0] /* jmp_buf->D[6-7] */
+ mov x0, x1 /* retval */
+ ret
+#endif
+#endif
libc/mingw/misc/mingw_matherr.c
@@ -0,0 +1,2 @@
+int _MINGW_INSTALL_DEBUG_MATHERR = -1;
+
libc/mingw/misc/mingw_mbwc_convert.c
@@ -0,0 +1,48 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <wchar.h>
+#include <windows.h>
+#include <winnls.h>
+
+int __cdecl __mingw_str_wide_utf8(const wchar_t * const wptr, char **mbptr, size_t *buflen)
+{
+ size_t len;
+ char *buf;
+ int ret = 0;
+
+ len = WideCharToMultiByte(CP_UTF8, 0, wptr, -1, NULL, 0, NULL, NULL); /* Get utf-8 string length */
+ buf = calloc(len + 1, sizeof (char)); /* Can we assume sizeof char always = 1? */
+
+ if(!buf) len = 0;
+ else {
+ if (len != 0) ret = WideCharToMultiByte(CP_UTF8, 0, wptr, -1, buf, len, NULL, NULL); /*Do actual conversion*/
+ buf[len] = '0'; /* Must terminate */
+ }
+ *mbptr = buf; /* Set string pointer to allocated buffer */
+ if(buflen != NULL) *buflen = (len) * sizeof (char); /* Give length of allocated memory if needed. */
+ return ret;
+}
+
+int __cdecl __mingw_str_utf8_wide(const char *const mbptr, wchar_t **wptr, size_t *buflen)
+{
+ size_t len;
+ wchar_t *buf;
+ int ret = 0;
+
+ len = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, mbptr, -1, NULL, 0); /* Get converted size */
+ buf = calloc(len + 1, sizeof (wchar_t)); /* Allocate memory accordingly */
+
+ if(!buf) len = 0;
+ else {
+ if (len != 0) ret = MultiByteToWideChar (CP_UTF8, MB_ERR_INVALID_CHARS, mbptr, -1, buf, len); /* Do conversion */
+ buf[len] = L'0'; /* Must terminate */
+ }
+ *wptr = buf; /* Set string pointer to allocated buffer */
+ if (buflen != NULL) *buflen = len * sizeof (wchar_t); /* Give length of allocated memory if needed. */
+ return ret; /* Number of characters written */
+}
+
+void __cdecl __mingw_str_free(void *ptr)
+{
+ if (ptr) free(ptr);
+}
libc/mingw/misc/mingw_usleep.c
@@ -0,0 +1,18 @@
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include <windows.h>
+#include <sys/types.h>
+#include <errno.h>
+
+int __cdecl usleep (useconds_t);
+
+int __cdecl
+usleep (useconds_t us)
+{
+ if (us != 0)
+ Sleep (us / 1000);
+
+ return 0;
+}
+
libc/mingw/misc/mingw_wcstod.c
@@ -0,0 +1,15 @@
+#include <stdio.h>
+
+extern long double __cdecl
+__mingw_wcstold (const wchar_t * __restrict__ _Str, wchar_t ** __restrict__ _EndPtr);
+
+double __cdecl
+__mingw_wcstod (const wchar_t * __restrict__ _Str, wchar_t ** __restrict__ _EndPtr);
+
+double __cdecl
+__mingw_wcstod (const wchar_t * __restrict__ _Str, wchar_t ** __restrict__ _EndPtr)
+{
+ return (double) __mingw_wcstold (_Str, _EndPtr);
+}
+
+
libc/mingw/misc/mingw_wcstof.c
@@ -0,0 +1,31 @@
+#include <windows.h>
+#include <stdio.h>
+
+float __cdecl
+__mingw_wcstof (const wchar_t * __restrict__ _Str, wchar_t ** __restrict__ _EndPtr);
+
+float __cdecl
+__mingw_wcstof (const wchar_t * __restrict__ _Str, wchar_t ** __restrict__ _EndPtr)
+{
+ float r;
+ char *n, *ep = NULL;
+ size_t l, l2;
+
+ l = WideCharToMultiByte(CP_UTF8, 0, _Str, -1, NULL, 0, NULL, NULL);
+ n = alloca (l + 1);
+ if (l != 0) WideCharToMultiByte (CP_UTF8, 0, _Str, -1, n, l, NULL, NULL);
+ n[l] = 0;
+ r = __mingw_strtof (n, &ep);
+ if (ep != NULL)
+ {
+ *ep = 0;
+ l2 = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, n, -1, NULL, 0);
+ if (l2 > 0)
+ l2 -= 1; /* Remove zero terminator from length. */
+ if (_EndPtr) *_EndPtr = (wchar_t *) &_Str[l2];
+ }
+ else
+ if (_EndPtr) *_EndPtr = NULL;
+ return r;
+}
+
libc/mingw/misc/mingw_wcstold.c
@@ -0,0 +1,32 @@
+#include <windows.h>
+#include <stdio.h>
+
+long double __cdecl
+__mingw_wcstold (const wchar_t * __restrict__ _Str, wchar_t ** __restrict__ _EndPtr);
+
+long double __cdecl
+__mingw_wcstold (const wchar_t * __restrict__ _Str, wchar_t ** __restrict__ _EndPtr)
+{
+ long double r;
+ char *n, *ep = NULL;
+ size_t l, l2;
+
+ l = WideCharToMultiByte(CP_UTF8, 0, _Str, -1, NULL, 0, NULL, NULL);
+ n = alloca (l + 1);
+ if (l != 0) WideCharToMultiByte (CP_UTF8, 0, _Str, -1, n, l, NULL, NULL);
+ n[l] = 0;
+ r = __mingw_strtold (n, &ep);
+ if (ep != NULL)
+ {
+ *ep = 0;
+ l2 = MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, n, -1, NULL, 0);
+ if (l2 > 0)
+ l2 -= 1; /* Remove zero terminator from length. */
+ if (_EndPtr)
+ *_EndPtr = (wchar_t *) &_Str[l2];
+ }
+ else if (_EndPtr)
+ *_EndPtr = NULL;
+ return r;
+}
+
libc/mingw/misc/mkstemp.c
@@ -0,0 +1,89 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <io.h>
+#include <errno.h>
+#include <share.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/*
+ The mkstemp() function generates a unique temporary filename from template,
+ creates and opens the file, and returns an open file descriptor for the
+ file.
+
+ The template may be any file name with at least six trailing Xs, for example
+ /tmp/temp.XXXXXXXX. The trailing Xs are replaced with a unique digit and
+ letter combination that makes the file name unique. Since it will be
+ modified, template must not be a string constant, but should be declared as
+ a character array.
+
+ The file is created with permissions 0600, that is, read plus write for
+ owner only. The returned file descriptor provides both read and write access
+ to the file.
+ */
+int __cdecl mkstemp (char *template_name)
+{
+ int i, j, fd, len, index;
+
+ /* These are the (62) characters used in temporary filenames. */
+ static const char letters[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+
+ /* The last six characters of template must be "XXXXXX" */
+ if (template_name == NULL || (len = strlen (template_name)) < 6
+ || memcmp (template_name + (len - 6), "XXXXXX", 6)) {
+ errno = EINVAL;
+ return -1;
+ }
+
+ /* User may supply more than six trailing Xs */
+ for (index = len - 6; index > 0 && template_name[index - 1] == 'X'; index--);
+
+ /*
+ Like OpenBSD, mkstemp() will try at least 2 ** 31 combinations before
+ giving up.
+ */
+ for (i = 0; i >= 0; i++) {
+ for(j = index; j < len; j++) {
+ template_name[j] = letters[rand () % 62];
+ }
+ fd = _sopen(template_name,
+ _O_RDWR | _O_CREAT | _O_EXCL | _O_BINARY,
+ _SH_DENYRW, _S_IREAD | _S_IWRITE);
+ if (fd != -1) return fd;
+ if (fd == -1 && errno != EEXIST) return -1;
+ }
+
+ return -1;
+}
+
+#if 0
+int main (int argc, char *argv[])
+{
+ int i, fd;
+
+ for (i = 0; i < 10; i++) {
+ char template_name[] = { "temp_XXXXXX" };
+ fd = mkstemp (template_name);
+ if (fd >= 0) {
+ fprintf (stderr, "fd=%d, name=%s\n", fd, template_name);
+ _close (fd);
+ } else {
+ fprintf (stderr, "errno=%d\n", errno);
+ }
+ }
+
+ for (i = 0; i < 10; i++) {
+ char template_name[] = { "temp_XXXXXXXX" };
+ fd = mkstemp (template_name);
+ if (fd >= 0) {
+ fprintf (stderr, "fd=%d, name=%s\n", fd, template_name);
+ _close (fd);
+ } else {
+ fprintf (stderr, "errno=%d\n", errno);
+ }
+ }
+
+ return 0;
+}
+#endif
libc/mingw/misc/seterrno.c
@@ -0,0 +1,18 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <errno.h>
+
+errno_t __cdecl _set_errno (int _Value)
+{
+ errno = _Value;
+ return errno;
+}
+
+errno_t __cdecl _get_errno (int *_Value)
+{
+ if(_Value) *_Value=errno;
+ return errno;
+}
libc/mingw/misc/sleep.c
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <signal.h>
+#include <time.h>
+#include <unistd.h>
+#include <errno.h>
+#include <windows.h>
+
+unsigned int sleep (unsigned int seconds)
+{
+ Sleep (seconds * 1000);
+ return 0;
+}
libc/mingw/misc/spawnv.c
@@ -0,0 +1,6 @@
+#include <process.h>
+
+intptr_t __cdecl spawnv(int mode,const char *_Filename,char *const _ArgList[])
+{
+ return _spawnv(mode, _Filename,(const char *const *)_ArgList);
+}
libc/mingw/misc/spawnve.c
@@ -0,0 +1,6 @@
+#include <process.h>
+
+intptr_t __cdecl spawnve(int mode,const char *_Filename,char *const _ArgList[],char *const _Env[])
+{
+ return _spawnve(mode, _Filename,(const char *const *)_ArgList,(const char *const *)_Env);
+}
libc/mingw/misc/spawnvp.c
@@ -0,0 +1,6 @@
+#include <process.h>
+
+intptr_t __cdecl spawnvp(int mode,const char *_Filename,char *const _ArgList[])
+{
+ return _spawnvp(mode, _Filename,(const char *const *)_ArgList);
+}
libc/mingw/misc/spawnvpe.c
@@ -0,0 +1,6 @@
+#include <process.h>
+
+intptr_t __cdecl spawnvpe(int mode,const char *_Filename,char *const _ArgList[],char *const _Env[])
+{
+ return _spawnvpe(mode, _Filename,(const char *const *)_ArgList,(const char *const *)_Env);
+}
libc/mingw/misc/strnlen.c
@@ -0,0 +1,11 @@
+#define __CRT__NO_INLINE
+#include <string.h>
+
+size_t __cdecl strnlen (const char *s, size_t maxlen)
+{
+ const char *s2 = s;
+ while ((size_t) (s2 - s) < maxlen && *s2)
+ ++s2;
+ return s2 - s;
+}
+
libc/mingw/misc/strsafe.c
@@ -0,0 +1,2 @@
+#define __CRT_STRSAFE_IMPL
+#include <strsafe.h>
libc/mingw/misc/strtoimax.c
@@ -0,0 +1,117 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ This source code was extracted from the Q8 package created and
+ placed in the PUBLIC DOMAIN by Doug Gwyn <gwyn@arl.mil>
+ last edit: 1999/11/05 gwyn@arl.mil
+
+ Implements subclause 7.8.2 of ISO/IEC 9899:1999 (E).
+
+ This particular implementation requires the matching <inttypes.h>.
+ It also assumes that character codes for A..Z and a..z are in
+ contiguous ascending order; this is true for ASCII but not EBCDIC.
+*/
+#include <stdlib.h>
+#include <errno.h>
+#include <ctype.h>
+#include <inttypes.h>
+
+/* Helper macros */
+
+/* convert digit character to number, in any base */
+#define ToNumber(c) (isdigit(c) ? (c) - '0' : \
+ isupper(c) ? (c) - 'A' + 10 : \
+ islower(c) ? (c) - 'a' + 10 : \
+ -1 /* "invalid" flag */ \
+ )
+/* validate converted digit character for specific base */
+#define valid(n, b) ((n) >= 0 && (n) < (b))
+
+intmax_t
+strtoimax(nptr, endptr, base)
+ register const char * __restrict__ nptr;
+ char ** __restrict__ endptr;
+ register int base;
+ {
+ register uintmax_t accum; /* accumulates converted value */
+ register int n; /* numeral from digit character */
+ int minus; /* set iff minus sign seen */
+ int toobig; /* set iff value overflows */
+
+ if ( endptr != NULL )
+ *endptr = (char *)nptr; /* in case no conversion's performed */
+
+ if ( base < 0 || base == 1 || base > 36 )
+ {
+ errno = EDOM;
+ return 0; /* unspecified behavior */
+ }
+
+ /* skip initial, possibly empty sequence of white-space characters */
+
+ while ( isspace(*nptr) )
+ ++nptr;
+
+ /* process subject sequence: */
+
+ /* optional sign */
+ if ( (minus = *nptr == '-') || *nptr == '+' )
+ ++nptr;
+
+ if ( base == 0 ) {
+ if ( *nptr == '0' ) {
+ if ( nptr[1] == 'X' || nptr[1] == 'x' )
+ base = 16;
+ else
+ base = 8;
+ }
+ else
+ base = 10;
+ }
+ /* optional "0x" or "0X" for base 16 */
+
+ if ( base == 16 && *nptr == '0' && (nptr[1] == 'X' || nptr[1] == 'x') )
+ nptr += 2; /* skip past this prefix */
+
+ /* check whether there is at least one valid digit */
+
+ n = ToNumber(*nptr);
+ ++nptr;
+
+ if ( !valid(n, base) )
+ return 0; /* subject seq. not of expected form */
+
+ accum = n;
+
+ for ( toobig = 0; n = ToNumber(*nptr), valid(n, base); ++nptr )
+ if ( accum > (uintmax_t)(INTMAX_MAX / base + 2) ) /* major wrap-around */
+ toobig = 1; /* but keep scanning */
+ else
+ accum = base * accum + n;
+
+ if ( endptr != NULL )
+ *endptr = (char *)nptr; /* points to first not-valid-digit */
+
+ if ( minus )
+ {
+ if ( accum > (uintmax_t)INTMAX_MAX + 1 )
+ toobig = 1;
+ }
+ else
+ if ( accum > (uintmax_t)INTMAX_MAX )
+ toobig = 1;
+
+ if ( toobig )
+ {
+ errno = ERANGE;
+ return minus ? INTMAX_MIN : INTMAX_MAX;
+ }
+ else
+ return (intmax_t)(minus ? -accum : accum);
+ }
+
+long long __attribute__ ((alias ("strtoimax")))
+strtoll (const char* __restrict__ nptr, char ** __restrict__ endptr, int base);
libc/mingw/misc/strtold.c
@@ -0,0 +1,398 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include "math/cephes_emath.h"
+
+#if NE == 10
+/* 1.0E0 */
+static const unsigned short __eone[NE] = {
+ 0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x8000, 0x3fff,
+};
+#else
+static const unsigned short __eone[NE] = {
+ 0, 0000000,0000000,0000000,0100000,0x3fff,
+};
+#endif
+
+#if NE == 10
+static const unsigned short __etens[NTEN + 1][NE] =
+{
+ {0x6576, 0x4a92, 0x804a, 0x153f,
+ 0xc94c, 0x979a, 0x8a20, 0x5202, 0xc460, 0x7525,}, /* 10**4096 */
+ {0x6a32, 0xce52, 0x329a, 0x28ce,
+ 0xa74d, 0x5de4, 0xc53d, 0x3b5d, 0x9e8b, 0x5a92,}, /* 10**2048 */
+ {0x526c, 0x50ce, 0xf18b, 0x3d28,
+ 0x650d, 0x0c17, 0x8175, 0x7586, 0xc976, 0x4d48,},
+ {0x9c66, 0x58f8, 0xbc50, 0x5c54,
+ 0xcc65, 0x91c6, 0xa60e, 0xa0ae, 0xe319, 0x46a3,},
+ {0x851e, 0xeab7, 0x98fe, 0x901b,
+ 0xddbb, 0xde8d, 0x9df9, 0xebfb, 0xaa7e, 0x4351,},
+ {0x0235, 0x0137, 0x36b1, 0x336c,
+ 0xc66f, 0x8cdf, 0x80e9, 0x47c9, 0x93ba, 0x41a8,},
+ {0x50f8, 0x25fb, 0xc76b, 0x6b71,
+ 0x3cbf, 0xa6d5, 0xffcf, 0x1f49, 0xc278, 0x40d3,},
+ {0x0000, 0x0000, 0x0000, 0x0000,
+ 0xf020, 0xb59d, 0x2b70, 0xada8, 0x9dc5, 0x4069,},
+ {0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0400, 0xc9bf, 0x8e1b, 0x4034,},
+ {0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x2000, 0xbebc, 0x4019,},
+ {0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0x9c40, 0x400c,},
+ {0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xc800, 0x4005,},
+ {0x0000, 0x0000, 0x0000, 0x0000,
+ 0x0000, 0x0000, 0x0000, 0x0000, 0xa000, 0x4002,}, /* 10**1 */
+};
+#else
+static const unsigned short __etens[NTEN+1][NE] = {
+ {0xc94c,0x979a,0x8a20,0x5202,0xc460,0x7525,},/* 10**4096 */
+ {0xa74d,0x5de4,0xc53d,0x3b5d,0x9e8b,0x5a92,},/* 10**2048 */
+ {0x650d,0x0c17,0x8175,0x7586,0xc976,0x4d48,},
+ {0xcc65,0x91c6,0xa60e,0xa0ae,0xe319,0x46a3,},
+ {0xddbc,0xde8d,0x9df9,0xebfb,0xaa7e,0x4351,},
+ {0xc66f,0x8cdf,0x80e9,0x47c9,0x93ba,0x41a8,},
+ {0x3cbf,0xa6d5,0xffcf,0x1f49,0xc278,0x40d3,},
+ {0xf020,0xb59d,0x2b70,0xada8,0x9dc5,0x4069,},
+ {0x0000,0x0000,0x0400,0xc9bf,0x8e1b,0x4034,},
+ {0x0000,0x0000,0x0000,0x2000,0xbebc,0x4019,},
+ {0x0000,0x0000,0x0000,0x0000,0x9c40,0x400c,},
+ {0x0000,0x0000,0x0000,0x0000,0xc800,0x4005,},
+ {0x0000,0x0000,0x0000,0x0000,0xa000,0x4002,}, /* 10**1 */
+};
+#endif
+
+int __asctoe64(const char * __restrict__ ss, short unsigned int * __restrict__ y)
+{
+ unsigned short yy[NI], xt[NI], tt[NI];
+ int esign, decflg, nexp, expo, lost;
+ int k, c;
+ int valid_lead_string = 0;
+ int have_non_zero_mant = 0;
+ int prec = 0;
+ /* int trail = 0; */
+ int lexp;
+ unsigned short nsign = 0;
+ const unsigned short *p;
+ char *sp, *lstr;
+ char *s;
+
+ const char dec_sym = *(localeconv ()->decimal_point);
+
+ int lenldstr = 0;
+
+ /* Copy the input string. */
+ c = strlen (ss) + 2;
+ lstr = (char *) alloca (c);
+ s = (char *) ss;
+ while( isspace ((int)(unsigned char)*s)) /* skip leading spaces */
+ {
+ ++s;
+ ++lenldstr;
+ }
+ sp = lstr;
+ for (k = 0; k < c; k++)
+ {
+ if ((*sp++ = *s++) == '\0')
+ break;
+ }
+ *sp = '\0';
+ s = lstr;
+
+ if (*s == '-')
+ {
+ nsign = 0xffff;
+ ++s;
+ }
+ else if (*s == '+')
+ {
+ ++s;
+ }
+
+ if (_strnicmp("INF", s , 3) == 0)
+ {
+ valid_lead_string = 1;
+ s += 3;
+ if ( _strnicmp ("INITY", s, 5) == 0)
+ s += 5;
+ __ecleaz(yy);
+ yy[E] = 0x7fff; /* infinity */
+ goto aexit;
+ }
+ else if(_strnicmp ("NAN", s, 3) == 0)
+ {
+ valid_lead_string = 1;
+ s += 3;
+ __enan_NI16( yy );
+ goto aexit;
+ }
+
+ /* FIXME: Handle case of strtold ("NAN(n_char_seq)",endptr) */
+
+ /* Now get some digits. */
+ lost = 0;
+ decflg = 0;
+ nexp = 0;
+ expo = 0;
+ __ecleaz( yy );
+
+ /* Ignore leading zeros */
+ while (*s == '0')
+ {
+ valid_lead_string = 1;
+ s++;
+ }
+
+nxtcom:
+
+ k = *s - '0';
+ if ((k >= 0) && (k <= 9))
+ {
+#if 0
+/* The use of a special char as a flag for trailing zeroes causes problems when input
+ actually contains the char */
+/* Identify and strip trailing zeros after the decimal point. */
+ if ((trail == 0) && (decflg != 0))
+ {
+ sp = s;
+ while ((*sp >= '0') && (*sp <= '9'))
+ ++sp;
+ --sp;
+ while (*sp == '0')
+ {
+ *sp-- = (char)-1;
+ trail++;
+ }
+ if( *s == (char)-1 )
+ goto donchr;
+ }
+#endif
+
+/* If enough digits were given to more than fill up the yy register,
+ * continuing until overflow into the high guard word yy[2]
+ * guarantees that there will be a roundoff bit at the top
+ * of the low guard word after normalization.
+ */
+ if (yy[2] == 0)
+ {
+ if( decflg )
+ nexp += 1; /* count digits after decimal point */
+ __eshup1( yy ); /* multiply current number by 10 */
+ __emovz( yy, xt );
+ __eshup1( xt );
+ __eshup1( xt );
+ __eaddm( xt, yy );
+ __ecleaz( xt );
+ xt[NI-2] = (unsigned short )k;
+ __eaddm( xt, yy );
+ }
+ else
+ {
+ /* Mark any lost non-zero digit. */
+ lost |= k;
+ /* Count lost digits before the decimal point. */
+ if (decflg == 0)
+ nexp -= 1;
+ }
+ have_non_zero_mant |= k;
+ prec ++;
+ /* goto donchr; */
+ }
+ else if (*s == dec_sym)
+ {
+ if( decflg )
+ goto daldone;
+ ++decflg;
+ }
+ else if ((*s == 'E') || (*s == 'e') )
+ {
+ if (prec || valid_lead_string)
+ goto expnt;
+ else
+ goto daldone;
+ }
+#if 0
+ else if (*s == (char)-1)
+ goto donchr;
+#endif
+ else /* an invalid char */
+ goto daldone;
+
+ /* donchr: */
+ ++s;
+ goto nxtcom;
+
+/* Exponent interpretation */
+expnt:
+
+ esign = 1;
+ expo = 0;
+ /* Save position in case we need to fall back. */
+ sp = s;
+ ++s;
+ /* check for + or - */
+ if (*s == '-')
+ {
+ esign = -1;
+ ++s;
+ }
+ if (*s == '+')
+ ++s;
+
+ /* Check for valid exponent. */
+ if (!(*s >= '0' && *s <= '9'))
+ {
+ s = sp;
+ goto daldone;
+ }
+
+ while ((*s >= '0') && (*s <= '9'))
+ {
+ /* Stop modifying exp if we are going to overflow anyway,
+ but keep parsing the string. */
+ if (expo < 4978)
+ {
+ expo *= 10;
+ expo += *s - '0';
+ }
+ s++;
+ }
+
+ if (esign < 0)
+ expo = -expo;
+
+ if (expo > 4977) /* maybe overflow */
+ {
+ __ecleaz(yy);
+ if (have_non_zero_mant)
+ yy[E] = 0x7fff;
+ goto aexit;
+ }
+ else if (expo < -4977) /* underflow */
+ {
+ __ecleaz(yy);
+ goto aexit;
+ }
+
+daldone:
+
+ nexp = expo - nexp;
+
+ /* Pad trailing zeros to minimize power of 10, per IEEE spec. */
+ while ((nexp > 0) && (yy[2] == 0))
+ {
+ __emovz( yy, xt );
+ __eshup1( xt );
+ __eshup1( xt );
+ __eaddm( yy, xt );
+ __eshup1( xt );
+ if (xt[2] != 0)
+ break;
+ nexp -= 1;
+ __emovz( xt, yy );
+ }
+ if ((k = __enormlz(yy)) > NBITS)
+ {
+ __ecleaz(yy);
+ goto aexit;
+ }
+ lexp = (EXONE - 1 + NBITS) - k;
+ __emdnorm( yy, lost, 0, lexp, 64, NBITS );
+ /* convert to external format */
+
+ /* Multiply by 10**nexp. If precision is 64 bits,
+ * the maximum relative error incurred in forming 10**n
+ * for 0 <= n <= 324 is 8.2e-20, at 10**180.
+ * For 0 <= n <= 999, the peak relative error is 1.4e-19 at 10**947.
+ * For 0 >= n >= -999, it is -1.55e-19 at 10**-435.
+ */
+ lexp = yy[E];
+ if (nexp == 0)
+ {
+ k = 0;
+ goto expdon;
+ }
+ esign = 1;
+ if (nexp < 0)
+ {
+ nexp = -nexp;
+ esign = -1;
+ if (nexp > 4096)
+ { /* Punt. Can't handle this without 2 divides. */
+ __emovi( __etens[0], tt );
+ lexp -= tt[E];
+ k = __edivm( tt, yy );
+ lexp += EXONE;
+ nexp -= 4096;
+ }
+ }
+ p = &__etens[NTEN][0];
+ __emov( __eone, xt );
+ expo = 1;
+ do
+ {
+ if (expo & nexp)
+ __emul( p, xt, xt );
+ p -= NE;
+ expo = expo + expo;
+ }
+ while (expo <= MAXP);
+
+ __emovi( xt, tt );
+ if (esign < 0)
+ {
+ lexp -= tt[E];
+ k = __edivm( tt, yy );
+ lexp += EXONE;
+ }
+ else
+ {
+ lexp += tt[E];
+ k = __emulm( tt, yy );
+ lexp -= EXONE - 1;
+ }
+
+expdon:
+
+ /* Round and convert directly to the destination type */
+
+ __emdnorm( yy, k, 0, lexp, 64, 64 );
+
+aexit:
+
+ yy[0] = nsign;
+
+ __toe64( yy, y );
+
+ /* Check for overflow, undeflow */
+ if (have_non_zero_mant &&
+ (*((long double*) y) == 0.0L || isinf (*((long double*) y))))
+ errno = ERANGE;
+
+ if (prec || valid_lead_string)
+ return (lenldstr + (s - lstr));
+
+ return 0;
+}
+
+
+long double strtold (const char * __restrict__ s, char ** __restrict__ se)
+{
+ int lenldstr;
+ union
+ {
+ unsigned short int us[6];
+ long double ld;
+ } xx = {{0}};
+
+ lenldstr = __asctoe64( s, xx.us);
+ if (se)
+ *se = (char*)s + lenldstr;
+
+ return xx.ld;
+}
+
libc/mingw/misc/strtoumax.c
@@ -0,0 +1,115 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ This source code was extracted from the Q8 package created and
+ placed in the PUBLIC DOMAIN by Doug Gwyn <gwyn@arl.mil>
+ last edit: 1999/11/05 gwyn@arl.mil
+
+ Implements subclause 7.8.2 of ISO/IEC 9899:1999 (E).
+
+ This particular implementation requires the matching <inttypes.h>.
+ It also assumes that character codes for A..Z and a..z are in
+ contiguous ascending order; this is true for ASCII but not EBCDIC.
+*/
+#include <stdlib.h>
+#include <errno.h>
+#include <ctype.h>
+#include <inttypes.h>
+
+/* Helper macros */
+
+/* convert digit character to number, in any base */
+#define ToNumber(c) (isdigit(c) ? (c) - '0' : \
+ isupper(c) ? (c) - 'A' + 10 : \
+ islower(c) ? (c) - 'a' + 10 : \
+ -1 /* "invalid" flag */ \
+ )
+/* validate converted digit character for specific base */
+#define valid(n, b) ((n) >= 0 && (n) < (b))
+
+uintmax_t
+strtoumax(nptr, endptr, base)
+ register const char * __restrict__ nptr;
+ char ** __restrict__ endptr;
+ register int base;
+ {
+ register uintmax_t accum; /* accumulates converted value */
+ register uintmax_t next; /* for computing next value of accum */
+ register int n; /* numeral from digit character */
+ int minus; /* set iff minus sign seen (yes!) */
+ int toobig; /* set iff value overflows */
+
+ if ( endptr != NULL )
+ *endptr = (char *)nptr; /* in case no conversion's performed */
+
+ if ( base < 0 || base == 1 || base > 36 )
+ {
+ errno = EDOM;
+ return 0; /* unspecified behavior */
+ }
+
+ /* skip initial, possibly empty sequence of white-space characters */
+
+ while ( isspace(*nptr) )
+ ++nptr;
+
+ /* process subject sequence: */
+
+ /* optional sign (yes!) */
+
+ if ( (minus = *nptr == '-') || *nptr == '+' )
+ ++nptr;
+
+ if ( base == 0 )
+ {
+ if ( *nptr == '0' )
+ {
+ if ( nptr[1] == 'X' || nptr[1] == 'x' )
+ base = 16;
+ else
+ base = 8;
+ }
+ else
+ base = 10;
+ }
+
+ /* optional "0x" or "0X" for base 16 */
+
+ if ( base == 16 && *nptr == '0' && (nptr[1] == 'X' || nptr[1] == 'x') )
+ nptr += 2; /* skip past this prefix */
+
+ /* check whether there is at least one valid digit */
+
+ n = ToNumber(*nptr);
+ ++nptr;
+
+ if ( !valid(n, base) )
+ return 0; /* subject seq. not of expected form */
+
+ accum = n;
+
+ for ( toobig = 0; n = ToNumber(*nptr), valid(n, base); ++nptr )
+ if ( accum > UINTMAX_MAX / base + 1 /* major wrap-around */
+ || (next = base * accum + n) < accum /* minor wrap-around */
+ )
+ toobig = 1; /* but keep scanning */
+ else
+ accum = next;
+
+ if ( endptr != NULL )
+ *endptr = (char *)nptr; /* points to first not-valid-digit */
+
+ if ( toobig )
+ {
+ errno = ERANGE;
+ return UINTMAX_MAX;
+ }
+ else
+ return minus ? -accum : accum; /* (yes!) */
+ }
+
+unsigned long long __attribute__ ((alias ("strtoumax")))
+strtoull (const char* __restrict__ nptr, char ** __restrict__ endptr, int base);
libc/mingw/misc/tdelete.c
@@ -0,0 +1,64 @@
+/* $NetBSD: tdelete.c,v 1.3 1999/09/20 04:39:43 lukem Exp $ */
+
+/*
+ * Tree search generalized from Knuth (6.2.2) Algorithm T just like
+ * the AT&T man page says.
+ *
+ * The node_t structure is for internal use only, lint doesn't grok it.
+ *
+ * Written by reading the System V Interface Definition, not the code.
+ *
+ * Totally public domain.
+ */
+
+#include <assert.h>
+#define _SEARCH_PRIVATE
+#include <search.h>
+#include <stdlib.h>
+
+#define _DIAGASSERT assert
+
+
+
+/* delete node with given key */
+void *
+tdelete(const void *vkey, /* key to be deleted */
+ void **vrootp, /* address of the root of tree */
+ int (*compar)(const void *, const void *))
+{
+ node_t **rootp = (node_t **)vrootp;
+ node_t *p, *q, *r;
+ int cmp;
+
+ _DIAGASSERT((uintptr_t)compar != (uintptr_t)NULL);
+
+ if (rootp == NULL || (p = *rootp) == NULL)
+ return NULL;
+
+ while ((cmp = (*compar)(vkey, (*rootp)->key)) != 0) {
+ p = *rootp;
+ rootp = (cmp < 0) ?
+ &(*rootp)->llink : /* follow llink branch */
+ &(*rootp)->rlink; /* follow rlink branch */
+ if (*rootp == NULL)
+ return NULL; /* key not found */
+ }
+ r = (*rootp)->rlink; /* D1: */
+ if ((q = (*rootp)->llink) == NULL) /* Left NULL? */
+ q = r;
+ else if (r != NULL) { /* Right link is NULL? */
+ if (r->llink == NULL) { /* D2: Find successor */
+ r->llink = q;
+ q = r;
+ } else { /* D3: Find NULL link */
+ for (q = r->llink; q->llink != NULL; q = r->llink)
+ r = q;
+ r->llink = q->rlink;
+ q->llink = (*rootp)->llink;
+ q->rlink = (*rootp)->rlink;
+ }
+ }
+ free(*rootp); /* D4: Free node */
+ *rootp = q; /* link parent to new node */
+ return p;
+}
libc/mingw/misc/tfind.c
@@ -0,0 +1,42 @@
+/* $NetBSD: tfind.c,v 1.3.18.2 2005/03/23 11:12:21 tron Exp $ */
+
+/*
+ * Tree search generalized from Knuth (6.2.2) Algorithm T just like
+ * the AT&T man page says.
+ *
+ * The node_t structure is for internal use only, lint doesn't grok it.
+ *
+ * Written by reading the System V Interface Definition, not the code.
+ *
+ * Totally public domain.
+ */
+
+#include <assert.h>
+#define _SEARCH_PRIVATE
+#include <stdlib.h>
+#include <search.h>
+
+
+/* find a node, or return 0 */
+void *
+tfind (const void *vkey, void * const *vrootp,
+ int (*compar) (const void *, const void *))
+{
+ node_t * const *rootp = (node_t * const*)vrootp;
+
+ if (rootp == NULL)
+ return NULL;
+
+ while (*rootp != NULL)
+ {
+ /* T1: */
+ int r;
+
+ if ((r = (*compar)(vkey, (*rootp)->key)) == 0) /* T2: */
+ return *rootp; /* key found */
+ rootp = (r < 0) ?
+ &(*rootp)->llink : /* T3: follow left branch */
+ &(*rootp)->rlink; /* T4: follow right branch */
+ }
+ return NULL;
+}
libc/mingw/misc/tsearch.c
@@ -0,0 +1,58 @@
+/* $NetBSD: tsearch.c,v 1.4 1999/09/20 04:39:43 lukem Exp $ */
+
+/*
+ * Tree search generalized from Knuth (6.2.2) Algorithm T just like
+ * the AT&T man page says.
+ *
+ * The node_t structure is for internal use only, lint doesn't grok it.
+ *
+ * Written by reading the System V Interface Definition, not the code.
+ *
+ * Totally public domain.
+ */
+
+#include <assert.h>
+#define _SEARCH_PRIVATE
+#include <search.h>
+#include <stdlib.h>
+
+
+/* find or insert datum into search tree */
+void *
+tsearch (const void * __restrict__ vkey, /* key to be located */
+ void ** __restrict__ vrootp, /* address of tree root */
+ int (*compar) (const void *, const void *))
+{
+ node_t *q, **n;
+ node_t **rootp = (node_t **)vrootp;
+
+ if (rootp == NULL)
+ return NULL;
+
+ n = rootp;
+ while (*n != NULL)
+ {
+ /* Knuth's T1: */
+ int r;
+
+ if ((r = (*compar)(vkey, ((*n)->key))) == 0) /* T2: */
+ return *n; /* we found it! */
+
+ n = (r < 0) ?
+ &(*rootp)->llink : /* T3: follow left branch */
+ &(*rootp)->rlink; /* T4: follow right branch */
+ if (*n == NULL)
+ break;
+ rootp = n;
+ }
+
+ q = malloc(sizeof(node_t)); /* T5: key not found */
+ if (!q)
+ return q;
+ *n = q;
+ /* make new node */
+ /* LINTED const castaway ok */
+ q->key = (void *)vkey; /* initialize new node */
+ q->llink = q->rlink = NULL;
+ return q;
+}
libc/mingw/misc/twalk.c
@@ -0,0 +1,49 @@
+/* $NetBSD: twalk.c,v 1.2 1999/09/16 11:45:37 lukem Exp $ */
+
+/*
+ * Tree search generalized from Knuth (6.2.2) Algorithm T just like
+ * the AT&T man page says.
+ *
+ * The node_t structure is for internal use only, lint doesn't grok it.
+ *
+ * Written by reading the System V Interface Definition, not the code.
+ *
+ * Totally public domain.
+ */
+
+#include <assert.h>
+#define _SEARCH_PRIVATE
+#include <search.h>
+#include <stdlib.h>
+
+static void trecurse (const node_t *, void (*action)(const void *, VISIT, int),
+ int level) __MINGW_ATTRIB_NONNULL (1)
+ __MINGW_ATTRIB_NONNULL (2);
+/* Walk the nodes of a tree */
+static void
+trecurse (const node_t *root, /* Root of the tree to be walked */
+ void (*action)(const void *, VISIT, int),
+ int level)
+{
+ if (root->llink == NULL && root->rlink == NULL)
+ (*action)(root, leaf, level);
+ else
+ {
+ (*action)(root, preorder, level);
+ if (root->llink != NULL)
+ trecurse (root->llink, action, level + 1);
+ (*action)(root, postorder, level);
+ if (root->rlink != NULL)
+ trecurse(root->rlink, action, level + 1);
+ (*action)(root, endorder, level);
+ }
+}
+
+/* Walk the nodes of a tree */
+void
+twalk (const void *vroot, /* Root of the tree to be walked */
+ void (*action) (const void *, VISIT, int))
+{
+ if (vroot != NULL && action != NULL)
+ trecurse(vroot, action, 0);
+}
libc/mingw/misc/uchar_c16rtomb.c
@@ -0,0 +1,32 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/* ISO C1x Unicode utilities
+ * Based on ISO/IEC SC22/WG14 9899 TR 19769 (SC22 N1326)
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Date: 2011-09-27
+ */
+
+#include <errno.h>
+#include <uchar.h>
+
+size_t c16rtomb (char *__restrict__ s,
+ char16_t c16,
+ mbstate_t *__restrict__ state)
+{
+/* wchar_t should compatible to char16_t on Windows */
+ return wcrtomb(s, c16, state);
+}
+
libc/mingw/misc/uchar_c32rtomb.c
@@ -0,0 +1,59 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/* ISO C1x Unicode utilities
+ * Based on ISO/IEC SC22/WG14 9899 TR 19769 (SC22 N1326)
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Date: 2011-09-27
+ */
+
+#include <errno.h>
+#include <uchar.h>
+
+size_t c32rtomb (char *__restrict__ s,
+ char32_t c32,
+ mbstate_t *__restrict__ __UNUSED_PARAM(ps))
+{
+ if (c32 <= 0x7F) /* 7 bits needs 1 byte */
+ {
+ *s = (char)c32 & 0x7F;
+ return 1;
+ }
+ else if (c32 <= 0x7FF) /* 11 bits needs 2 bytes */
+ {
+ s[1] = 0x80 | (char)(c32 & 0x3F);
+ s[0] = 0xC0 | (char)(c32 >> 6);
+ return 2;
+ }
+ else if (c32 <= 0xFFFF) /* 16 bits needs 3 bytes */
+ {
+ s[2] = 0x80 | (char)(c32 & 0x3F);
+ s[1] = 0x80 | (char)((c32 >> 6) & 0x3F);
+ s[0] = 0xE0 | (char)(c32 >> 12);
+ return 3;
+ }
+ else if (c32 <= 0x1FFFFF) /* 21 bits needs 4 bytes */
+ {
+ s[3] = 0x80 | (char)(c32 & 0x3F);
+ s[2] = 0x80 | (char)((c32 >> 6) & 0x3F);
+ s[1] = 0x80 | (char)((c32 >> 12) & 0x3F);
+ s[0] = 0xF0 | (char)(c32 >> 18);
+ return 4;
+ }
+
+ errno = EILSEQ;
+ return (size_t)-1;
+}
+
libc/mingw/misc/uchar_mbrtoc16.c
@@ -0,0 +1,33 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/* ISO C1x Unicode utilities
+ * Based on ISO/IEC SC22/WG14 9899 TR 19769 (SC22 N1326)
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Date: 2011-09-27
+ */
+
+#include <errno.h>
+#include <uchar.h>
+
+size_t mbrtoc16 (char16_t *__restrict__ pc16,
+ const char *__restrict__ s,
+ size_t n,
+ mbstate_t *__restrict__ state)
+{
+/* wchar_t should compatible to char16_t on Windows */
+ return mbrtowc((wchar_t *)pc16, s, n, state);
+}
+
libc/mingw/misc/uchar_mbrtoc32.c
@@ -0,0 +1,72 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/* ISO C1x Unicode utilities
+ * Based on ISO/IEC SC22/WG14 9899 TR 19769 (SC22 N1326)
+ *
+ * THIS SOFTWARE IS NOT COPYRIGHTED
+ *
+ * This source code is offered for use in the public domain. You may
+ * use, modify or distribute it freely.
+ *
+ * This code is distributed in the hope that it will be useful but
+ * WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
+ * DISCLAIMED. This includes but is not limited to warranties of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * Date: 2011-09-27
+ */
+
+#include <errno.h>
+#include <uchar.h>
+
+size_t mbrtoc32 (char32_t *__restrict__ pc32,
+ const char *__restrict__ s,
+ size_t n,
+ mbstate_t *__restrict__ __UNUSED_PARAM(ps))
+{
+ if (*s == 0)
+ {
+ *pc32 = 0;
+ return 0;
+ }
+
+ /* ASCII character - high bit unset */
+ if ((*s & 0x80) == 0)
+ {
+ *pc32 = *s;
+ return 1;
+ }
+
+ /* Multibyte chars */
+ if ((*s & 0xE0) == 0xC0) /* 110xxxxx needs 2 bytes */
+ {
+ if (n < 2)
+ return (size_t)-2;
+
+ *pc32 = ((s[0] & 31) << 6) | (s[1] & 63);
+ return 2;
+ }
+ else if ((*s & 0xf0) == 0xE0) /* 1110xxxx needs 3 bytes */
+ {
+ if (n < 3)
+ return (size_t)-2;
+
+ *pc32 = ((s[0] & 15) << 12) | ((s[1] & 63) << 6) | (s[2] & 63);
+ return 3;
+ }
+ else if ((*s & 0xF8) == 0xF0) /* 11110xxx needs 4 bytes */
+ {
+ if (n < 4)
+ return (size_t)-2;
+
+ *pc32 = ((s[0] & 7) << 18) | ((s[1] & 63) << 12) | ((s[2] & 63) << 6) | (s[4] & 63);
+ return 4;
+ }
+
+ errno = EILSEQ;
+ return (size_t)-1;
+}
+
libc/mingw/misc/wassert.c
@@ -0,0 +1,49 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <windows.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <wchar.h>
+#include <signal.h>
+
+extern int mingw_app_type;
+
+void __cdecl _wassert (const wchar_t *, const wchar_t *,unsigned);
+void __cdecl _assert (const char *, const char *, unsigned);
+
+void __cdecl
+_wassert (const wchar_t *_Message, const wchar_t *_File, unsigned _Line)
+{
+ wchar_t *msgbuf = (wchar_t *) malloc (8192*sizeof(wchar_t));
+ wchar_t fn[MAX_PATH + 1];
+ DWORD nCode;
+
+ if (!_File || _File[0] == 0)
+ _File = L"<unknown>";
+ if (!_Message || _Message[0] == 0)
+ _Message = L"?";
+ if (! GetModuleFileNameW (NULL, fn, MAX_PATH))
+ wcscpy (fn, L"<unknown>");
+ _snwprintf (msgbuf, 8191, L"Assertion failed!\n\nProgram: %ws\n"
+ "File: %ws, Line %u\n\nExpression: %ws",
+ fn, _File,_Line, _Message);
+ if (mingw_app_type == 0)
+ {
+ fwprintf (stderr, L"%ws\n", msgbuf);
+ abort ();
+ }
+ nCode = MessageBoxW (NULL, msgbuf, L"MinGW Runtime Assertion", MB_ABORTRETRYIGNORE|
+ MB_ICONHAND|MB_SETFOREGROUND|MB_TASKMODAL);
+ if (nCode == IDABORT)
+ {
+ raise (SIGABRT);
+ _exit (3);
+ abort ();
+ }
+ if (nCode == IDIGNORE)
+ return;
+ abort ();
+}
libc/mingw/misc/wcrtomb.c
@@ -0,0 +1,100 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include "mb_wc_common.h"
+#include <wchar.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <limits.h>
+#include <windows.h>
+
+__attribute__((noinline))
+static int __MINGW_ATTRIB_NONNULL(1)
+ __wcrtomb_cp (char *dst, wchar_t wc, const unsigned int cp,
+ const unsigned int mb_max)
+{
+ if (cp == 0)
+ {
+ if (wc > 255)
+ {
+ errno = EILSEQ;
+ return -1;
+ }
+ *dst = (char) wc;
+ return 1;
+ }
+ else
+ {
+ int invalid_char = 0;
+
+ int size = WideCharToMultiByte (cp, 0 /* Is this correct flag? */,
+ &wc, 1, dst, mb_max,
+ NULL, &invalid_char);
+ if (size == 0 || invalid_char)
+ {
+ errno = EILSEQ;
+ return -1;
+ }
+ return size;
+ }
+}
+
+size_t
+wcrtomb (char *dst, wchar_t wc, mbstate_t * __UNUSED_PARAM (ps))
+{
+ char byte_bucket [MB_LEN_MAX];
+ char* tmp_dst = dst ? dst : &byte_bucket[0];
+ return (size_t)__wcrtomb_cp (tmp_dst, wc, ___lc_codepage_func(),
+ MB_CUR_MAX);
+}
+
+size_t wcsrtombs (char *dst, const wchar_t **src, size_t len,
+ mbstate_t * __UNUSED_PARAM (ps))
+{
+ int ret = 0;
+ size_t n = 0;
+ const unsigned int cp = ___lc_codepage_func();
+ const unsigned int mb_max = MB_CUR_MAX;
+ const wchar_t *pwc = *src;
+
+ if (src == NULL || *src == NULL) /* undefined behavior */
+ return 0;
+
+ if (dst != NULL)
+ {
+ while (n < len)
+ {
+ if ((ret = __wcrtomb_cp (dst, *pwc, cp, mb_max)) <= 0)
+ return (size_t) -1;
+ n += ret;
+ dst += ret;
+ if (*(dst - 1) == '\0')
+ {
+ *src = (wchar_t *) NULL;
+ return (n - 1);
+ }
+ pwc++;
+ }
+ *src = pwc;
+ }
+ else
+ {
+ char byte_bucket [MB_LEN_MAX];
+ while (1)
+ {
+ if ((ret = __wcrtomb_cp (&byte_bucket[0], *pwc, cp, mb_max)) <= 0)
+ return (size_t) -1;
+ n += ret;
+ if (byte_bucket [ret - 1] == '\0')
+ return (n - 1);
+ pwc++;
+ }
+ }
+
+ return n;
+}
libc/mingw/misc/wcsnlen.c
@@ -0,0 +1,13 @@
+#define __CRT__NO_INLINE
+#include <string.h>
+
+size_t __cdecl
+wcsnlen(const wchar_t *w, size_t ncnt)
+{
+ size_t n = 0;
+
+ for (; n < ncnt && *w != 0; n++, w++)
+ ;
+
+ return n;
+}
libc/mingw/misc/wcstof.c
@@ -0,0 +1,66 @@
+/* Wide char wrapper for strtof
+ * Revision history:
+ * 25 Aug 2006 Initial version.
+ *
+ * Contributor: Danny Smith <dannysmith@users.sourceforege.net>
+ */
+
+ /* This routine has been placed in the public domain.*/
+
+#define WIN32_LEAN_AND_MEAN
+#include <windows.h>
+#include <locale.h>
+#include <wchar.h>
+#include <stdlib.h>
+#include <string.h>
+#include <mbstring.h>
+
+#include "mb_wc_common.h"
+
+float wcstof (const wchar_t * __restrict__ wcs, wchar_t ** __restrict__ wcse)
+{
+ char * cs;
+ char * cse;
+ unsigned int i;
+ float ret;
+ const unsigned int cp = ___lc_codepage_func();
+
+ /* Allocate enough room for (possibly) mb chars */
+ cs = (char *) malloc ((wcslen(wcs)+1) * MB_CUR_MAX);
+
+ if (cp == 0) /* C locale */
+ {
+ for (i = 0; (wcs[i] != 0) && wcs[i] <= 255; i++)
+ cs[i] = (char) wcs[i];
+ cs[i] = '\0';
+ }
+ else
+ {
+ int nbytes = -1;
+ int mb_len = 0;
+ /* loop through till we hit null or invalid character */
+ for (i = 0; (wcs[i] != 0) && (nbytes != 0); i++)
+ {
+ nbytes = WideCharToMultiByte(cp, WC_COMPOSITECHECK | WC_SEPCHARS,
+ wcs + i, 1, cs + mb_len, MB_CUR_MAX,
+ NULL, NULL);
+ mb_len += nbytes;
+ }
+ cs[mb_len] = '\0';
+ }
+
+ ret = strtof (cs, &cse);
+
+ if (wcse)
+ {
+ /* Make sure temp mbstring cs has 0 at cse. */
+ *cse = '\0';
+ i = MultiByteToWideChar (cp, MB_ERR_INVALID_CHARS, cs, -1, NULL, 0);
+ if (i > 0)
+ i -= 1; /* Remove zero terminator from length. */
+ *wcse = (wchar_t *) wcs + i;
+ }
+ free (cs);
+
+ return ret;
+}
libc/mingw/misc/wcstoimax.c
@@ -0,0 +1,124 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ This source code was extracted from the Q8 package created and
+ placed in the PUBLIC DOMAIN by Doug Gwyn <gwyn@arl.mil>
+
+ last edit: 1999/11/05 gwyn@arl.mil
+
+ Implements subclause 7.8.2 of ISO/IEC 9899:1999 (E).
+
+ This particular implementation requires the matching <inttypes.h>.
+ It also assumes that character codes for A..Z and a..z are in
+ contiguous ascending order; this is true for ASCII but not EBCDIC.
+*/
+
+#include <wchar.h>
+#include <errno.h>
+#include <ctype.h>
+#include <inttypes.h>
+
+/* convert digit wide character to number, in any base */
+
+#define ToWNumber(c) (iswdigit(c) ? (c) - L'0' : \
+ iswupper(c) ? (c) - L'A' + 10 : \
+ iswlower(c) ? (c) - L'a' + 10 : \
+ -1 /* "invalid" flag */ \
+ )
+
+/* validate converted digit character for specific base */
+#define valid(n, b) ((n) >= 0 && (n) < (b))
+
+intmax_t
+wcstoimax(nptr, endptr, base)
+ register const wchar_t * __restrict__ nptr;
+ wchar_t ** __restrict__ endptr;
+ register int base;
+ {
+ register uintmax_t accum; /* accumulates converted value */
+ register int n; /* numeral from digit character */
+ int minus; /* set iff minus sign seen */
+ int toobig; /* set iff value overflows */
+
+ if ( endptr != NULL )
+ *endptr = (wchar_t *)nptr; /* in case no conv performed */
+
+ if ( base < 0 || base == 1 || base > 36 )
+ {
+ errno = EDOM;
+ return 0; /* unspecified behavior */
+ }
+
+ /* skip initial, possibly empty sequence of white-space w.characters */
+
+ while ( iswspace(*nptr) )
+ ++nptr;
+
+ /* process subject sequence: */
+
+ /* optional sign */
+
+ if ( (minus = *nptr == L'-') || *nptr == L'+' )
+ ++nptr;
+
+ if ( base == 0 )
+ {
+ if ( *nptr == L'0' )
+ {
+ if ( nptr[1] == L'X' || nptr[1] == L'x' )
+ base = 16;
+ else
+ base = 8;
+ }
+ else
+ base = 10;
+ }
+ /* optional "0x" or "0X" for base 16 */
+
+ if ( base == 16 && *nptr == L'0'
+ && (nptr[1] == L'X' || nptr[1] == L'x')
+ )
+ nptr += 2; /* skip past this prefix */
+
+ /* check whether there is at least one valid digit */
+
+ n = ToWNumber(*nptr);
+ ++nptr;
+
+ if ( !valid(n, base) )
+ return 0; /* subject seq. not of expected form */
+
+ accum = n;
+
+ for ( toobig = 0; n = ToWNumber(*nptr), valid(n, base); ++nptr )
+ if ( accum > (uintmax_t)(INTMAX_MAX / base + 2) ) /* major wrap-around */
+ toobig = 1; /* but keep scanning */
+ else
+ accum = base * accum + n;
+
+ if ( endptr != NULL )
+ *endptr = (wchar_t *)nptr; /* -> first not-valid-digit */
+
+ if ( minus )
+ {
+ if ( accum > (uintmax_t)INTMAX_MAX + 1 )
+ toobig = 1;
+ }
+ else
+ if ( accum > (uintmax_t)INTMAX_MAX )
+ toobig = 1;
+
+ if ( toobig )
+ {
+ errno = ERANGE;
+ return minus ? INTMAX_MIN : INTMAX_MAX;
+ }
+ else
+ return (intmax_t)(minus ? -accum : accum);
+ }
+
+long long __attribute__ ((alias ("wcstoimax")))
+wcstoll (const wchar_t* __restrict__ nptr, wchar_t ** __restrict__ endptr, int base);
libc/mingw/misc/wcstold.c
@@ -0,0 +1,74 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/* Wide char wrapper for strtold
+ * Revision history:
+ * 6 Nov 2002 Initial version.
+ * 25 Aug 2006 Don't use strtold internal functions.
+ *
+ * Contributor: Danny Smith <dannysmith@users.sourceforege.net>
+ */
+
+ /* This routine has been placed in the public domain.*/
+
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include <windows.h>
+#include <locale.h>
+#include <wchar.h>
+#include <stdlib.h>
+#include <string.h>
+#include <mbstring.h>
+
+#include "mb_wc_common.h"
+
+long double wcstold (const wchar_t * __restrict__ wcs, wchar_t ** __restrict__ wcse)
+{
+ char * cs;
+ char * cse;
+ unsigned int i;
+ long double ret;
+ const unsigned int cp = ___lc_codepage_func();
+
+ /* Allocate enough room for (possibly) mb chars */
+ cs = (char *) malloc ((wcslen(wcs)+1) * MB_CUR_MAX);
+
+ if (cp == 0) /* C locale */
+ {
+ for (i = 0; (wcs[i] != 0) && wcs[i] <= 255; i++)
+ cs[i] = (char) wcs[i];
+ cs[i] = '\0';
+ }
+ else
+ {
+ int nbytes = -1;
+ int mb_len = 0;
+ /* loop through till we hit null or invalid character */
+ for (i = 0; (wcs[i] != 0) && (nbytes != 0); i++)
+ {
+ nbytes = WideCharToMultiByte(cp, WC_COMPOSITECHECK | WC_SEPCHARS,
+ wcs + i, 1, cs + mb_len, MB_CUR_MAX,
+ NULL, NULL);
+ mb_len += nbytes;
+ }
+ cs[mb_len] = '\0';
+ }
+
+ ret = strtold (cs, &cse);
+
+ if (wcse)
+ {
+ /* Make sure temp mbstring has 0 at cse. */
+ *cse = '\0';
+ i = MultiByteToWideChar (cp, MB_ERR_INVALID_CHARS, cs, -1, NULL, 0);
+ if (i > 0)
+ i -= 1; /* Remove zero terminator from length. */
+ *wcse = (wchar_t *) wcs + i;
+ }
+ free (cs);
+
+ return ret;
+}
libc/mingw/misc/wcstoumax.c
@@ -0,0 +1,118 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ This source code was extracted from the Q8 package created and
+ placed in the PUBLIC DOMAIN by Doug Gwyn <gwyn@arl.mil>
+
+ last edit: 1999/11/05 gwyn@arl.mil
+
+ Implements subclause 7.8.2 of ISO/IEC 9899:1999 (E).
+
+ This particular implementation requires the matching <inttypes.h>.
+ It also assumes that character codes for A..Z and a..z are in
+ contiguous ascending order; this is true for ASCII but not EBCDIC.
+*/
+
+#include <wchar.h>
+#include <errno.h>
+#include <ctype.h>
+#include <inttypes.h>
+
+/* convert digit wide character to number, in any base */
+
+#define ToWNumber(c) (iswdigit(c) ? (c) - L'0' : \
+ iswupper(c) ? (c) - L'A' + 10 : \
+ iswlower(c) ? (c) - L'a' + 10 : \
+ -1 /* "invalid" flag */ \
+ )
+
+/* validate converted digit character for specific base */
+#define valid(n, b) ((n) >= 0 && (n) < (b))
+
+uintmax_t
+wcstoumax(nptr, endptr, base)
+ register const wchar_t * __restrict__ nptr;
+ wchar_t ** __restrict__ endptr;
+ register int base;
+ {
+ register uintmax_t accum; /* accumulates converted value */
+ register uintmax_t next; /* for computing next value of accum */
+ register int n; /* numeral from digit character */
+ int minus; /* set iff minus sign seen (yes!) */
+ int toobig; /* set iff value overflows */
+
+ if ( endptr != NULL )
+ *endptr = (wchar_t *)nptr; /* in case no conv performed */
+
+ if ( base < 0 || base == 1 || base > 36 )
+ {
+ errno = EDOM;
+ return 0; /* unspecified behavior */
+ }
+
+ /* skip initial, possibly empty sequence of white-space w.characters */
+
+ while ( iswspace(*nptr) )
+ ++nptr;
+
+ /* process subject sequence: */
+
+ /* optional sign */
+
+ if ( (minus = *nptr == L'-') || *nptr == L'+' )
+ ++nptr;
+
+ if ( base == 0 )
+ {
+ if ( *nptr == L'0' )
+ {
+ if ( nptr[1] == L'X' || nptr[1] == L'x' )
+ base = 16;
+ else
+ base = 8;
+ }
+ else
+ base = 10;
+ }
+ /* optional "0x" or "0X" for base 16 */
+
+ if ( base == 16 && *nptr == L'0'
+ && (nptr[1] == L'X' || nptr[1] == L'x')
+ )
+ nptr += 2; /* skip past this prefix */
+
+ /* check whether there is at least one valid digit */
+
+ n = ToWNumber(*nptr);
+ ++nptr;
+
+ if ( !valid(n, base) )
+ return 0; /* subject seq. not of expected form */
+
+ accum = n;
+
+ for ( toobig = 0; n = ToWNumber(*nptr), valid(n, base); ++nptr )
+ if ( accum > UINTMAX_MAX / base + 1 /* major wrap-around */
+ || (next = base * accum + n) < accum /* minor wrap-around */
+ )
+ toobig = 1; /* but keep scanning */
+ else
+ accum = next;
+
+ if ( endptr != NULL )
+ *endptr = (wchar_t *)nptr; /* -> first not-valid-digit */
+
+ if ( toobig )
+ {
+ errno = ERANGE;
+ return UINTMAX_MAX;
+ }
+ else
+ return minus ? -accum : accum; /* (yes!) */
+ }
+
+unsigned long long __attribute__ ((alias ("wcstoumax")))
+wcstoull (const wchar_t* __restrict__ nptr, wchar_t ** __restrict__ endptr, int base);
libc/mingw/misc/wctob.c
@@ -0,0 +1,29 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#ifndef WIN32_LEAN_AND_MEAN
+#define WIN32_LEAN_AND_MEAN
+#endif
+#include "mb_wc_common.h"
+#include <wchar.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <windows.h>
+
+/* Return just the first byte after translating to multibyte. */
+int wctob (wint_t wc )
+{
+ wchar_t w = wc;
+ char c;
+ int invalid_char = 0;
+ if (!WideCharToMultiByte (___lc_codepage_func(),
+ 0 /* Is this correct flag? */,
+ &w, 1, &c, 1, NULL, &invalid_char)
+ || invalid_char)
+ return EOF;
+
+ return (int) c;
+}
libc/mingw/misc/wctrans.c
@@ -0,0 +1,65 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ wctrans.c
+ 7.25.3.2 Extensible wide-character case mapping functions
+
+ Contributed by: Danny Smith <dannysmith@usesr.sourcefoge.net>
+ 2005-02-24
+
+ This source code is placed in the PUBLIC DOMAIN. It is modified
+ from the Q8 package created by Doug Gwyn <gwyn@arl.mil>
+
+ */
+
+#include <string.h>
+#include <wctype.h>
+
+/*
+ This differs from the MS implementation of wctrans which
+ returns 0 for tolower and 1 for toupper. According to
+ C99, a 0 return value indicates invalid input.
+
+ These two function go in the same translation unit so that we
+ can ensure that
+ towctrans(wc, wctrans("tolower")) == towlower(wc)
+ towctrans(wc, wctrans("toupper")) == towupper(wc)
+ It also ensures that
+ towctrans(wc, wctrans("")) == wc
+ which is not required by standard.
+*/
+
+static const struct {
+ const char *name;
+ wctrans_t val; } tmap[] = {
+ {"tolower", _LOWER},
+ {"toupper", _UPPER}
+ };
+
+#define NTMAP (sizeof tmap / sizeof tmap[0])
+
+wctrans_t
+wctrans (const char* property)
+{
+ int i;
+ for ( i = 0; i < (int) NTMAP; ++i )
+ if (strcmp (property, tmap[i].name) == 0)
+ return tmap[i].val;
+ return 0;
+}
+
+wint_t towctrans (wint_t wc, wctrans_t desc)
+{
+ switch (desc)
+ {
+ case _LOWER:
+ return towlower (wc);
+ case _UPPER:
+ return towupper (wc);
+ default:
+ return wc;
+ }
+}
libc/mingw/misc/wctype.c
@@ -0,0 +1,65 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/*
+ wctype.c
+ 7.25.2.2.2 The wctype function
+
+ Contributed by: Danny Smith <dannysmith@usesr.sourcefoge.net>
+ 2005-02-24
+
+ This source code is placed in the PUBLIC DOMAIN. It is modified
+ from the Q8 package created by Doug Gwyn <gwyn@arl.mil>
+
+ The wctype function constructs a value with type wctype_t that
+ describes a class of wide characters identified by the string
+ argument property.
+
+ In particular, we map the property strings so that:
+
+ iswctype(wc, wctype("alnum")) == iswalnum(wc)
+ iswctype(wc, wctype("alpha")) == iswalpha(wc)
+ iswctype(wc, wctype("cntrl")) == iswcntrl(wc)
+ iswctype(wc, wctype("digit")) == iswdigit(wc)
+ iswctype(wc, wctype("graph")) == iswgraph(wc)
+ iswctype(wc, wctype("lower")) == iswlower(wc)
+ iswctype(wc, wctype("print")) == iswprint(wc)
+ iswctype(wc, wctype("punct")) == iswpunct(wc)
+ iswctype(wc, wctype("space")) == iswspace(wc)
+ iswctype(wc, wctype("upper")) == iswupper(wc)
+ iswctype(wc, wctype("xdigit")) == iswxdigit(wc)
+
+*/
+
+#include <string.h>
+#include <wctype.h>
+
+/* Using the bit-OR'd ctype character classification flags as return
+ values achieves compatibility with MS iswctype(). */
+static const struct {
+ const char *name;
+ wctype_t flags;} cmap[] = {
+ {"alnum", _ALPHA|_DIGIT},
+ {"alpha", _ALPHA},
+ {"cntrl", _CONTROL},
+ {"digit", _DIGIT},
+ {"graph", _PUNCT|_ALPHA|_DIGIT},
+ {"lower", _LOWER},
+ {"print", _BLANK|_PUNCT|_ALPHA|_DIGIT},
+ {"punct", _PUNCT},
+ {"space", _SPACE},
+ {"upper", _UPPER},
+ {"xdigit", _HEX}
+ };
+
+#define NCMAP (sizeof cmap / sizeof cmap[0])
+wctype_t wctype (const char *property)
+{
+ int i;
+ for (i = 0; i < (int) NCMAP; ++i)
+ if (strcmp (property, cmap[i].name) == 0)
+ return cmap[i].flags;
+ return 0;
+}
libc/mingw/misc/wdirent.c
@@ -0,0 +1,5 @@
+#define _UNICODE 1
+#define UNICODE 1
+
+#include <wchar.h>
+#include "dirent.c"
libc/mingw/misc/winbs_uint64.c
@@ -0,0 +1,39 @@
+unsigned long long __cdecl _byteswap_uint64(unsigned long long _Int64);
+
+unsigned long long __cdecl _byteswap_uint64(unsigned long long _Int64)
+{
+#if defined(_AMD64_) || defined(__x86_64__)
+ unsigned long long retval;
+ __asm__ __volatile__ ("bswapq %[retval]" : [retval] "=rm" (retval) : "[retval]" (_Int64));
+ return retval;
+#elif defined(_X86_) || defined(__i386__)
+ union {
+ long long int64part;
+ struct {
+ unsigned long lowpart;
+ unsigned long hipart;
+ };
+ } retval;
+ retval.int64part = _Int64;
+ __asm__ __volatile__ ("bswapl %[lowpart]\n"
+ "bswapl %[hipart]\n"
+ : [lowpart] "=rm" (retval.hipart), [hipart] "=rm" (retval.lowpart) : "[lowpart]" (retval.lowpart), "[hipart]" (retval.hipart));
+ return retval.int64part;
+#else
+ unsigned char *b = (void*)&_Int64;
+ unsigned char tmp;
+ tmp = b[0];
+ b[0] = b[7];
+ b[7] = tmp;
+ tmp = b[1];
+ b[1] = b[6];
+ b[6] = tmp;
+ tmp = b[2];
+ b[2] = b[5];
+ b[5] = tmp;
+ tmp = b[3];
+ b[3] = b[4];
+ b[4] = tmp;
+ return _Int64;
+#endif
+}
libc/mingw/misc/winbs_ulong.c
@@ -0,0 +1,20 @@
+unsigned long __cdecl _byteswap_ulong (unsigned long _Long);
+
+unsigned long __cdecl _byteswap_ulong (unsigned long _Long)
+{
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+ unsigned long retval;
+ __asm__ __volatile__ ("bswapl %[retval]" : [retval] "=rm" (retval) : "[retval]" (_Long));
+ return retval;
+#else
+ unsigned char *b = (void*)&_Long;
+ unsigned char tmp;
+ tmp = b[0];
+ b[0] = b[3];
+ b[3] = tmp;
+ tmp = b[1];
+ b[1] = b[2];
+ b[2] = tmp;
+ return _Long;
+#endif /* defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__) */
+}
libc/mingw/misc/winbs_ushort.c
@@ -0,0 +1,17 @@
+unsigned short __cdecl _byteswap_ushort(unsigned short _Short);
+
+unsigned short __cdecl _byteswap_ushort(unsigned short _Short)
+{
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+ unsigned short retval;
+ __asm__ __volatile__ ("rorw $8, %w[retval]" : [retval] "=rm" (retval) : "[retval]" (_Short));
+ return retval;
+#else
+ unsigned char *b = (void*)&_Short;
+ unsigned char tmp;
+ tmp = b[0];
+ b[0] = b[1];
+ b[1] = tmp;
+ return _Short;
+#endif /* defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__) */
+}
libc/mingw/misc/wmemchr.c
@@ -0,0 +1,35 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#define __CRT__NO_INLINE
+#include <wchar.h>
+
+#if 0
+wchar_t *wmemchr(s, c, n)
+ register const wchar_t *s;
+ register wchar_t c;
+ register size_t n;
+{
+ if ( s != NULL )
+ for ( ; n > 0; ++s, --n )
+ if ( *s == c )
+ return (wchar_t *)s;
+
+ return NULL;
+}
+#endif
+
+_CONST_RETURN wchar_t *__cdecl wmemchr(const wchar_t *_S,wchar_t _C,size_t _N)
+{
+ if (_S != NULL)
+ {
+ for ( ; 0 < _N; ++_S, --_N)
+ if (*_S == _C)
+ return (_CONST_RETURN wchar_t *)(_S);
+ }
+ return NULL;
+}
+
libc/mingw/misc/wmemcmp.c
@@ -0,0 +1,56 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+/* This source code was extracted from the Q8 package created and placed
+ in the PUBLIC DOMAIN by Doug Gwyn <gwyn@arl.mil>
+ last edit: 1999/11/05 gwyn@arl.mil
+
+ Implements subclause 7.24 of ISO/IEC 9899:1999 (E).
+
+ It supports an encoding where all char codes are mapped
+ to the *same* code values within a wchar_t or wint_t,
+ so long as no other wchar_t codes are used by the program.
+
+*/
+
+#define __CRT__NO_INLINE
+#include <wchar.h>
+
+#if 0
+int
+wmemcmp(s1, s2, n)
+ register const wchar_t *s1;
+ register const wchar_t *s2;
+ size_t n;
+{
+ if ( n == 0 || s1 == s2 )
+ return 0; /* even for NULL pointers */
+
+ if ( (s1 != NULL) != (s2 != NULL) )
+ return s2 == NULL ? 1 : -1; /* robust */
+
+ for ( ; n > 0; ++s1, ++s2, --n )
+ if ( *s1 != *s2 )
+ return *s1 - *s2;
+
+ return 0;
+}
+#endif
+
+int __cdecl wmemcmp(const wchar_t *_S1,const wchar_t *_S2,size_t _N)
+{
+ if (_N == 0 || _S1 == _S2)
+ return 0; /* even for NULL pointers */
+
+ if ((_S1 != NULL) != (_S2 != NULL))
+ return _S2 == NULL ? 1 : -1; /* robust */
+
+ for ( ; 0 < _N; ++_S1, ++_S2, --_N)
+ if (*_S1 != *_S2)
+ return (*_S1 < *_S2 ? -1 : +1);
+
+ return 0;
+}
+
libc/mingw/misc/wmemcpy.c
@@ -0,0 +1,33 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#define __CRT__NO_INLINE
+#include <wchar.h>
+
+#if 0
+wchar_t *
+wmemcpy(s1, s2, n)
+ register wchar_t * __restrict__ s1;
+ register const wchar_t * __restrict__ s2;
+ register size_t n;
+{
+ wchar_t *orig_s1 = s1;
+
+ if ( s1 == NULL || s2 == NULL || n == 0 )
+ return orig_s1; /* robust */
+
+ for ( ; n > 0; --n )
+ *s1++ = *s2++;
+
+ return orig_s1;
+}
+#endif
+
+wchar_t *__cdecl wmemcpy(wchar_t *_S1,const wchar_t *_S2,size_t _N)
+{
+ return (wchar_t *)memcpy(_S1,_S2,_N*sizeof(wchar_t));
+}
+
libc/mingw/misc/wmemmove.c
@@ -0,0 +1,45 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#define __CRT__NO_INLINE
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <wchar.h>
+
+#if 0
+wchar_t *
+wmemmove(s1, s2, n)
+ register wchar_t *s1;
+ register const wchar_t *s2;
+ register size_t n;
+{
+ wchar_t *orig_s1 = s1;
+
+ if ( s1 == NULL || s2 == NULL || n == 0 )
+ return orig_s1; /* robust */
+
+ /* XXX -- The following test works only within a flat address space! */
+ if ( s2 >= s1 )
+ for ( ; n > 0; --n )
+ *s1++ = *s2++;
+ else {
+ s1 += n;
+ s2 += n;
+
+ for ( ; n > 0; --n )
+ *--s1 = *--s2;
+ }
+
+ return orig_s1;
+}
+#endif
+
+wchar_t *__cdecl wmemmove(wchar_t *_S1,const wchar_t *_S2,size_t _N)
+{
+ return (wchar_t *)memmove(_S1,_S2,_N*sizeof(wchar_t));
+}
+
libc/mingw/misc/wmempcpy.c
@@ -0,0 +1,12 @@
+#define __CRT__NO_INLINE
+#include <wchar.h>
+
+wchar_t * __cdecl
+wmempcpy (wchar_t *d, const wchar_t *s, size_t len)
+{
+ wchar_t *r = d + len;
+ if (len != 0)
+ memcpy (d, s, len * sizeof (wchar_t));
+ return r;
+}
+
libc/mingw/misc/wmemset.c
@@ -0,0 +1,34 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#define __CRT__NO_INLINE
+#include <wchar.h>
+
+#if 0
+wchar_t *
+wmemset(s, c, n)
+ register wchar_t *s;
+ register wchar_t c;
+ register size_t n;
+{
+ wchar_t *orig_s = s;
+
+ if ( s != NULL )
+ for ( ; n > 0; --n )
+ *s++ = c;
+
+ return orig_s;
+}
+#endif
+
+wchar_t *__cdecl wmemset(wchar_t *_S,wchar_t _C,size_t _N)
+{
+ wchar_t *_Su = _S;
+ for ( ; 0 < _N; ++_Su, --_N)
+ *_Su = _C;
+ return (_S);
+}
+
libc/mingw/stdio/_Exit.c
@@ -0,0 +1,10 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __CRT__NO_INLINE
+#include <stdlib.h>
+
+void _Exit(int status)
+ { _exit(status); }
libc/mingw/stdio/_findfirst64i32.c
@@ -0,0 +1,21 @@
+#define __CRT__NO_INLINE
+#include <io.h>
+#include <string.h>
+
+intptr_t __cdecl _findfirst64i32(const char *_Filename,struct _finddata64i32_t *_FindData)
+{
+ struct __finddata64_t fd;
+ intptr_t ret = _findfirst64(_Filename,&fd);
+ if (ret == -1) {
+ memset(_FindData,0,sizeof(struct _finddata64i32_t));
+ return -1;
+ }
+ _FindData->attrib=fd.attrib;
+ _FindData->time_create=fd.time_create;
+ _FindData->time_access=fd.time_access;
+ _FindData->time_write=fd.time_write;
+ _FindData->size=(_fsize_t) fd.size;
+ strncpy(_FindData->name,fd.name,260);
+ return ret;
+}
+
libc/mingw/stdio/_findnext64i32.c
@@ -0,0 +1,21 @@
+#define __CRT__NO_INLINE
+#include <io.h>
+#include <string.h>
+
+int __cdecl _findnext64i32(intptr_t _FindHandle,struct _finddata64i32_t *_FindData)
+{
+ struct __finddata64_t fd;
+ int ret = _findnext64(_FindHandle,&fd);
+ if (ret == -1) {
+ memset(_FindData,0,sizeof(struct _finddata64i32_t));
+ return -1;
+ }
+ _FindData->attrib=fd.attrib;
+ _FindData->time_create=fd.time_create;
+ _FindData->time_access=fd.time_access;
+ _FindData->time_write=fd.time_write;
+ _FindData->size=(_fsize_t) fd.size;
+ strncpy(_FindData->name,fd.name,260);
+ return ret;
+}
+
libc/mingw/stdio/_fstat.c
@@ -0,0 +1,52 @@
+#define __CRT__NO_INLINE
+#include <sys/stat.h>
+
+/* FIXME: Relying on _USE_32BIT_TIME_T, which is a user-macro,
+during CRT compilation is plainly broken. Need an appropriate
+implementation to provide users the ability of compiling the
+CRT only with 32-bit time_t behavior. */
+#if defined(_USE_32BIT_TIME_T)
+int __cdecl
+fstat(int _Desc,struct stat *_Stat)
+{
+ struct _stat32 st;
+ int ret=_fstat32(_Desc,&st);
+ if (ret == -1) {
+ memset(_Stat,0,sizeof(struct stat));
+ return -1;
+ }
+ /* struct stat and struct _stat32
+ are the same for this case. */
+ memcpy(_Stat, &st, sizeof(struct _stat32));
+ return ret;
+}
+#else
+int __cdecl
+fstat(int _Desc,struct stat *_Stat)
+{
+ struct _stat64 st;
+ int ret=_fstat64(_Desc,&st);
+ if (ret == -1) {
+ memset(_Stat,0,sizeof(struct stat));
+ return -1;
+ }
+ /* struct stat and struct _stat64i32
+ are the same for this case. */
+ _Stat->st_dev=st.st_dev;
+ _Stat->st_ino=st.st_ino;
+ _Stat->st_mode=st.st_mode;
+ _Stat->st_nlink=st.st_nlink;
+ _Stat->st_uid=st.st_uid;
+ _Stat->st_gid=st.st_gid;
+ _Stat->st_rdev=st.st_rdev;
+ _Stat->st_size=(_off_t) st.st_size;
+ _Stat->st_atime=st.st_atime;
+ _Stat->st_mtime=st.st_mtime;
+ _Stat->st_ctime=st.st_ctime;
+ return ret;
+}
+#endif
+
+/* Add __imp__fstat and __imp__stat symbols. */
+int (*__MINGW_IMP_SYMBOL(fstat))(int, struct stat *) = &fstat;
+
libc/mingw/stdio/_fstat64i32.c
@@ -0,0 +1,25 @@
+#define __CRT__NO_INLINE
+#include <sys/stat.h>
+
+int __cdecl _fstat64i32(int _FileDes,struct _stat64i32 *_Stat)
+{
+ struct _stat64 st;
+ int ret=_fstat64(_FileDes,&st);
+ if (ret == -1) {
+ memset(_Stat,0,sizeof(struct _stat64i32));
+ return -1;
+ }
+ _Stat->st_dev=st.st_dev;
+ _Stat->st_ino=st.st_ino;
+ _Stat->st_mode=st.st_mode;
+ _Stat->st_nlink=st.st_nlink;
+ _Stat->st_uid=st.st_uid;
+ _Stat->st_gid=st.st_gid;
+ _Stat->st_rdev=st.st_rdev;
+ _Stat->st_size=(_off_t) st.st_size; /* 32bit size */
+ _Stat->st_atime=st.st_atime;
+ _Stat->st_mtime=st.st_mtime;
+ _Stat->st_ctime=st.st_ctime;
+ return ret;
+}
+
libc/mingw/stdio/_ftime.c
@@ -0,0 +1,19 @@
+#define __CRT__NO_INLINE
+#include <sys/stat.h>
+#include <sys/timeb.h>
+
+/* FIXME: Relying on _USE_32BIT_TIME_T, which is a user-macro,
+during CRT compilation is plainly broken. Need an appropriate
+implementation to provide users the ability of compiling the
+CRT only with 32-bit time_t behavior. */
+#if defined(_USE_32BIT_TIME_T)
+void __cdecl ftime (struct timeb *b)
+{
+ return _ftime ((struct __timeb32 *)b);
+}
+#else
+void __cdecl ftime (struct timeb *b)
+{
+ _ftime64((struct __timeb64 *)b);
+}
+#endif
libc/mingw/stdio/_getc_nolock.c
@@ -0,0 +1,8 @@
+#include <stdio.h>
+
+#undef _getc_nolock
+int __cdecl _getc_nolock(FILE *stream);
+int __cdecl _getc_nolock(FILE *stream)
+{
+ return _fgetc_nolock(stream);
+}
libc/mingw/stdio/_getwc_nolock.c
@@ -0,0 +1,8 @@
+#include <stdio.h>
+
+#undef _getwc_nolock
+wint_t __cdecl _getwc_nolock(FILE *stream);
+wint_t __cdecl _getwc_nolock(FILE *stream)
+{
+ return _fgetwc_nolock(stream);
+}
libc/mingw/stdio/_putc_nolock.c
@@ -0,0 +1,8 @@
+#include <stdio.h>
+
+#undef _putc_nolock
+int __cdecl _putc_nolock(int c, FILE *stream);
+int __cdecl _putc_nolock(int c, FILE *stream)
+{
+ return _fputc_nolock(c, stream);
+}
libc/mingw/stdio/_putwc_nolock.c
@@ -0,0 +1,8 @@
+#include <stdio.h>
+
+#undef _putwc_nolock
+wint_t __cdecl _putwc_nolock(wchar_t c, FILE *stream);
+wint_t __cdecl _putwc_nolock(wchar_t c, FILE *stream)
+{
+ return _fputwc_nolock(c, stream);
+}
libc/mingw/stdio/_stat.c
@@ -0,0 +1,120 @@
+#define __CRT__NO_INLINE
+#include <sys/stat.h>
+#include <stdlib.h>
+
+/**
+ * Returns _path without trailing slash if any
+ *
+ * - if _path has no trailing slash, the function returns it
+ * - if _path has a trailing slash, but is of the form C:/, then it returns it
+ * - otherwise, the function creates a new string, which is a copy of _path
+ * without the trailing slash. It is then the responsibility of the caller
+ * to free it.
+ */
+
+static char*
+_mingw_no_trailing_slash (const char* _path)
+{
+ int len;
+ char *p;
+
+ p = (char*)_path;
+
+ if (_path && *_path) {
+ len = strlen (_path);
+
+ /* Ignore X:\ */
+
+ if (len <= 1 || ((len == 2 || len == 3) && _path[1] == ':'))
+ return p;
+
+ /* Check UNC \\abc\<name>\ */
+ if ((_path[0] == '\\' || _path[0] == '/')
+ && (_path[1] == '\\' || _path[1] == '/'))
+ {
+ const char *r = &_path[2];
+ while (*r != 0 && *r != '\\' && *r != '/')
+ ++r;
+ if (*r != 0)
+ ++r;
+ if (*r == 0)
+ return p;
+ while (*r != 0 && *r != '\\' && *r != '/')
+ ++r;
+ if (*r != 0)
+ ++r;
+ if (*r == 0)
+ return p;
+ }
+
+ if (_path[len - 1] == '/' || _path[len - 1] == '\\')
+ {
+ p = (char*)malloc (len);
+ memcpy (p, _path, len - 1);
+ p[len - 1] = '\0';
+ }
+ }
+
+ return p;
+}
+/* FIXME: Relying on _USE_32BIT_TIME_T, which is a user-macro,
+during CRT compilation is plainly broken. Need an appropriate
+implementation to provide users the ability of compiling the
+CRT only with 32-bit time_t behavior. */
+#if defined(_USE_32BIT_TIME_T)
+int __cdecl
+stat(const char *_Filename,struct stat *_Stat)
+{
+ struct _stat32 st;
+ char *_path = _mingw_no_trailing_slash(_Filename);
+
+ int ret=_stat32(_path,&st);
+
+ if (_path != _Filename)
+ free (_path);
+
+ if (ret == -1) {
+ memset(_Stat,0,sizeof(struct stat));
+ return -1;
+ }
+ /* struct stat and struct _stat32
+ are the same for this case. */
+ memcpy(_Stat, &st, sizeof(struct _stat32));
+ return ret;
+}
+#else
+int __cdecl
+stat(const char *_Filename,struct stat *_Stat)
+{
+ struct _stat64 st;
+ char *_path = _mingw_no_trailing_slash(_Filename);
+
+ int ret=_stat64(_path,&st);
+
+ if (_path != _Filename)
+ free (_path);
+
+ if (ret == -1) {
+ memset(_Stat,0,sizeof(struct stat));
+ return -1;
+ }
+ /* struct stat and struct _stat64i32
+ are the same for this case. */
+ _Stat->st_dev=st.st_dev;
+ _Stat->st_ino=st.st_ino;
+ _Stat->st_mode=st.st_mode;
+ _Stat->st_nlink=st.st_nlink;
+ _Stat->st_uid=st.st_uid;
+ _Stat->st_gid=st.st_gid;
+ _Stat->st_rdev=st.st_rdev;
+ _Stat->st_size=(_off_t) st.st_size;
+ _Stat->st_atime=st.st_atime;
+ _Stat->st_mtime=st.st_mtime;
+ _Stat->st_ctime=st.st_ctime;
+ return ret;
+}
+#endif
+
+/* Add __imp__fstat and __imp__stat symbols. */
+int (*__MINGW_IMP_SYMBOL(stat))(const char *,struct stat *) = &stat;
+
libc/mingw/stdio/_stat64i32.c
@@ -0,0 +1,88 @@
+#define __CRT__NO_INLINE
+#include <sys/stat.h>
+#include <stdlib.h>
+
+/**
+ * Returns _path without trailing slash if any
+ *
+ * - if _path has no trailing slash, the function returns it
+ * - if _path has a trailing slash, but is of the form C:/, then it returns it
+ * - otherwise, the function creates a new string, which is a copy of _path
+ * without the trailing slash. It is then the responsibility of the caller
+ * to free it.
+ */
+
+static char*
+_mingw_no_trailing_slash (const char* _path)
+{
+ int len;
+ char *p;
+
+ p = (char*)_path;
+
+ if (_path && *_path) {
+ len = strlen (_path);
+
+ /* Ignore X:\ */
+
+ if (len <= 1 || ((len == 2 || len == 3) && _path[1] == ':'))
+ return p;
+
+ /* Check UNC \\abc\<name>\ */
+ if ((_path[0] == '\\' || _path[0] == '/')
+ && (_path[1] == '\\' || _path[1] == '/'))
+ {
+ const char *r = &_path[2];
+ while (*r != 0 && *r != '\\' && *r != '/')
+ ++r;
+ if (*r != 0)
+ ++r;
+ if (*r == 0)
+ return p;
+ while (*r != 0 && *r != '\\' && *r != '/')
+ ++r;
+ if (*r != 0)
+ ++r;
+ if (*r == 0)
+ return p;
+ }
+
+ if (_path[len - 1] == '/' || _path[len - 1] == '\\')
+ {
+ p = (char*)malloc (len);
+ memcpy (p, _path, len - 1);
+ p[len - 1] = '\0';
+ }
+ }
+
+ return p;
+}
+
+int __cdecl _stat64i32(const char *_Name,struct _stat64i32 *_Stat)
+{
+ struct _stat64 st;
+ char *_path = _mingw_no_trailing_slash(_Name);
+
+ int ret=_stat64(_path,&st);
+
+ if (_path != _Name)
+ free(_path);
+
+ if (ret == -1) {
+ memset(_Stat,0,sizeof(struct _stat64i32));
+ return -1;
+ }
+ _Stat->st_dev=st.st_dev;
+ _Stat->st_ino=st.st_ino;
+ _Stat->st_mode=st.st_mode;
+ _Stat->st_nlink=st.st_nlink;
+ _Stat->st_uid=st.st_uid;
+ _Stat->st_gid=st.st_gid;
+ _Stat->st_rdev=st.st_rdev;
+ _Stat->st_size=(_off_t) st.st_size;
+ _Stat->st_atime=st.st_atime;
+ _Stat->st_mtime=st.st_mtime;
+ _Stat->st_ctime=st.st_ctime;
+ return ret;
+}
+
libc/mingw/stdio/_wfindfirst64i32.c
@@ -0,0 +1,21 @@
+#define __CRT__NO_INLINE
+#include <io.h>
+#include <string.h>
+
+intptr_t __cdecl _wfindfirst64i32(const wchar_t *_Filename,struct _wfinddata64i32_t *_FindData)
+{
+ struct _wfinddata64_t fd;
+ intptr_t ret = _wfindfirst64(_Filename,&fd);
+ if (ret == -1) {
+ memset(_FindData,0,sizeof(struct _wfinddata64i32_t));
+ return -1;
+ }
+ _FindData->attrib=fd.attrib;
+ _FindData->time_create=fd.time_create;
+ _FindData->time_access=fd.time_access;
+ _FindData->time_write=fd.time_write;
+ _FindData->size=(_fsize_t) fd.size;
+ memcpy(_FindData->name,fd.name,260*sizeof(wchar_t));
+ return ret;
+}
+
libc/mingw/stdio/_wfindnext64i32.c
@@ -0,0 +1,21 @@
+#define __CRT__NO_INLINE
+#include <io.h>
+#include <string.h>
+
+int __cdecl _wfindnext64i32(intptr_t _FindHandle,struct _wfinddata64i32_t *_FindData)
+{
+ struct _wfinddata64_t fd;
+ int ret = _wfindnext64(_FindHandle,&fd);
+ if (ret == -1) {
+ memset(_FindData,0,sizeof(struct _wfinddata64i32_t));
+ return -1;
+ }
+ _FindData->attrib=fd.attrib;
+ _FindData->time_create=fd.time_create;
+ _FindData->time_access=fd.time_access;
+ _FindData->time_write=fd.time_write;
+ _FindData->size=(_fsize_t) fd.size;
+ memcpy(_FindData->name,fd.name,260*sizeof(wchar_t));
+ return ret;
+}
+
libc/mingw/stdio/_wstat.c
@@ -0,0 +1,119 @@
+#define __CRT__NO_INLINE
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <malloc.h>
+
+/**
+ * Returns _path without trailing slash if any
+ *
+ * - if _path has no trailing slash, the function returns it
+ * - if _path has a trailing slash, but is of the form C:/, then it returns it
+ * - otherwise, the function creates a new string, which is a copy of _path
+ * without the trailing slash. It is then the responsibility of the caller
+ * to free it.
+ */
+
+static wchar_t*
+_mingw_no_trailing_slash (const wchar_t* _path)
+{
+ int len;
+ wchar_t *p;
+
+ p = (wchar_t*)_path;
+
+ if (_path && *_path) {
+ len = wcslen (_path);
+
+ /* Ignore X:\ */
+
+ if (len <= 1 || ((len == 2 || len == 3) && _path[1] == L':'))
+ return p;
+
+ /* Check UNC \\abc\<name>\ */
+ if ((_path[0] == L'\\' || _path[0] == L'/')
+ && (_path[1] == L'\\' || _path[1] == L'/'))
+ {
+ const wchar_t *r = &_path[2];
+ while (*r != 0 && *r != L'\\' && *r != L'/')
+ ++r;
+ if (*r != 0)
+ ++r;
+ if (*r == 0)
+ return p;
+ while (*r != 0 && *r != L'\\' && *r != L'/')
+ ++r;
+ if (*r != 0)
+ ++r;
+ if (*r == 0)
+ return p;
+ }
+
+ if (_path[len - 1] == L'/' || _path[len - 1] == L'\\')
+ {
+ p = (wchar_t*)malloc (len * sizeof(wchar_t));
+ memcpy (p, _path, (len - 1) * sizeof(wchar_t));
+ p[len - 1] = L'\0';
+ }
+ }
+
+ return p;
+}
+
+/* FIXME: Relying on _USE_32BIT_TIME_T, which is a user-macro,
+during CRT compilation is plainly broken. Need an appropriate
+implementation to provide users the ability of compiling the
+CRT only with 32-bit time_t behavior. */
+#if defined(_USE_32BIT_TIME_T)
+int __cdecl
+wstat(const wchar_t *_Filename,struct stat *_Stat)
+{
+ struct _stat32 st;
+ wchar_t *_path = _mingw_no_trailing_slash(_Filename);
+
+ int ret=_wstat32(_path,&st);
+
+ if (_path != _Filename)
+ free (_path);
+
+ if (ret == -1) {
+ memset(_Stat,0,sizeof(struct stat));
+ return -1;
+ }
+ /* struct stat and struct _stat32
+ are the same for this case. */
+ memcpy(_Stat, &st, sizeof(struct _stat32));
+ return ret;
+}
+#else
+int __cdecl
+wstat(const wchar_t *_Filename,struct stat *_Stat)
+{
+ struct _stat64 st;
+ wchar_t *_path = _mingw_no_trailing_slash(_Filename);
+
+ int ret=_wstat64(_path,&st);
+
+ if (_path != _Filename)
+ free (_path);
+
+ if (ret == -1) {
+ memset(_Stat,0,sizeof(struct stat));
+ return -1;
+ }
+ /* struct stat and struct _stat64i32
+ are the same for this case. */
+ _Stat->st_dev=st.st_dev;
+ _Stat->st_ino=st.st_ino;
+ _Stat->st_mode=st.st_mode;
+ _Stat->st_nlink=st.st_nlink;
+ _Stat->st_uid=st.st_uid;
+ _Stat->st_gid=st.st_gid;
+ _Stat->st_rdev=st.st_rdev;
+ _Stat->st_size=(_off_t) st.st_size;
+ _Stat->st_atime=st.st_atime;
+ _Stat->st_mtime=st.st_mtime;
+ _Stat->st_ctime=st.st_ctime;
+ return ret;
+}
+#endif
+
libc/mingw/stdio/_wstat64i32.c
@@ -0,0 +1,88 @@
+#define __CRT__NO_INLINE
+#include <sys/stat.h>
+#include <stdlib.h>
+
+/**
+ * Returns _path without trailing slash if any
+ *
+ * - if _path has no trailing slash, the function returns it
+ * - if _path has a trailing slash, but is of the form C:/, then it returns it
+ * - otherwise, the function creates a new string, which is a copy of _path
+ * without the trailing slash. It is then the responsibility of the caller
+ * to free it.
+ */
+
+static wchar_t*
+_mingw_no_trailing_slash (const wchar_t* _path)
+{
+ int len;
+ wchar_t *p;
+
+ p = (wchar_t*)_path;
+
+ if (_path && *_path) {
+ len = wcslen (_path);
+
+ /* Ignore X:\ */
+
+ if (len <= 1 || ((len == 2 || len == 3) && _path[1] == L':'))
+ return p;
+
+ /* Check UNC \\abc\<name>\ */
+ if ((_path[0] == L'\\' || _path[0] == L'/')
+ && (_path[1] == L'\\' || _path[1] == L'/'))
+ {
+ const wchar_t *r = &_path[2];
+ while (*r != 0 && *r != L'\\' && *r != L'/')
+ ++r;
+ if (*r != 0)
+ ++r;
+ if (*r == 0)
+ return p;
+ while (*r != 0 && *r != L'\\' && *r != L'/')
+ ++r;
+ if (*r != 0)
+ ++r;
+ if (*r == 0)
+ return p;
+ }
+
+ if (_path[len - 1] == L'/' || _path[len - 1] == L'\\')
+ {
+ p = (wchar_t*)malloc (len * sizeof(wchar_t));
+ memcpy (p, _path, (len - 1) * sizeof(wchar_t));
+ p[len - 1] = L'\0';
+ }
+ }
+
+ return p;
+}
+
+int __cdecl _wstat64i32(const wchar_t *_Name,struct _stat64i32 *_Stat)
+{
+ struct _stat64 st;
+ wchar_t *_path = _mingw_no_trailing_slash(_Name);
+
+ int ret=_wstat64(_path,&st);
+
+ if (_path != _Name)
+ free(_path);
+
+ if (ret == -1) {
+ memset(_Stat,0,sizeof(struct _stat64i32));
+ return -1;
+ }
+ _Stat->st_dev=st.st_dev;
+ _Stat->st_ino=st.st_ino;
+ _Stat->st_mode=st.st_mode;
+ _Stat->st_nlink=st.st_nlink;
+ _Stat->st_uid=st.st_uid;
+ _Stat->st_gid=st.st_gid;
+ _Stat->st_rdev=st.st_rdev;
+ _Stat->st_size=(_off_t) st.st_size;
+ _Stat->st_atime=st.st_atime;
+ _Stat->st_mtime=st.st_mtime;
+ _Stat->st_ctime=st.st_ctime;
+ return ret;
+}
+
libc/mingw/stdio/asprintf.c
@@ -0,0 +1,31 @@
+#define _GNU_SOURCE
+#define __CRT__NO_INLINE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+int asprintf(char ** __restrict__ ret,
+ const char * __restrict__ format,
+ ...) {
+ va_list ap;
+ int len;
+ va_start(ap,format);
+ /* Get Length */
+ len = _vsnprintf(NULL,0,format,ap);
+ if (len < 0) goto _end;
+ /* +1 for \0 terminator. */
+ *ret = malloc(len + 1);
+ /* Check malloc fail*/
+ if (!*ret) {
+ len = -1;
+ goto _end;
+ }
+ /* Write String */
+ _vsnprintf(*ret,len+1,format,ap);
+ /* Terminate explicitly */
+ (*ret)[len] = '\0';
+ _end:
+ va_end(ap);
+ return len;
+}
libc/mingw/stdio/atoll.c
@@ -0,0 +1,10 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __CRT__NO_INLINE
+#include <stdlib.h>
+
+long long atoll (const char * _c)
+ { return _atoi64 (_c); }
libc/mingw/stdio/fgetpos64.c
@@ -0,0 +1,5 @@
+#include <stdio.h>
+
+int __cdecl fgetpos64(FILE * __restrict__ _File ,fpos_t * __restrict__ _Pos){
+ return fgetpos(_File, _Pos);
+}
libc/mingw/stdio/fopen64.c
@@ -0,0 +1,11 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <stdio.h>
+
+FILE* fopen64 (const char* filename, const char* mode)
+{
+ return fopen (filename, mode);
+}
libc/mingw/stdio/fseeko32.c
@@ -0,0 +1,7 @@
+/*non-standard*/
+#include <stdio.h>
+
+int fseeko(FILE* stream, _off_t offset, int whence){
+ _off64_t off = offset;
+ return fseeko64(stream,off,whence);
+}
libc/mingw/stdio/fseeko64.c
@@ -0,0 +1,258 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <stdio.h>
+#include <io.h>
+#include <errno.h>
+#include <windows.h>
+#include <internal.h>
+
+struct oserr_map {
+ unsigned long oscode; /* OS values */
+ int errnocode; /* System V codes */
+};
+
+typedef union doubleint {
+ __int64 bigint;
+ struct {
+ unsigned long lowerhalf;
+ long upperhalf;
+ } twoints;
+} DINT;
+
+#define _IOYOURBUF 0x0100
+#define _IOSETVBUF 0x0400
+#define _IOFEOF 0x0800
+#define _IOFLRTN 0x1000
+#define _IOCTRLZ 0x2000
+#define _IOCOMMIT 0x4000
+
+/* General use macros */
+
+#define inuse(s) ((s)->_flag & (_IOREAD|_IOWRT|_IORW))
+#define mbuf(s) ((s)->_flag & _IOMYBUF)
+#define nbuf(s) ((s)->_flag & _IONBF)
+#define ybuf(s) ((s)->_flag & _IOYOURBUF)
+#define bigbuf(s) ((s)->_flag & (_IOMYBUF|_IOYOURBUF))
+#define anybuf(s) ((s)->_flag & (_IOMYBUF|_IONBF|_IOYOURBUF))
+
+#define _INTERNAL_BUFSIZ 4096
+#define _SMALL_BUFSIZ 512
+
+#define FOPEN 0x01 /* file handle open */
+#define FEOFLAG 0x02 /* end of file has been encountered */
+#define FCRLF 0x04 /* CR-LF across read buffer (in text mode) */
+#define FPIPE 0x08 /* file handle refers to a pipe */
+#define FNOINHERIT 0x10 /* file handle opened _O_NOINHERIT */
+#define FAPPEND 0x20 /* file handle opened O_APPEND */
+#define FDEV 0x40 /* file handle refers to device */
+#define FTEXT 0x80 /* file handle is in text mode */
+
+static struct oserr_map local_errtab[] = {
+ { ERROR_INVALID_FUNCTION, EINVAL }, { ERROR_FILE_NOT_FOUND, ENOENT },
+ { ERROR_PATH_NOT_FOUND, ENOENT }, { ERROR_TOO_MANY_OPEN_FILES, EMFILE },
+ { ERROR_ACCESS_DENIED, EACCES }, { ERROR_INVALID_HANDLE, EBADF },
+ { ERROR_ARENA_TRASHED, ENOMEM }, { ERROR_NOT_ENOUGH_MEMORY, ENOMEM },
+ { ERROR_INVALID_BLOCK, ENOMEM }, { ERROR_BAD_ENVIRONMENT, E2BIG },
+ { ERROR_BAD_FORMAT, ENOEXEC }, { ERROR_INVALID_ACCESS, EINVAL },
+ { ERROR_INVALID_DATA, EINVAL }, { ERROR_INVALID_DRIVE, ENOENT },
+ { ERROR_CURRENT_DIRECTORY, EACCES }, { ERROR_NOT_SAME_DEVICE, EXDEV },
+ { ERROR_NO_MORE_FILES, ENOENT }, { ERROR_LOCK_VIOLATION, EACCES },
+ { ERROR_BAD_NETPATH, ENOENT }, { ERROR_NETWORK_ACCESS_DENIED, EACCES },
+ { ERROR_BAD_NET_NAME, ENOENT }, { ERROR_FILE_EXISTS, EEXIST },
+ { ERROR_CANNOT_MAKE, EACCES }, { ERROR_FAIL_I24, EACCES },
+ { ERROR_INVALID_PARAMETER, EINVAL }, { ERROR_NO_PROC_SLOTS, EAGAIN },
+ { ERROR_DRIVE_LOCKED, EACCES }, { ERROR_BROKEN_PIPE, EPIPE },
+ { ERROR_DISK_FULL, ENOSPC }, { ERROR_INVALID_TARGET_HANDLE, EBADF },
+ { ERROR_INVALID_HANDLE, EINVAL }, { ERROR_WAIT_NO_CHILDREN, ECHILD },
+ { ERROR_CHILD_NOT_COMPLETE, ECHILD }, { ERROR_DIRECT_ACCESS_HANDLE, EBADF },
+ { ERROR_NEGATIVE_SEEK, EINVAL }, { ERROR_SEEK_ON_DEVICE, EACCES },
+ { ERROR_DIR_NOT_EMPTY, ENOTEMPTY }, { ERROR_NOT_LOCKED, EACCES },
+ { ERROR_BAD_PATHNAME, ENOENT }, { ERROR_MAX_THRDS_REACHED, EAGAIN },
+ { ERROR_LOCK_FAILED, EACCES }, { ERROR_ALREADY_EXISTS, EEXIST },
+ { ERROR_FILENAME_EXCED_RANGE, ENOENT }, { ERROR_NESTING_NOT_ALLOWED, EAGAIN },
+ { ERROR_NOT_ENOUGH_QUOTA, ENOMEM }, { 0, -1 }
+};
+
+_CRTIMP __int64 __cdecl _lseeki64(int fh,__int64 pos,int mthd);
+__int64 __cdecl _ftelli64(FILE *str);
+void mingw_dosmaperr (unsigned long oserrno);
+int __cdecl _flush (FILE *str);
+
+int __cdecl _flush (FILE *str)
+{
+ FILE *stream;
+ int rc = 0; /* assume good return */
+ __int64 nchar;
+
+ stream = str;
+ if ((stream->_flag & (_IOREAD | _IOWRT)) == _IOWRT && bigbuf(stream)
+ && (nchar = (__int64) (stream->_ptr - stream->_base)) > 0ll)
+ {
+ if ( _write(_fileno(stream), stream->_base, nchar) == nchar) {
+ if (_IORW & stream->_flag)
+ stream->_flag &= ~_IOWRT;
+ } else {
+ stream->_flag |= _IOERR;
+ rc = EOF;
+ }
+ }
+ stream->_ptr = stream->_base;
+ stream->_cnt = 0ll;
+ return rc;
+}
+
+int fseeko64 (FILE* stream, _off64_t offset, int whence)
+{
+ fpos_t pos;
+ if (whence == SEEK_CUR)
+ {
+ /* If stream is invalid, fgetpos sets errno. */
+ if (fgetpos (stream, &pos))
+ return (-1);
+ pos += (fpos_t) offset;
+ }
+ else if (whence == SEEK_END)
+ {
+ /* If writing, we need to flush before getting file length. */
+ fflush (stream);
+ pos = (fpos_t) (_filelengthi64 (_fileno (stream)) + offset);
+ }
+ else if (whence == SEEK_SET)
+ pos = (fpos_t) offset;
+ else
+ {
+ errno = EINVAL;
+ return (-1);
+ }
+ return fsetpos (stream, &pos);
+}
+
+int __cdecl _fseeki64(FILE *str,__int64 offset,int whence)
+{
+ FILE *stream;
+ /* Init stream pointer */
+ stream = str;
+ errno=0;
+ if(!stream || ((whence != SEEK_SET) && (whence != SEEK_CUR) && (whence != SEEK_END)))
+ {
+ errno=EINVAL;
+ return -1;
+ }
+ /* Clear EOF flag */
+ stream->_flag &= ~_IOEOF;
+
+ if (whence == SEEK_CUR) {
+ offset += _ftelli64(stream);
+ whence = SEEK_SET;
+ }
+ /* Flush buffer as necessary */
+ _flush(stream);
+
+ /* If file opened for read/write, clear flags since we don't know
+ what the user is going to do next. If the file was opened for
+ read access only, decrease _bufsiz so that the next _filbuf
+ won't cost quite so much */
+
+ if (stream->_flag & _IORW)
+ stream->_flag &= ~(_IOWRT|_IOREAD);
+ else if ( (stream->_flag & _IOREAD) && (stream->_flag & _IOMYBUF) &&
+ !(stream->_flag & _IOSETVBUF) )
+ stream->_bufsiz = _SMALL_BUFSIZ;
+
+ /* Seek to the desired locale and return. */
+
+ return (_lseeki64(_fileno(stream), offset, whence) == -1ll ? -1 : 0);
+}
+
+__int64 __cdecl _ftelli64(FILE *str)
+{
+ FILE *stream;
+ size_t offset;
+ __int64 filepos;
+ register char *p;
+ char *max;
+ int fd;
+ size_t rdcnt = 0;
+
+ errno=0;
+ stream = str;
+ fd = _fileno(stream);
+ if (stream->_cnt < 0ll) stream->_cnt = 0ll;
+ if ((filepos = _lseeki64(fd, 0ll, SEEK_CUR)) < 0L)
+ return -1ll;
+
+ if (!bigbuf(stream)) /* _IONBF or no buffering designated */
+ return (filepos - (__int64) stream->_cnt);
+
+ offset = (size_t)(stream->_ptr - stream->_base);
+
+ if (stream->_flag & (_IOWRT|_IOREAD))
+ {
+ if (_osfile(fd) & FTEXT)
+ for (p = stream->_base; p < stream->_ptr; p++)
+ if (*p == '\n') /* adjust for '\r' */
+ offset++;
+ }
+ else if (!(stream->_flag & _IORW)) {
+ errno=EINVAL;
+ return -1ll;
+ }
+ if (filepos == 0ll)
+ return ((__int64)offset);
+
+ if (stream->_flag & _IOREAD) /* go to preceding sector */
+ {
+ if (stream->_cnt == 0ll) /* filepos holds correct location */
+ offset = 0ll;
+ else
+ {
+ rdcnt = ((size_t) stream->_cnt) + ((size_t) (size_t)(stream->_ptr - stream->_base));
+ if (_osfile(fd) & FTEXT) {
+ if (_lseeki64(fd, 0ll, SEEK_END) == filepos) {
+ max = stream->_base + rdcnt;
+ for (p = stream->_base; p < max; p++)
+ if (*p == '\n') /* adjust for '\r' */
+ rdcnt++;
+ if (stream->_flag & _IOCTRLZ)
+ ++rdcnt;
+ } else {
+ _lseeki64(fd, filepos, SEEK_SET);
+ if ( (rdcnt <= _SMALL_BUFSIZ) && (stream->_flag & _IOMYBUF) &&
+ !(stream->_flag & _IOSETVBUF))
+ rdcnt = _SMALL_BUFSIZ;
+ else
+ rdcnt = stream->_bufsiz;
+ if (_osfile(fd) & FCRLF)
+ ++rdcnt;
+ }
+ } /* end if FTEXT */
+ }
+ filepos -= (__int64)rdcnt;
+ } /* end else stream->_cnt != 0 */
+ return (filepos + (__int64)offset);
+}
+
+void mingw_dosmaperr (unsigned long oserrno)
+{
+ size_t i;
+
+ _doserrno = oserrno; /* set _doserrno */
+ /* check the table for the OS error code */
+ i = 0;
+ do {
+ if (oserrno == local_errtab[i].oscode)
+ {
+ errno = local_errtab[i].errnocode;
+ return;
+ }
+ } while (local_errtab[++i].errnocode != -1);
+ if (oserrno >= ERROR_WRITE_PROTECT && oserrno <= ERROR_SHARING_BUFFER_EXCEEDED)
+ errno = EACCES;
+ else if (oserrno >= ERROR_INVALID_STARTING_CODESEG && oserrno <= ERROR_INFLOOP_IN_RELOC_CHAIN)
+ errno = ENOEXEC;
+ else
+ errno = EINVAL;
+}
libc/mingw/stdio/fsetpos64.c
@@ -0,0 +1,5 @@
+#include <stdio.h>
+
+int __cdecl fsetpos64(FILE *_File,const fpos_t *_Pos){ /* fsetpos already 64bit */
+ return fsetpos(_File,_Pos);
+}
libc/mingw/stdio/ftello.c
@@ -0,0 +1,5 @@
+#include <stdio.h>
+
+_off_t ftello(FILE * stream){
+ return (_off_t) ftello64(stream);
+}
libc/mingw/stdio/ftello64.c
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <stdio.h>
+
+_off64_t
+ftello64 (FILE * stream)
+{
+ fpos_t pos;
+ if (fgetpos(stream, &pos))
+ return -1LL;
+ else
+ return ((off64_t) pos);
+}
libc/mingw/stdio/ftruncate64.c
@@ -0,0 +1,371 @@
+#ifdef TEST_FTRUNCATE64
+#include <fcntl.h>
+#include <sys/stat.h>
+#endif /* TEST_FTRUNCATE64 */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <io.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <wchar.h>
+#include <windows.h>
+#include <psapi.h>
+
+/* Mutually exclusive methods
+ We check disk space as truncating more than the allowed space results
+ in file getting mysteriously deleted
+ */
+#define _CHECK_SPACE_BY_VOLUME_METHOD_ 1 /* Needs to walk through all volumes */
+#define _CHECK_SPACE_BY_PSAPI_METHOD_ 0 /* Requires psapi.dll */
+#define _CHECK_SPACE_BY_VISTA_METHOD_ 0 /* Won't work on XP */
+
+#if (_CHECK_SPACE_BY_PSAPI_METHOD_ == 1) /* Retrive actual volume path */
+static LPWSTR getdirpath(const LPWSTR __str){
+ int len, walk = 0;
+ LPWSTR dirname;
+ while (__str[walk] != L'\0'){
+ walk++;
+ if (__str[walk] == L'\\') len = walk + 1;
+ }
+ dirname = calloc(len + 1, sizeof(wchar_t));
+ if (!dirname) return dirname; /* memory error */
+ return wcsncpy(dirname,__str,len);
+}
+
+static LPWSTR xp_normalize_fn(const LPWSTR fn) {
+ DWORD len, err, walker, isfound;
+ LPWSTR drives = NULL;
+ LPWSTR target = NULL;
+ LPWSTR ret = NULL;
+ wchar_t tmplt[3] = L" :"; /* Template */
+
+ /*Get list of drive letters */
+ len = GetLogicalDriveStringsW(0,NULL);
+ drives = calloc(len,sizeof(wchar_t));
+ if (!drives) return NULL;
+ len = GetLogicalDriveStringsW(len,drives);
+
+ /*Allocatate memory */
+ target = calloc(MAX_PATH + 1,sizeof(wchar_t));
+ if (!target) {
+ free(drives);
+ return NULL;
+ }
+
+ walker = 0;
+ while ((walker < len) && !(drives[walker] == L'\0' && drives[walker + 1] == L'\0')){
+ /* search through alphabets */
+ if(iswalpha(drives[walker])) {
+ *tmplt = drives[walker]; /* Put drive letter */
+ err = QueryDosDeviceW(tmplt,target,MAX_PATH);
+ if(!err) {
+ free(drives);
+ free(target);
+ return NULL;
+ }
+ if( _wcsnicmp(target,fn,wcslen(target)) == 0) break;
+ wmemset(target,L'\0',MAX_PATH);
+ walker++;
+ } else walker++;
+ }
+
+ if (!iswalpha(*tmplt)) {
+ free(drives);
+ free(target);
+ return NULL; /* Finish walking without finding correct drive */
+ }
+
+ ret = calloc(MAX_PATH + 1,sizeof(wchar_t));
+ if (!ret) {
+ free(drives);
+ free(target);
+ return NULL;
+ }
+ _snwprintf(ret,MAX_PATH,L"%ws%ws",tmplt,fn+wcslen(target));
+
+ return ret;
+}
+
+/* XP method of retrieving filename from handles, based on:
+ http://msdn.microsoft.com/en-us/library/aa366789%28VS.85%29.aspx
+ */
+static LPWSTR xp_getfilepath(const HANDLE f, const LARGE_INTEGER fsize){
+ HANDLE hFileMap = NULL;
+ void* pMem = NULL;
+ LPWSTR temp, ret;
+ DWORD err;
+
+ temp = calloc(MAX_PATH + 1, sizeof(wchar_t));
+ if (!temp) goto errormap;
+
+ /* CreateFileMappingW limitation: Cannot map 0 byte files, so extend it to 1 byte */
+ if (!fsize.QuadPart) {
+ SetFilePointer(f, 1, NULL, FILE_BEGIN);
+ err = SetEndOfFile(f);
+ if(!temp) goto errormap;
+ }
+
+ hFileMap = CreateFileMappingW(f,NULL,PAGE_READONLY,0,1,NULL);
+ if(!hFileMap) goto errormap;
+ pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);
+ if(!pMem) goto errormap;
+ err = GetMappedFileNameW(GetCurrentProcess(),pMem,temp,MAX_PATH);
+ if(!err) goto errormap;
+
+ if (pMem) UnmapViewOfFile(pMem);
+ if (hFileMap) CloseHandle(hFileMap);
+ ret = xp_normalize_fn(temp);
+ free(temp);
+ return ret;
+
+ errormap:
+ if (temp) free(temp);
+ if (pMem) UnmapViewOfFile(pMem);
+ if (hFileMap) CloseHandle(hFileMap);
+ _set_errno(EBADF);
+ return NULL;
+}
+#endif /* _CHECK_SPACE_BY_PSAPI_METHOD_ */
+
+static int
+checkfreespace (const HANDLE f, const ULONGLONG requiredspace)
+{
+ LPWSTR dirpath, volumeid, volumepath;
+ ULARGE_INTEGER freespace;
+ LARGE_INTEGER currentsize;
+ DWORD check, volumeserial;
+ BY_HANDLE_FILE_INFORMATION fileinfo;
+ HANDLE vol;
+
+ /* Get current size */
+ check = GetFileSizeEx (f, ¤tsize);
+ if (!check)
+ {
+ _set_errno(EBADF);
+ return -1; /* Error checking file size */
+ }
+
+ /* Short circuit disk space check if shrink operation */
+ if ((ULONGLONG)currentsize.QuadPart >= requiredspace)
+ return 0;
+
+ /* We check available space to user before attempting to truncate */
+
+#if (_CHECK_SPACE_BY_VISTA_METHOD_ == 1)
+ /* Get path length */
+ DWORD err;
+ LPWSTR filepath = NULL;
+ check = GetFinalPathNameByHandleW(f,filepath,0,FILE_NAME_NORMALIZED|VOLUME_NAME_GUID);
+ err = GetLastError();
+ if (err == ERROR_PATH_NOT_FOUND || err == ERROR_INVALID_PARAMETER) {
+ _set_errno(EINVAL);
+ return -1; /* IO error */
+ }
+ filepath = calloc(check + 1,sizeof(wchar_t));
+ if (!filepath) {
+ _set_errno(EBADF);
+ return -1; /* Out of memory */
+ }
+ check = GetFinalPathNameByHandleW(f,filepath,check,FILE_NAME_NORMALIZED|VOLUME_NAME_GUID);
+ /* FIXME: last error was set to error 87 (0x57)
+ "The parameter is incorrect." for some reason but works out */
+ if (!check) {
+ _set_errno(EBADF);
+ return -1; /* Error resolving filename */
+ }
+#endif /* _CHECK_SPACE_BY_VISTA_METHOD_ */
+
+#if (_CHECK_SPACE_BY_PSAPI_METHOD_ == 1)
+ LPWSTR filepath = NULL;
+ filepath = xp_getfilepath(f,currentsize);
+
+ /* Get durectory path */
+ dirpath = getdirpath(filepath);
+ free(filepath);
+ filepath = NULL;
+ if (!dirpath) {
+ _set_errno(EBADF);
+ return -1; /* Out of memory */
+ }
+#endif /* _CHECK_SPACE_BY_PSAPI_METHOD_ */
+
+#if _CHECK_SPACE_BY_VOLUME_METHOD_
+ if(!GetFileInformationByHandle(f,&fileinfo)) {
+ _set_errno(EINVAL);
+ return -1; /* Resolution failure */
+ }
+
+ volumeid = calloc(51,sizeof(wchar_t));
+ volumepath = calloc(MAX_PATH+2,sizeof(wchar_t));
+ if(!volumeid || !volumepath) {
+ _set_errno(EBADF);
+ return -1; /* Out of memory */
+ }
+
+ dirpath = NULL;
+
+ vol = FindFirstVolumeW(volumeid,50);
+ /* wprintf(L"%d - %ws\n",wcslen(volumeid),volumeid); */
+ do {
+ check = GetVolumeInformationW(volumeid,volumepath,MAX_PATH+1,&volumeserial,NULL,NULL,NULL,0);
+ /* wprintf(L"GetVolumeInformationW %d id %ws path %ws error %d\n",check,volumeid,volumepath,GetLastError()); */
+ if(volumeserial == fileinfo.dwVolumeSerialNumber) {
+ dirpath = volumeid;
+ break;
+ }
+ } while (FindNextVolumeW(vol,volumeid,50));
+ FindVolumeClose(vol);
+
+ if(!dirpath) free(volumeid); /* we found the volume */
+ free(volumepath);
+#endif /* _CHECK_SPACE_BY_VOLUME_METHOD_ */
+
+ /* Get available free space */
+ check = GetDiskFreeSpaceExW(dirpath,&freespace,NULL,NULL);
+ //wprintf(L"freespace %I64u\n",freespace);
+ free(dirpath);
+ if(!check) {
+ _set_errno(EFBIG);
+ return -1; /* Error getting free space */
+ }
+
+ /* Check space requirements */
+ if ((requiredspace - currentsize.QuadPart) > freespace.QuadPart)
+ {
+ _set_errno(EFBIG); /* File too big for disk */
+ return -1;
+ } /* We have enough space to truncate/expand */
+ return 0;
+}
+
+int ftruncate64(int __fd, _off64_t __length) {
+ HANDLE f;
+ LARGE_INTEGER quad;
+ DWORD check;
+ int ret = 0;
+ __int64 pos;
+
+ /* Sanity check */
+ if (__length < 0) {
+ goto errorout;
+ }
+
+ /* Get Win32 Handle */
+ if(__fd == -1) {
+ goto errorout;
+ }
+
+ f = (HANDLE)_get_osfhandle(__fd);
+ if (f == INVALID_HANDLE_VALUE || (GetFileType(f) != FILE_TYPE_DISK)) {
+ _set_errno(EBADF);
+ return -1;
+ }
+
+
+ /* Save position */
+ if((pos = _telli64(__fd)) == -1LL){
+ goto errorout;
+ }
+
+ /* Check available space */
+ check = checkfreespace(f,__length);
+ if (check != 0) {
+ return -1; /* Error, errno already set */
+ }
+
+ quad.QuadPart = __length;
+ check = SetFilePointer(f, (LONG)quad.LowPart, &(quad.HighPart), FILE_BEGIN);
+ if (check == INVALID_SET_FILE_POINTER && quad.LowPart != INVALID_SET_FILE_POINTER) {
+ switch (GetLastError()) {
+ case ERROR_NEGATIVE_SEEK:
+ _set_errno(EFBIG); /* file too big? */
+ return -1;
+ case INVALID_SET_FILE_POINTER:
+ _set_errno(EINVAL); /* shouldn't happen */
+ return -1;
+ default:
+ _set_errno(EINVAL); /* shouldn't happen */
+ return -1;
+ }
+ }
+
+ check = SetEndOfFile(f);
+ if (!check) {
+ goto errorout;
+ }
+
+ if(_lseeki64(__fd,pos,SEEK_SET) == -1LL){
+ goto errorout;
+ }
+
+ return ret;
+
+ errorout:
+ _set_errno(EINVAL);
+ return -1;
+}
+
+#if (TEST_FTRUNCATE64 == 1)
+int main(){
+ LARGE_INTEGER sz;
+ ULARGE_INTEGER freespace;
+ int f;
+ LPWSTR path, dir;
+ sz.QuadPart = 0LL;
+ f = _open("XXX.tmp", _O_BINARY|_O_CREAT|_O_RDWR, _S_IREAD | _S_IWRITE);
+ wprintf(L"%d\n",ftruncate64(f,12));
+ wprintf(L"%d\n",ftruncate64(f,20));
+ wprintf(L"%d\n",ftruncate64(f,15));
+/* path = xp_getfilepath((HANDLE)_get_osfhandle(f),sz);
+ dir = getdirpath(path);
+ GetDiskFreeSpaceExW(dir,&freespace,NULL,NULL);
+ wprintf(L"fs - %ws\n",path);
+ wprintf(L"dirfs - %ws\n",dir);
+ wprintf(L"free - %I64u\n",freespace.QuadPart);
+ free(dir);
+ free(path);*/
+ _close(f);
+ return 0;
+}
+#endif /* TEST_FTRUNCATE64 */
+
+#if (TEST_FTRUNCATE64 == 2)
+int main() {
+FILE *f;
+int fd;
+char buf[100];
+int cnt;
+unlink("test.out");
+f = fopen("test.out","w+");
+fd = fileno(f);
+write(fd,"abc",3);
+fflush(f);
+printf ("err: %d\n", ftruncate64(fd,10));
+cnt = read(fd,buf,100);
+printf("cnt = %d\n",cnt);
+return 0;
+}
+#endif /* TEST_FTRUNCATE64 */
+
+#if (TEST_FTRUNCATE64 == 3)
+int main() {
+FILE *f;
+int fd;
+char buf[100];
+int cnt;
+unlink("test.out");
+f = fopen("test.out","w+");
+fd = fileno(f);
+write(fd,"abc",3);
+fflush(f);
+ftruncate64(fd,0);
+write(fd,"def",3);
+fclose(f);
+f = fopen("test.out","r");
+cnt = fread(buf,1,100,f);
+printf("cnt = %d\n",cnt);
+return 0;
+}
+#endif /* TEST_FTRUNCATE64 */
+
libc/mingw/stdio/lltoa.c
@@ -0,0 +1,10 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __CRT__NO_INLINE
+#include <stdlib.h>
+
+char* lltoa(long long _n, char * _c, int _i)
+ { return _i64toa (_n, _c, _i); }
libc/mingw/stdio/lltow.c
@@ -0,0 +1,10 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __CRT__NO_INLINE
+#include <stdlib.h>
+
+wchar_t* lltow(long long _n, wchar_t * _w, int _i)
+ { return _i64tow (_n, _w, _i); }
libc/mingw/stdio/lseek64.c
@@ -0,0 +1,12 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <io.h>
+
+_off64_t lseek64(int fd,_off64_t offset, int whence)
+{
+ return _lseeki64(fd, (_off64_t) offset, whence);
+}
+
libc/mingw/stdio/mingw_asprintf.c
@@ -0,0 +1,32 @@
+#define _GNU_SOURCE
+#define __CRT__NO_INLINE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+int __mingw_asprintf(char ** __restrict__ ret,
+ const char * __restrict__ format,
+ ...) {
+ va_list ap;
+ int len;
+ va_start(ap,format);
+ /* Get Length */
+ len = __mingw_vsnprintf(NULL,0,format,ap);
+ if (len < 0) goto _end;
+ /* +1 for \0 terminator. */
+ *ret = malloc(len + 1);
+ /* Check malloc fail*/
+ if (!*ret) {
+ len = -1;
+ goto _end;
+ }
+ /* Write String */
+ __mingw_vsnprintf(*ret,len+1,format,ap);
+ /* Terminate explicitly */
+ (*ret)[len] = '\0';
+ _end:
+ va_end(ap);
+ return len;
+}
+
libc/mingw/stdio/mingw_fprintf.c
@@ -0,0 +1,58 @@
+/* fprintf.c
+ *
+ * $Id: fprintf.c,v 1.1 2008/08/11 22:41:55 keithmarshall Exp $
+ *
+ * Provides an implementation of the "fprintf" function, conforming
+ * generally to C99 and SUSv3/POSIX specifications, with extensions
+ * to support Microsoft's non-standard format specifications. This
+ * is included in libmingwex.a, whence it may replace the Microsoft
+ * function of the same name.
+ *
+ * Written by Keith Marshall <keithmarshall@users.sourceforge.net>
+ *
+ * This implementation of "fprintf" will normally be invoked by calling
+ * "__mingw_fprintf()" in preference to a direct reference to "fprintf()"
+ * itself; this leaves the MSVCRT implementation as the default, which
+ * will be deployed when user code invokes "fprint()". Users who then
+ * wish to use this implementation may either call "__mingw_fprintf()"
+ * directly, or may use conditional preprocessor defines, to redirect
+ * references to "fprintf()" to "__mingw_fprintf()".
+ *
+ * Compiling this module with "-D INSTALL_AS_DEFAULT" will change this
+ * recommended convention, such that references to "fprintf()" in user
+ * code will ALWAYS be redirected to "__mingw_fprintf()"; if this option
+ * is adopted, then users wishing to use the MSVCRT implementation of
+ * "fprintf()" will be forced to use a "back-door" mechanism to do so.
+ * Such a "back-door" mechanism is provided with MinGW, allowing the
+ * MSVCRT implementation to be called as "__msvcrt_fprintf()"; however,
+ * since users may not expect this behaviour, a standard libmingwex.a
+ * installation does not employ this option.
+ *
+ *
+ * This is free software. You may redistribute and/or modify it as you
+ * see fit, without restriction of copyright.
+ *
+ * This software is provided "as is", in the hope that it may be useful,
+ * but WITHOUT WARRANTY OF ANY KIND, not even any implied warranty of
+ * MERCHANTABILITY, nor of FITNESS FOR ANY PARTICULAR PURPOSE. At no
+ * time will the author accept any form of liability for any damages,
+ * however caused, resulting from the use of this software.
+ *
+ */
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "mingw_pformat.h"
+
+int __cdecl __fprintf (FILE *, const APICHAR *, ...) __MINGW_NOTHROW;
+
+int __cdecl __fprintf(FILE *stream, const APICHAR *fmt, ...)
+{
+ register int retval;
+ va_list argv; va_start( argv, fmt );
+ _lock_file( stream );
+ retval = __pformat( PFORMAT_TO_FILE | PFORMAT_NOLIMIT, stream, 0, fmt, argv );
+ _unlock_file( stream );
+ va_end( argv );
+ return retval;
+}
libc/mingw/stdio/mingw_fprintfw.c
@@ -0,0 +1,9 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __BUILD_WIDEAPI 1
+
+#include "mingw_fprintf.c"
+
libc/mingw/stdio/mingw_fscanf.c
@@ -0,0 +1,21 @@
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern int __mingw_vfscanf (FILE *stream, const char *format, va_list argp);
+
+int __mingw_fscanf (FILE *stream, const char *format, ...);
+
+int
+__mingw_fscanf (FILE *stream, const char *format, ...)
+{
+ va_list argp;
+ int r;
+
+ va_start (argp, format);
+ r = __mingw_vfscanf (stream, format, argp);
+ va_end (argp);
+
+ return r;
+}
+
libc/mingw/stdio/mingw_fwscanf.c
@@ -0,0 +1,21 @@
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern int __mingw_vfwscanf (FILE *stream, const wchar_t *format, va_list argp);
+
+int __mingw_fwscanf (FILE *stream, const wchar_t *format, ...);
+
+int
+__mingw_fwscanf (FILE *stream, const wchar_t *format, ...)
+{
+ va_list argp;
+ int r;
+
+ va_start (argp, format);
+ r = __mingw_vfwscanf (stream, format, argp);
+ va_end (argp);
+
+ return r;
+}
+
libc/mingw/stdio/mingw_pformat.c
@@ -0,0 +1,3208 @@
+/* pformat.c
+ *
+ * $Id: pformat.c,v 1.9 2011/01/07 22:57:00 keithmarshall Exp $
+ *
+ * Provides a core implementation of the formatting capabilities
+ * common to the entire `printf()' family of functions; it conforms
+ * generally to C99 and SUSv3/POSIX specifications, with extensions
+ * to support Microsoft's non-standard format specifications.
+ *
+ * Written by Keith Marshall <keithmarshall@users.sourceforge.net>
+ *
+ * This is free software. You may redistribute and/or modify it as you
+ * see fit, without restriction of copyright.
+ *
+ * This software is provided "as is", in the hope that it may be useful,
+ * but WITHOUT WARRANTY OF ANY KIND, not even any implied warranty of
+ * MERCHANTABILITY, nor of FITNESS FOR ANY PARTICULAR PURPOSE. At no
+ * time will the author accept any form of liability for any damages,
+ * however caused, resulting from the use of this software.
+ *
+ * The elements of this implementation which deal with the formatting
+ * of floating point numbers, (i.e. the `%e', `%E', `%f', `%F', `%g'
+ * and `%G' format specifiers, but excluding the hexadecimal floating
+ * point `%a' and `%A' specifiers), make use of the `__gdtoa' function
+ * written by David M. Gay, and are modelled on his sample code, which
+ * has been deployed under its accompanying terms of use:--
+ *
+ ******************************************************************
+ * Copyright (C) 1997, 1999, 2001 Lucent Technologies
+ * All Rights Reserved
+ *
+ * Permission to use, copy, modify, and distribute this software and
+ * its documentation for any purpose and without fee is hereby
+ * granted, provided that the above copyright notice appear in all
+ * copies and that both that the copyright notice and this
+ * permission notice and warranty disclaimer appear in supporting
+ * documentation, and that the name of Lucent or any of its entities
+ * not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior
+ * permission.
+ *
+ * LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+ * IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
+ * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
+ * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
+ * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
+ * THIS SOFTWARE.
+ ******************************************************************
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <locale.h>
+#include <wchar.h>
+
+#ifdef __ENABLE_DFP
+#ifndef __STDC_WANT_DEC_FP__
+#define __STDC_WANT_DEC_FP__ 1
+#endif
+
+#include "../math/DFP/dfp_internal.h"
+#endif /* __ENABLE_DFP */
+
+#include <math.h>
+
+/* FIXME: The following belongs in values.h, but current MinGW
+ * has nothing useful there! OTOH, values.h is not a standard
+ * header, and its use may be considered obsolete; perhaps it
+ * is better to just keep these definitions here.
+ */
+
+#include <pshpack1.h>
+/* workaround gcc bug */
+#if defined(__GNUC__) && !defined(__clang__)
+#define ATTRIB_GCC_STRUCT __attribute__((gcc_struct))
+#else
+#define ATTRIB_GCC_STRUCT
+#endif
+typedef struct ATTRIB_GCC_STRUCT __tI128 {
+ int64_t digits[2];
+} __tI128;
+
+typedef struct ATTRIB_GCC_STRUCT __tI128_2 {
+ uint32_t digits32[4];
+} __tI128_2;
+
+typedef union ATTRIB_GCC_STRUCT __uI128 {
+ __tI128 t128;
+ __tI128_2 t128_2;
+} __uI128;
+#include <poppack.h>
+
+#ifndef _VALUES_H
+/*
+ * values.h
+ *
+ */
+#define _VALUES_H
+
+#include <limits.h>
+
+#define _TYPEBITS(type) (sizeof(type) * CHAR_BIT)
+
+#if defined(__ENABLE_PRINTF128) || defined(__ENABLE_DFP)
+#define LLONGBITS _TYPEBITS(__tI128)
+#else
+#define LLONGBITS _TYPEBITS(long long)
+#endif
+
+#endif /* !defined _VALUES_H -- end of file */
+
+#include "mingw_pformat.h"
+
+/* Bit-map constants, defining the internal format control
+ * states, which propagate through the flags.
+ */
+#define PFORMAT_GROUPED 0x00001000
+#define PFORMAT_HASHED 0x00000800
+#define PFORMAT_LJUSTIFY 0x00000400
+#define PFORMAT_ZEROFILL 0x00000200
+
+#define PFORMAT_JUSTIFY (PFORMAT_LJUSTIFY | PFORMAT_ZEROFILL)
+#define PFORMAT_IGNORE -1
+
+#define PFORMAT_SIGNED 0x000001C0
+#define PFORMAT_POSITIVE 0x00000100
+#define PFORMAT_NEGATIVE 0x00000080
+#define PFORMAT_ADDSPACE 0x00000040
+
+#define PFORMAT_XCASE 0x00000020
+
+#define PFORMAT_LDOUBLE 0x00000004
+
+#ifdef __ENABLE_DFP
+#define PFORMAT_DECIM32 0x00020000
+#define PFORMAT_DECIM64 0x00040000
+#define PFORMAT_DECIM128 0x00080000
+#endif
+
+/* `%o' format digit extraction mask, and shift count...
+ * (These are constant, and do not propagate through the flags).
+ */
+#define PFORMAT_OMASK 0x00000007
+#define PFORMAT_OSHIFT 0x00000003
+
+/* `%x' and `%X' format digit extraction mask, and shift count...
+ * (These are constant, and do not propagate through the flags).
+ */
+#define PFORMAT_XMASK 0x0000000F
+#define PFORMAT_XSHIFT 0x00000004
+
+/* The radix point character, used in floating point formats, is
+ * localised on the basis of the active LC_NUMERIC locale category.
+ * It is stored locally, as a `wchar_t' entity, which is converted
+ * to a (possibly multibyte) character on output. Initialisation
+ * of the stored `wchar_t' entity, together with a record of its
+ * effective multibyte character length, is required each time
+ * `__pformat()' is entered, (static storage would not be thread
+ * safe), but this initialisation is deferred until it is actually
+ * needed; on entry, the effective character length is first set to
+ * the following value, (and the `wchar_t' entity is zeroed), to
+ * indicate that a call of `localeconv()' is needed, to complete
+ * the initialisation.
+ */
+#define PFORMAT_RPINIT -3
+
+/* The floating point format handlers return the following value
+ * for the radix point position index, when the argument value is
+ * infinite, or not a number.
+ */
+#define PFORMAT_INFNAN -32768
+
+typedef union
+{
+ /* A data type agnostic representation,
+ * for printf arguments of any integral data type...
+ */
+ signed long __pformat_long_t;
+ signed long long __pformat_llong_t;
+ unsigned long __pformat_ulong_t;
+ unsigned long long __pformat_ullong_t;
+ unsigned short __pformat_ushort_t;
+ unsigned char __pformat_uchar_t;
+ signed short __pformat_short_t;
+ signed char __pformat_char_t;
+ void * __pformat_ptr_t;
+ __uI128 __pformat_u128_t;
+} __pformat_intarg_t;
+
+typedef enum
+{
+ /* Format interpreter state indices...
+ * (used to identify the active phase of format string parsing).
+ */
+ PFORMAT_INIT = 0,
+ PFORMAT_SET_WIDTH,
+ PFORMAT_GET_PRECISION,
+ PFORMAT_SET_PRECISION,
+ PFORMAT_END
+} __pformat_state_t;
+
+typedef enum
+{
+ /* Argument length classification indices...
+ * (used for arguments representing integer data types).
+ */
+ PFORMAT_LENGTH_INT = 0,
+ PFORMAT_LENGTH_SHORT,
+ PFORMAT_LENGTH_LONG,
+ PFORMAT_LENGTH_LLONG,
+ PFORMAT_LENGTH_LLONG128,
+ PFORMAT_LENGTH_CHAR
+} __pformat_length_t;
+/*
+ * And a macro to map any arbitrary data type to an appropriate
+ * matching index, selected from those above; the compiler should
+ * collapse this to a simple assignment.
+ */
+
+#ifdef __GNUC__
+/* provides for some deadcode elimination via compile time eval */
+#define __pformat_arg_length(x) \
+__builtin_choose_expr ( \
+ __builtin_types_compatible_p (typeof (x), __tI128), \
+ PFORMAT_LENGTH_LLONG128, \
+ __builtin_choose_expr ( \
+ __builtin_types_compatible_p (typeof (x), long long), \
+ PFORMAT_LENGTH_LLONG, \
+ __builtin_choose_expr ( \
+ __builtin_types_compatible_p (typeof (x), long), \
+ PFORMAT_LENGTH_LONG, \
+ __builtin_choose_expr ( \
+ __builtin_types_compatible_p (typeof (x), short), \
+ PFORMAT_LENGTH_SHORT, \
+ __builtin_choose_expr ( \
+ __builtin_types_compatible_p (typeof (x), char), \
+ PFORMAT_LENGTH_CHAR, \
+ __builtin_choose_expr ( \
+ __builtin_types_compatible_p (typeof (x), __uI128), \
+ PFORMAT_LENGTH_LLONG128, \
+ __builtin_choose_expr ( \
+ __builtin_types_compatible_p (typeof (x), unsigned long), \
+ PFORMAT_LENGTH_LONG, \
+ __builtin_choose_expr ( \
+ __builtin_types_compatible_p (typeof (x), unsigned long long), \
+ PFORMAT_LENGTH_LLONG, \
+ __builtin_choose_expr ( \
+ __builtin_types_compatible_p (typeof (x), unsigned short), \
+ PFORMAT_LENGTH_SHORT, \
+ __builtin_choose_expr ( \
+ __builtin_types_compatible_p (typeof (x), unsigned char), \
+ PFORMAT_LENGTH_CHAR, \
+ PFORMAT_LENGTH_INT))))))))))
+
+#else
+#define __pformat_arg_length( type ) \
+ sizeof( type ) == sizeof( __tI128 ) ? PFORMAT_LENGTH_LLONG128 : \
+ sizeof( type ) == sizeof( long long ) ? PFORMAT_LENGTH_LLONG : \
+ sizeof( type ) == sizeof( long ) ? PFORMAT_LENGTH_LONG : \
+ sizeof( type ) == sizeof( short ) ? PFORMAT_LENGTH_SHORT : \
+ sizeof( type ) == sizeof( char ) ? PFORMAT_LENGTH_CHAR : \
+ /* should never need this default */ PFORMAT_LENGTH_INT
+#endif
+
+typedef struct
+{
+ /* Formatting and output control data...
+ * An instance of this control block is created, (on the stack),
+ * for each call to `__pformat()', and is passed by reference to
+ * each of the output handlers, as required.
+ */
+ void * dest;
+ int flags;
+ int width;
+ int precision;
+ int rplen;
+ wchar_t rpchr;
+ int thousands_chr_len;
+ wchar_t thousands_chr;
+ int count;
+ int quota;
+ int expmin;
+} __pformat_t;
+
+#if defined(__ENABLE_PRINTF128) || defined(__ENABLE_DFP)
+/* trim leading, leave at least n characters */
+static char * __bigint_trim_leading_zeroes(char *in, int n){
+ char *src = in;
+ int len = strlen(in);
+ while( len > n && *++src == '0') len--;
+
+ /* we want to null terminator too */
+ memmove(in, src, strlen(src) + 1);
+ return in;
+}
+
+/* LSB first */
+static
+void __bigint_to_string(const uint32_t *digits, const uint32_t digitlen, char *buff, const uint32_t bufflen){
+ int64_t digitsize = sizeof(*digits) * 8;
+ int64_t shiftpos = digitlen * digitsize - 1;
+ memset(buff, 0, bufflen);
+
+ while(shiftpos >= 0) {
+ /* increment */
+ for(uint32_t i = 0; i < bufflen - 1; i++){
+ buff[i] += (buff[i] > 4) ? 3 : 0;
+ }
+
+ /* shift left */
+ for(uint32_t i = 0; i < bufflen - 1; i++)
+ buff[i] <<= 1;
+
+ /* shift in */
+ buff[bufflen - 2] |= digits[shiftpos / digitsize] & (0x1 << (shiftpos % digitsize)) ? 1 : 0;
+
+ /* overflow check */
+ for(uint32_t i = bufflen - 1; i > 0; i--){
+ buff[i - 1] |= (buff[i] > 0xf);
+ buff[i] &= 0x0f;
+ }
+ shiftpos--;
+ }
+
+ for(uint32_t i = 0; i < bufflen - 1; i++){
+ buff[i] += '0';
+ }
+ buff[bufflen - 1] = '\0';
+}
+
+#if defined(__ENABLE_PRINTF128)
+/* LSB first, hex version */
+static
+void __bigint_to_stringx(const uint32_t *digits, const uint32_t digitlen, char *buff, const uint32_t bufflen, int upper){
+ int32_t stride = sizeof(*digits) * 2;
+ uint32_t lastpos = 0;
+
+ for(uint32_t i = 0; i < digitlen * stride; i++){
+ int32_t buffpos = bufflen - i - 2;
+ buff[buffpos] = (digits[ i / stride ] & (0xf << 4 * (i % stride))) >> ( 4 * (i % stride));
+ buff[buffpos] += (buff[buffpos] > 9) ? ((upper) ? 0x7 : 0x27) : 0;
+ buff[buffpos] += '0';
+ lastpos = buffpos;
+ if(buffpos == 0) break; /* sanity check */
+ }
+ memset(buff, '0', lastpos);
+ buff[bufflen - 1] = '\0';
+}
+
+/* LSB first, octet version */
+static
+void __bigint_to_stringo(const uint32_t *digits, const uint32_t digitlen, char *buff, const uint32_t bufflen){
+ const uint32_t digitsize = sizeof(*digits) * 8;
+ const uint64_t bits = digitsize * digitlen;
+ uint32_t pos = bufflen - 2;
+ uint32_t reg = 0;
+ for(uint32_t i = 0; i <= bits; i++){
+ reg |= (digits[ i / digitsize] & (0x1 << (i % digitsize))) ? 1 << (i % 3) : 0;
+ if( (i && ( i + 1) % 3 == 0) || (i + 1) == bits){ /* make sure all is committed after last bit */
+ buff[pos] = '0' + reg;
+ reg = 0;
+ if(!pos) break; /* sanity check */
+ pos--;
+ }
+ }
+ if(pos < bufflen - 1)
+ memset(buff,'0', pos + 1);
+ buff[bufflen - 1] = '\0';
+}
+#endif /* defined(__ENABLE_PRINTF128) */
+#endif /* defined(__ENABLE_PRINTF128) || defined(__ENABLE_DFP) */
+
+static
+void __pformat_putc( int c, __pformat_t *stream )
+{
+ /* Place a single character into the `__pformat()' output queue,
+ * provided any specified output quota has not been exceeded.
+ */
+ if( (stream->flags & PFORMAT_NOLIMIT) || (stream->quota > stream->count) )
+ {
+ /* Either there was no quota specified,
+ * or the active quota has not yet been reached.
+ */
+ if( stream->flags & PFORMAT_TO_FILE )
+ /*
+ * This is single character output to a FILE stream...
+ */
+ __fputc(c, (FILE *)(stream->dest));
+
+ else
+ /* Whereas, this is to an internal memory buffer...
+ */
+ ((APICHAR *)(stream->dest))[stream->count] = c;
+ }
+ ++stream->count;
+}
+
+static
+void __pformat_putchars( const char *s, int count, __pformat_t *stream )
+{
+#ifndef __BUILD_WIDEAPI
+ /* Handler for `%c' and (indirectly) `%s' conversion specifications.
+ *
+ * Transfer characters from the string buffer at `s', character by
+ * character, up to the number of characters specified by `count', or
+ * if `precision' has been explicitly set to a value less than `count',
+ * stopping after the number of characters specified for `precision',
+ * to the `__pformat()' output stream.
+ *
+ * Characters to be emitted are passed through `__pformat_putc()', to
+ * ensure that any specified output quota is honoured.
+ */
+ if( (stream->precision >= 0) && (count > stream->precision) )
+ /*
+ * Ensure that the maximum number of characters transferred doesn't
+ * exceed any explicitly set `precision' specification.
+ */
+ count = stream->precision;
+
+ /* Establish the width of any field padding required...
+ */
+ if( stream->width > count )
+ /*
+ * as the number of spaces equivalent to the number of characters
+ * by which those to be emitted is fewer than the field width...
+ */
+ stream->width -= count;
+
+ else
+ /* ignoring any width specification which is insufficient.
+ */
+ stream->width = PFORMAT_IGNORE;
+
+ if( (stream->width > 0) && ((stream->flags & PFORMAT_LJUSTIFY) == 0) )
+ /*
+ * When not doing flush left justification, (i.e. the `-' flag
+ * is not set), any residual unreserved field width must appear
+ * as blank padding, to the left of the output string.
+ */
+ while( stream->width-- )
+ __pformat_putc( '\x20', stream );
+
+ /* Emit the data...
+ */
+ while( count-- )
+ /*
+ * copying the requisite number of characters from the input.
+ */
+ __pformat_putc( *s++, stream );
+
+ /* If we still haven't consumed the entire specified field width,
+ * we must be doing flush left justification; any residual width
+ * must be filled with blanks, to the right of the output value.
+ */
+ while( stream->width-- > 0 )
+ __pformat_putc( '\x20', stream );
+
+#else /* __BUILD_WIDEAPI */
+
+ int len;
+
+ if( (stream->precision >= 0) && (count > stream->precision) )
+ count = stream->precision;
+
+ if( (stream->flags & PFORMAT_TO_FILE) && (stream->flags & PFORMAT_NOLIMIT) )
+ {
+ int __cdecl __ms_fwprintf(FILE *, const wchar_t *, ...);
+
+ if( stream->width > count )
+ {
+ if( (stream->flags & PFORMAT_LJUSTIFY) == 0 )
+ len = __ms_fwprintf( (FILE *)(stream->dest), L"%*.*S", stream->width, count, s );
+ else
+ len = __ms_fwprintf( (FILE *)(stream->dest), L"%-*.*S", stream->width, count, s );
+ }
+ else
+ {
+ len = __ms_fwprintf( (FILE *)(stream->dest), L"%.*S", count, s );
+ }
+ if( len > 0 )
+ stream->count += len;
+ stream->width = PFORMAT_IGNORE;
+ return;
+ }
+
+ if( stream->width > count )
+ stream->width -= count;
+ else
+ stream->width = PFORMAT_IGNORE;
+
+ if( (stream->width > 0) && ((stream->flags & PFORMAT_LJUSTIFY) == 0) )
+ while( stream->width-- )
+ __pformat_putc( '\x20', stream );
+
+ {
+ /* mbrtowc */
+ size_t l;
+ wchar_t w[12], *p;
+ while( count > 0 )
+ {
+ mbstate_t ps;
+ memset(&ps, 0, sizeof(ps) );
+ --count;
+ p = &w[0];
+ l = mbrtowc (p, s, strlen (s), &ps);
+ if (!l)
+ break;
+ if ((ssize_t)l < 0)
+ {
+ l = 1;
+ w[0] = (wchar_t) *s;
+ }
+ s += l;
+ __pformat_putc((int)w[0], stream);
+ }
+ }
+
+ while( stream->width-- > 0 )
+ __pformat_putc( '\x20', stream );
+
+#endif /* __BUILD_WIDEAPI */
+}
+
+static
+void __pformat_puts( const char *s, __pformat_t *stream )
+{
+ /* Handler for `%s' conversion specifications.
+ *
+ * Transfer a NUL terminated character string, character by character,
+ * stopping when the end of the string is encountered, or if `precision'
+ * has been explicitly set, when the specified number of characters has
+ * been emitted, if that is less than the length of the input string,
+ * to the `__pformat()' output stream.
+ *
+ * This is implemented as a trivial call to `__pformat_putchars()',
+ * passing the length of the input string as the character count,
+ * (after first verifying that the input pointer is not NULL).
+ */
+ if( s == NULL ) s = "(null)";
+
+ if( stream->precision >= 0 )
+ __pformat_putchars( s, strnlen( s, stream->precision ), stream );
+ else
+ __pformat_putchars( s, strlen( s ), stream );
+}
+
+static
+void __pformat_wputchars( const wchar_t *s, int count, __pformat_t *stream )
+{
+#ifndef __BUILD_WIDEAPI
+ /* Handler for `%C'(`%lc') and `%S'(`%ls') conversion specifications;
+ * (this is a wide character variant of `__pformat_putchars()').
+ *
+ * Each multibyte character sequence to be emitted is passed, byte
+ * by byte, through `__pformat_putc()', to ensure that any specified
+ * output quota is honoured.
+ */
+ char buf[16];
+ mbstate_t state;
+ int len = wcrtomb(buf, L'\0', &state);
+
+ if( (stream->precision >= 0) && (count > stream->precision) )
+ /*
+ * Ensure that the maximum number of characters transferred doesn't
+ * exceed any explicitly set `precision' specification.
+ */
+ count = stream->precision;
+
+ /* Establish the width of any field padding required...
+ */
+ if( stream->width > count )
+ /*
+ * as the number of spaces equivalent to the number of characters
+ * by which those to be emitted is fewer than the field width...
+ */
+ stream->width -= count;
+
+ else
+ /* ignoring any width specification which is insufficient.
+ */
+ stream->width = PFORMAT_IGNORE;
+
+ if( (stream->width > 0) && ((stream->flags & PFORMAT_LJUSTIFY) == 0) )
+ /*
+ * When not doing flush left justification, (i.e. the `-' flag
+ * is not set), any residual unreserved field width must appear
+ * as blank padding, to the left of the output string.
+ */
+ while( stream->width-- )
+ __pformat_putc( '\x20', stream );
+
+ /* Emit the data, converting each character from the wide
+ * to the multibyte domain as we go...
+ */
+ while( (count-- > 0) && ((len = wcrtomb( buf, *s++, &state )) > 0) )
+ {
+ char *p = buf;
+ while( len-- > 0 )
+ __pformat_putc( *p++, stream );
+ }
+
+ /* If we still haven't consumed the entire specified field width,
+ * we must be doing flush left justification; any residual width
+ * must be filled with blanks, to the right of the output value.
+ */
+ while( stream->width-- > 0 )
+ __pformat_putc( '\x20', stream );
+
+#else /* __BUILD_WIDEAPI */
+
+ int len;
+
+ if( (stream->precision >= 0) && (count > stream->precision) )
+ count = stream->precision;
+
+ if( (stream->flags & PFORMAT_TO_FILE) && (stream->flags & PFORMAT_NOLIMIT) )
+ {
+ int __cdecl __ms_fwprintf(FILE *, const wchar_t *, ...);
+
+ if( stream->width > count )
+ {
+ if( (stream->flags & PFORMAT_LJUSTIFY) == 0 )
+ len = __ms_fwprintf( (FILE *)(stream->dest), L"%*.*s", stream->width, count, s );
+ else
+ len = __ms_fwprintf( (FILE *)(stream->dest), L"%-*.*s", stream->width, count, s );
+ }
+ else
+ {
+ len = __ms_fwprintf( (FILE *)(stream->dest), L"%.*s", count, s );
+ }
+ if( len > 0 )
+ stream->count += len;
+ stream->width = PFORMAT_IGNORE;
+ return;
+ }
+
+ if( stream->width > count )
+ stream->width -= count;
+ else
+ stream->width = PFORMAT_IGNORE;
+
+ if( (stream->width > 0) && ((stream->flags & PFORMAT_LJUSTIFY) == 0) )
+ while( stream->width-- )
+ __pformat_putc( '\x20', stream );
+
+ len = count;
+ while(len-- > 0 && *s != 0)
+ {
+ __pformat_putc(*s++, stream);
+ }
+
+ while( stream->width-- > 0 )
+ __pformat_putc( '\x20', stream );
+
+#endif /* __BUILD_WIDEAPI */
+}
+
+static
+void __pformat_wcputs( const wchar_t *s, __pformat_t *stream )
+{
+ /* Handler for `%S' (`%ls') conversion specifications.
+ *
+ * Transfer a NUL terminated wide character string, character by
+ * character, converting to its equivalent multibyte representation
+ * on output, and stopping when the end of the string is encountered,
+ * or if `precision' has been explicitly set, when the specified number
+ * of characters has been emitted, if that is less than the length of
+ * the input string, to the `__pformat()' output stream.
+ *
+ * This is implemented as a trivial call to `__pformat_wputchars()',
+ * passing the length of the input string as the character count,
+ * (after first verifying that the input pointer is not NULL).
+ */
+ if( s == NULL ) s = L"(null)";
+
+ if( stream->precision >= 0 )
+ __pformat_wputchars( s, wcsnlen( s, stream->precision ), stream );
+ else
+ __pformat_wputchars( s, wcslen( s ), stream );
+}
+
+static
+int __pformat_int_bufsiz( int bias, int size, __pformat_t *stream )
+{
+ /* Helper to establish the size of the internal buffer, which
+ * is required to queue the ASCII decomposition of an integral
+ * data value, prior to transfer to the output stream.
+ */
+ size = ((size - 1 + LLONGBITS) / size) + bias;
+ size += (stream->precision > 0) ? stream->precision : 0;
+ if ((stream->flags & PFORMAT_GROUPED) != 0 && stream->thousands_chr != 0)
+ size += (size / 3);
+ return (size > stream->width) ? size : stream->width;
+}
+
+static
+void __pformat_int( __pformat_intarg_t value, __pformat_t *stream )
+{
+ /* Handler for `%d', `%i' and `%u' conversion specifications.
+ *
+ * Transfer the ASCII representation of an integer value parameter,
+ * formatted as a decimal number, to the `__pformat()' output queue;
+ * output will be truncated, if any specified quota is exceeded.
+ */
+ int32_t bufflen = __pformat_int_bufsiz(1, PFORMAT_OSHIFT, stream);
+#ifdef __ENABLE_PRINTF128
+ char *tmp_buff = NULL;
+#endif
+ char *buf = NULL;
+ char *p;
+ int precision;
+
+ buf = alloca(bufflen);
+ p = buf;
+ if( stream->flags & PFORMAT_NEGATIVE )
+#ifdef __ENABLE_PRINTF128
+ {
+ /* The input value might be negative, (i.e. it is a signed value)...
+ */
+ if( value.__pformat_u128_t.t128.digits[1] < 0) {
+ /*
+ * It IS negative, but we want to encode it as unsigned,
+ * displayed with a leading minus sign, so convert it...
+ */
+ /* two's complement */
+ value.__pformat_u128_t.t128.digits[0] = ~value.__pformat_u128_t.t128.digits[0];
+ value.__pformat_u128_t.t128.digits[1] = ~value.__pformat_u128_t.t128.digits[1];
+ value.__pformat_u128_t.t128.digits[0] += 1;
+ value.__pformat_u128_t.t128.digits[1] += (!value.__pformat_u128_t.t128.digits[0]) ? 1 : 0;
+ } else
+ /* It is unequivocally a POSITIVE value, so turn off the
+ * request to prefix it with a minus sign...
+ */
+ stream->flags &= ~PFORMAT_NEGATIVE;
+ }
+
+ tmp_buff = alloca(bufflen);
+ /* Encode the input value for display...
+ */
+ __bigint_to_string(value.__pformat_u128_t.t128_2.digits32,
+ 4, tmp_buff, bufflen);
+ __bigint_trim_leading_zeroes(tmp_buff,1);
+
+ memset(p,0,bufflen);
+ for(int32_t i = strlen(tmp_buff) - 1; i >= 0; i--){
+ if ( i && (stream->flags & PFORMAT_GROUPED) != 0 && stream->thousands_chr != 0
+ && (i % 4) == 3)
+ {
+ *p++ = ',';
+ }
+ *p++ = tmp_buff[i];
+ if( i > bufflen - 1) break; /* sanity chec */
+ if( tmp_buff[i] == '\0' ) break; /* end */
+ }
+#else
+ {
+ /* The input value might be negative, (i.e. it is a signed value)...
+ */
+ if( value.__pformat_llong_t < 0LL )
+ /*
+ * It IS negative, but we want to encode it as unsigned,
+ * displayed with a leading minus sign, so convert it...
+ */
+ value.__pformat_llong_t = -value.__pformat_llong_t;
+
+ else
+ /* It is unequivocally a POSITIVE value, so turn off the
+ * request to prefix it with a minus sign...
+ */
+ stream->flags &= ~PFORMAT_NEGATIVE;
+ }
+while( value.__pformat_ullong_t )
+ {
+ /* decomposing it into its constituent decimal digits,
+ * in order from least significant to most significant, using
+ * the local buffer as a LIFO queue in which to store them.
+ */
+ if (p != buf && (stream->flags & PFORMAT_GROUPED) != 0 && stream->thousands_chr != 0
+ && ((p - buf) % 4) == 3)
+ {
+ *p++ = ',';
+ }
+ *p++ = '0' + (unsigned char)(value.__pformat_ullong_t % 10LL);
+ value.__pformat_ullong_t /= 10LL;
+ }
+#endif
+
+ if( (stream->precision > 0)
+ && ((precision = stream->precision - (p - buf)) > 0) )
+ /*
+ * We have not yet queued sufficient digits to fill the field width
+ * specified for minimum `precision'; pad with zeros to achieve this.
+ */
+ while( precision-- > 0 )
+ *p++ = '0';
+
+ if( (p == buf) && (stream->precision != 0) )
+ /*
+ * Input value was zero; make sure we print at least one digit,
+ * unless the precision is also explicitly zero.
+ */
+ *p++ = '0';
+
+ if( (stream->width > 0) && ((stream->width -= p - buf) > 0) )
+ {
+ /* We have now queued sufficient characters to display the input value,
+ * at the desired precision, but this will not fill the output field...
+ */
+ if( stream->flags & PFORMAT_SIGNED )
+ /*
+ * We will fill one additional space with a sign...
+ */
+ stream->width--;
+
+ if( (stream->precision < 0)
+ && ((stream->flags & PFORMAT_JUSTIFY) == PFORMAT_ZEROFILL) )
+ /*
+ * and the `0' flag is in effect, so we pad the remaining spaces,
+ * to the left of the displayed value, with zeros.
+ */
+ while( stream->width-- > 0 )
+ *p++ = '0';
+
+ else if( (stream->flags & PFORMAT_LJUSTIFY) == 0 )
+ /*
+ * the `0' flag is not in effect, and neither is the `-' flag,
+ * so we pad to the left of the displayed value with spaces, so that
+ * the value appears right justified within the output field.
+ */
+ while( stream->width-- > 0 )
+ __pformat_putc( '\x20', stream );
+ }
+
+ if( stream->flags & PFORMAT_NEGATIVE )
+ /*
+ * A negative value needs a sign...
+ */
+ *p++ = '-';
+
+ else if( stream->flags & PFORMAT_POSITIVE )
+ /*
+ * A positive value may have an optionally displayed sign...
+ */
+ *p++ = '+';
+
+ else if( stream->flags & PFORMAT_ADDSPACE )
+ /*
+ * Space was reserved for displaying a sign, but none was emitted...
+ */
+ *p++ = '\x20';
+
+ while( p > buf )
+ /*
+ * Emit the accumulated constituent digits,
+ * in order from most significant to least significant...
+ */
+ __pformat_putc( *--p, stream );
+
+ while( stream->width-- > 0 )
+ /*
+ * The specified output field has not yet been completely filled;
+ * the `-' flag must be in effect, resulting in a displayed value which
+ * appears left justified within the output field; we must pad the field
+ * to the right of the displayed value, by emitting additional spaces,
+ * until we reach the rightmost field boundary.
+ */
+ __pformat_putc( '\x20', stream );
+}
+
+static
+void __pformat_xint( int fmt, __pformat_intarg_t value, __pformat_t *stream )
+{
+ /* Handler for `%o', `%p', `%x' and `%X' conversions.
+ *
+ * These can be implemented using a simple `mask and shift' strategy;
+ * set up the mask and shift values appropriate to the conversion format,
+ * and allocate a suitably sized local buffer, in which to queue encoded
+ * digits of the formatted value, in preparation for output.
+ */
+ int width;
+ int shift = (fmt == 'o') ? PFORMAT_OSHIFT : PFORMAT_XSHIFT;
+ int bufflen = __pformat_int_bufsiz(2, shift, stream);
+ char *buf = NULL;
+#ifdef __ENABLE_PRINTF128
+ char *tmp_buf = NULL;
+#endif
+ char *p;
+ buf = alloca(bufflen);
+ p = buf;
+#ifdef __ENABLE_PRINTF128
+ tmp_buf = alloca(bufflen);
+ if(fmt == 'o'){
+ __bigint_to_stringo(value.__pformat_u128_t.t128_2.digits32,4,tmp_buf,bufflen);
+ } else {
+ __bigint_to_stringx(value.__pformat_u128_t.t128_2.digits32,4,tmp_buf,bufflen, !(fmt & PFORMAT_XCASE));
+ }
+ __bigint_trim_leading_zeroes(tmp_buf,0);
+
+ memset(buf,0,bufflen);
+ for(int32_t i = strlen(tmp_buf); i >= 0; i--)
+ *p++ = tmp_buf[i];
+#else
+ int mask = (fmt == 'o') ? PFORMAT_OMASK : PFORMAT_XMASK;
+ while( value.__pformat_ullong_t )
+ {
+ /* Encode the specified non-zero input value as a sequence of digits,
+ * in the appropriate `base' encoding and in reverse digit order, each
+ * encoded in its printable ASCII form, with no leading zeros, using
+ * the local buffer as a LIFO queue in which to store them.
+ */
+ char *q;
+ if( (*(q = p++) = '0' + (value.__pformat_ullong_t & mask)) > '9' )
+ *q = (*q + 'A' - '9' - 1) | (fmt & PFORMAT_XCASE);
+ value.__pformat_ullong_t >>= shift;
+ }
+#endif
+
+ if( p == buf )
+ /*
+ * Nothing was queued; input value must be zero, which should never be
+ * emitted in the `alternative' PFORMAT_HASHED style.
+ */
+ stream->flags &= ~PFORMAT_HASHED;
+
+ if( ((width = stream->precision) > 0) && ((width -= p - buf) > 0) )
+ /*
+ * We have not yet queued sufficient digits to fill the field width
+ * specified for minimum `precision'; pad with zeros to achieve this.
+ */
+ while( width-- > 0 )
+ *p++ = '0';
+
+ else if( (fmt == 'o') && (stream->flags & PFORMAT_HASHED) )
+ /*
+ * The field width specified for minimum `precision' has already
+ * been filled, but the `alternative' PFORMAT_HASHED style for octal
+ * output requires at least one initial zero; that will not have
+ * been queued, so add it now.
+ */
+ *p++ = '0';
+
+ if( (p == buf) && (stream->precision != 0) )
+ /*
+ * Still nothing queued for output, but the `precision' has not been
+ * explicitly specified as zero, (which is necessary if no output for
+ * an input value of zero is desired); queue exactly one zero digit.
+ */
+ *p++ = '0';
+
+ if( stream->width > (width = p - buf) )
+ /*
+ * Specified field width exceeds the minimum required...
+ * Adjust so that we retain only the additional padding width.
+ */
+ stream->width -= width;
+
+ else
+ /* Ignore any width specification which is insufficient.
+ */
+ stream->width = PFORMAT_IGNORE;
+
+ if( ((width = stream->width) > 0)
+ && (fmt != 'o') && (stream->flags & PFORMAT_HASHED) )
+ /*
+ * For `%#x' or `%#X' formats, (which have the `#' flag set),
+ * further reduce the padding width to accommodate the radix
+ * indicating prefix.
+ */
+ width -= 2;
+
+ if( (width > 0) && (stream->precision < 0)
+ && ((stream->flags & PFORMAT_JUSTIFY) == PFORMAT_ZEROFILL) )
+ /*
+ * When the `0' flag is set, and not overridden by the `-' flag,
+ * or by a specified precision, add sufficient leading zeros to
+ * consume the remaining field width.
+ */
+ while( width-- > 0 )
+ *p++ = '0';
+
+ if( (fmt != 'o') && (stream->flags & PFORMAT_HASHED) )
+ {
+ /* For formats other than octal, the PFORMAT_HASHED output style
+ * requires the addition of a two character radix indicator, as a
+ * prefix to the actual encoded numeric value.
+ */
+ *p++ = fmt;
+ *p++ = '0';
+ }
+
+ if( (width > 0) && ((stream->flags & PFORMAT_LJUSTIFY) == 0) )
+ /*
+ * When not doing flush left justification, (i.e. the `-' flag
+ * is not set), any residual unreserved field width must appear
+ * as blank padding, to the left of the output value.
+ */
+ while( width-- > 0 )
+ __pformat_putc( '\x20', stream );
+
+ while( p > buf )
+ /*
+ * Move the queued output from the local buffer to the ultimate
+ * destination, in LIFO order.
+ */
+ __pformat_putc( *--p, stream );
+
+ /* If we still haven't consumed the entire specified field width,
+ * we must be doing flush left justification; any residual width
+ * must be filled with blanks, to the right of the output value.
+ */
+ while( width-- > 0 )
+ __pformat_putc( '\x20', stream );
+}
+
+typedef union
+{
+ /* A multifaceted representation of an IEEE extended precision,
+ * (80-bit), floating point number, facilitating access to its
+ * component parts.
+ */
+ double __pformat_fpreg_double_t;
+ long double __pformat_fpreg_ldouble_t;
+ struct
+ { unsigned long long __pformat_fpreg_mantissa;
+ signed short __pformat_fpreg_exponent;
+ };
+ unsigned short __pformat_fpreg_bitmap[5];
+ unsigned long __pformat_fpreg_bits;
+} __pformat_fpreg_t;
+
+#ifdef _WIN32
+/* TODO: make this unconditional in final release...
+ * (see note at head of associated `#else' block.
+ */
+#include "../gdtoa/gdtoa.h"
+
+static
+char *__pformat_cvt( int mode, __pformat_fpreg_t x, int nd, int *dp, int *sign )
+{
+ /* Helper function, derived from David M. Gay's `g_xfmt()', calling
+ * his `__gdtoa()' function in a manner to provide extended precision
+ * replacements for `ecvt()' and `fcvt()'.
+ */
+ int k; unsigned int e = 0; char *ep;
+ static FPI fpi = { 64, 1-16383-64+1, 32766-16383-64+1, FPI_Round_near, 0, 14 /* Int_max */ };
+
+ if( sizeof( double ) == sizeof( long double ) )
+ {
+ /* The caller has written into x.__pformat_fpreg_ldouble_t, which
+ * actually isn't laid out in the way the rest of the union expects it.
+ */
+ int exp = (x.__pformat_fpreg_mantissa >> 52) & 0x7ff;
+ unsigned long long mant = x.__pformat_fpreg_mantissa & 0x000fffffffffffffULL;
+ int integer = exp ? 1 : 0;
+ int signbit = x.__pformat_fpreg_mantissa >> 63;
+
+ k = __fpclassify( x.__pformat_fpreg_double_t );
+
+ if (exp == 0x7ff)
+ exp = 0x7fff;
+ else if (exp != 0)
+ exp = exp - 1023 + 16383;
+ x.__pformat_fpreg_mantissa = (mant << 11) | ((unsigned long long)integer << 63);
+ x.__pformat_fpreg_exponent = exp | (signbit << 15);
+ }
+ else
+ k = __fpclassifyl( x.__pformat_fpreg_ldouble_t );
+
+
+ /* Classify the argument into an appropriate `__gdtoa()' category...
+ */
+ if( k & FP_NAN )
+ /*
+ * identifying infinities or not-a-number...
+ */
+ k = (k & FP_NORMAL) ? STRTOG_Infinite : STRTOG_NaN;
+
+ else if( k & FP_NORMAL )
+ {
+ /* normal and near-zero `denormals'...
+ */
+ if( k & FP_ZERO )
+ {
+ /* with appropriate exponent adjustment for a `denormal'...
+ */
+ k = STRTOG_Denormal;
+ e = 1 - 0x3FFF - 63;
+ }
+ else
+ {
+ /* or with `normal' exponent adjustment...
+ */
+ k = STRTOG_Normal;
+ e = (x.__pformat_fpreg_exponent & 0x7FFF) - 0x3FFF - 63;
+ }
+ }
+
+ else
+ /* or, if none of the above, it's a zero, (positive or negative).
+ */
+ k = STRTOG_Zero;
+
+ /* Check for negative values, always treating NaN as unsigned...
+ * (return value is zero for positive/unsigned; non-zero for negative).
+ */
+ *sign = (k == STRTOG_NaN) ? 0 : x.__pformat_fpreg_exponent & 0x8000;
+
+ /* Finally, get the raw digit string, and radix point position index.
+ */
+ return __gdtoa( &fpi, e, &x.__pformat_fpreg_bits, &k, mode, nd, dp, &ep );
+}
+
+static
+char *__pformat_ecvt( long double x, int precision, int *dp, int *sign )
+{
+ /* A convenience wrapper for the above...
+ * it emulates `ecvt()', but takes a `long double' argument.
+ */
+ __pformat_fpreg_t z; z.__pformat_fpreg_ldouble_t = x;
+ return __pformat_cvt( 2, z, precision, dp, sign );
+}
+
+static
+char *__pformat_fcvt( long double x, int precision, int *dp, int *sign )
+{
+ /* A convenience wrapper for the above...
+ * it emulates `fcvt()', but takes a `long double' argument.
+ */
+ __pformat_fpreg_t z; z.__pformat_fpreg_ldouble_t = x;
+ return __pformat_cvt( 3, z, precision, dp, sign );
+}
+
+/* The following are required, to clean up the `__gdtoa()' memory pool,
+ * after processing the data returned by the above.
+ */
+#define __pformat_ecvt_release( value ) __freedtoa( value )
+#define __pformat_fcvt_release( value ) __freedtoa( value )
+
+#else
+/*
+ * TODO: remove this before final release; it is included here as a
+ * convenience for testing, without requiring a working `__gdtoa()'.
+ */
+static
+char *__pformat_ecvt( long double x, int precision, int *dp, int *sign )
+{
+ /* Define in terms of `ecvt()'...
+ */
+ char *retval = ecvt( (double)(x), precision, dp, sign );
+ if( isinf( x ) || isnan( x ) )
+ {
+ /* emulating `__gdtoa()' reporting for infinities and NaN.
+ */
+ *dp = PFORMAT_INFNAN;
+ if( *retval == '-' )
+ {
+ /* Need to force the `sign' flag, (particularly for NaN).
+ */
+ ++retval; *sign = 1;
+ }
+ }
+ return retval;
+}
+
+static
+char *__pformat_fcvt( long double x, int precision, int *dp, int *sign )
+{
+ /* Define in terms of `fcvt()'...
+ */
+ char *retval = fcvt( (double)(x), precision, dp, sign );
+ if( isinf( x ) || isnan( x ) )
+ {
+ /* emulating `__gdtoa()' reporting for infinities and NaN.
+ */
+ *dp = PFORMAT_INFNAN;
+ if( *retval == '-' )
+ {
+ /* Need to force the `sign' flag, (particularly for NaN).
+ */
+ ++retval; *sign = 1;
+ }
+ }
+ return retval;
+}
+
+/* No memory pool clean up needed, for these emulated cases...
+ */
+#define __pformat_ecvt_release( value ) /* nothing to be done */
+#define __pformat_fcvt_release( value ) /* nothing to be done */
+
+/* TODO: end of conditional to be removed. */
+#endif
+
+static
+void __pformat_emit_radix_point( __pformat_t *stream )
+{
+ /* Helper to place a localised representation of the radix point
+ * character at the ultimate destination, when formatting fixed or
+ * floating point numbers.
+ */
+ if( stream->rplen == PFORMAT_RPINIT )
+ {
+ /* Radix point initialisation not yet completed;
+ * establish a multibyte to `wchar_t' converter...
+ */
+ int len; wchar_t rpchr; mbstate_t state;
+
+ /* Initialise the conversion state...
+ */
+ memset( &state, 0, sizeof( state ) );
+
+ /* Fetch and convert the localised radix point representation...
+ */
+ if( (len = mbrtowc( &rpchr, localeconv()->decimal_point, 16, &state )) > 0 )
+ /*
+ * and store it, if valid.
+ */
+ stream->rpchr = rpchr;
+
+ /* In any case, store the reported effective multibyte length,
+ * (or the error flag), marking initialisation as `done'.
+ */
+ stream->rplen = len;
+ }
+
+ if( stream->rpchr != (wchar_t)(0) )
+ {
+ /* We have a localised radix point mark;
+ * establish a converter to make it a multibyte character...
+ */
+#ifdef __BUILD_WIDEAPI
+ __pformat_putc (stream->rpchr, stream);
+#else
+ int len; char buf[len = stream->rplen]; mbstate_t state;
+
+ /* Initialise the conversion state...
+ */
+ memset( &state, 0, sizeof( state ) );
+
+ /* Convert the `wchar_t' representation to multibyte...
+ */
+ if( (len = wcrtomb( buf, stream->rpchr, &state )) > 0 )
+ {
+ /* and copy to the output destination, when valid...
+ */
+ char *p = buf;
+ while( len-- > 0 )
+ __pformat_putc( *p++, stream );
+ }
+
+ else
+ /* otherwise fall back to plain ASCII '.'...
+ */
+ __pformat_putc( '.', stream );
+#endif
+ }
+ else
+ /* No localisation: just use ASCII '.'...
+ */
+ __pformat_putc( '.', stream );
+}
+
+static
+void __pformat_emit_numeric_value( int c, __pformat_t *stream )
+{
+ /* Convenience helper to transfer numeric data from an internal
+ * formatting buffer to the ultimate destination...
+ */
+ if( c == '.' )
+ /*
+ * converting this internal representation of the the radix
+ * point to the appropriately localised representation...
+ */
+ __pformat_emit_radix_point( stream );
+ else if (c == ',')
+ {
+ wchar_t wcs;
+ if ((wcs = stream->thousands_chr) != 0)
+ __pformat_wputchars (&wcs, 1, stream);
+ }
+ else
+ /* and passing all other characters through, unmodified.
+ */
+ __pformat_putc( c, stream );
+}
+
+static
+void __pformat_emit_inf_or_nan( int sign, char *value, __pformat_t *stream )
+{
+ /* Helper to emit INF or NAN where a floating point value
+ * resolves to one of these special states.
+ */
+ int i;
+ char buf[4];
+ char *p = buf;
+
+ /* We use the string formatting helper to display INF/NAN,
+ * but we don't want truncation if the precision set for the
+ * original floating point output request was insufficient;
+ * ignore it!
+ */
+ stream->precision = PFORMAT_IGNORE;
+
+ if( sign )
+ /*
+ * Negative infinity: emit the sign...
+ */
+ *p++ = '-';
+
+ else if( stream->flags & PFORMAT_POSITIVE )
+ /*
+ * Not negative infinity, but '+' flag is in effect;
+ * thus, we emit a positive sign...
+ */
+ *p++ = '+';
+
+ else if( stream->flags & PFORMAT_ADDSPACE )
+ /*
+ * No sign required, but space was reserved for it...
+ */
+ *p++ = '\x20';
+
+ /* Copy the appropriate status indicator, up to a maximum of
+ * three characters, transforming to the case corresponding to
+ * the format specification...
+ */
+ for( i = 3; i > 0; --i )
+ *p++ = (*value++ & ~PFORMAT_XCASE) | (stream->flags & PFORMAT_XCASE);
+
+ /* and emit the result.
+ */
+ __pformat_putchars( buf, p - buf, stream );
+}
+
+static
+void __pformat_emit_float( int sign, char *value, int len, __pformat_t *stream )
+{
+ /* Helper to emit a fixed point representation of numeric data,
+ * as encoded by a prior call to `ecvt()' or `fcvt()'; (this does
+ * NOT include the exponent, for floating point format).
+ */
+ if( len > 0 )
+ {
+ /* The magnitude of `x' is greater than or equal to 1.0...
+ * reserve space in the output field, for the required number of
+ * decimal digits to be placed before the decimal point...
+ */
+ if( stream->width >= len)
+ /*
+ * adjusting as appropriate, when width is sufficient...
+ */
+ stream->width -= len;
+
+ else
+ /* or simply ignoring the width specification, if not.
+ */
+ stream->width = PFORMAT_IGNORE;
+ }
+
+ else if( stream->width > 0 )
+ /*
+ * The magnitude of `x' is less than 1.0...
+ * reserve space for exactly one zero before the decimal point.
+ */
+ stream->width--;
+
+ /* Reserve additional space for the digits which will follow the
+ * decimal point...
+ */
+ if( (stream->width >= 0) && (stream->width > stream->precision) )
+ /*
+ * adjusting appropriately, when sufficient width remains...
+ * (note that we must check both of these conditions, because
+ * precision may be more negative than width, as a result of
+ * adjustment to provide extra padding when trailing zeros
+ * are to be discarded from "%g" format conversion with a
+ * specified field width, but if width itself is negative,
+ * then there is explicitly to be no padding anyway).
+ */
+ stream->width -= stream->precision;
+
+ else
+ /* or again, ignoring the width specification, if not.
+ */
+ stream->width = PFORMAT_IGNORE;
+
+ /* Reserve space in the output field, for display of the decimal point,
+ * unless the precision is explicity zero, with the `#' flag not set.
+ */
+ if ((stream->width > 0)
+ && ((stream->precision > 0) || (stream->flags & PFORMAT_HASHED)))
+ stream->width--;
+
+ if (len > 0 && (stream->flags & PFORMAT_GROUPED) != 0 && stream->thousands_chr != 0)
+ {
+ int cths = ((len + 2) / 3) - 1;
+ while (cths > 0 && stream->width > 0)
+ {
+ --cths; stream->width--;
+ }
+ }
+
+ /* Reserve space in the output field, for display of the sign of the
+ * formatted value, if required; (i.e. if the value is negative, or if
+ * either the `space' or `+' formatting flags are set).
+ */
+ if( (stream->width > 0) && (sign || (stream->flags & PFORMAT_SIGNED)) )
+ stream->width--;
+
+ /* Emit any padding space, as required to correctly right justify
+ * the output within the alloted field width.
+ */
+ if( (stream->width > 0) && ((stream->flags & PFORMAT_JUSTIFY) == 0) )
+ while( stream->width-- > 0 )
+ __pformat_putc( '\x20', stream );
+
+ /* Emit the sign indicator, as appropriate...
+ */
+ if( sign )
+ /*
+ * mandatory, for negative values...
+ */
+ __pformat_putc( '-', stream );
+
+ else if( stream->flags & PFORMAT_POSITIVE )
+ /*
+ * optional, for positive values...
+ */
+ __pformat_putc( '+', stream );
+
+ else if( stream->flags & PFORMAT_ADDSPACE )
+ /*
+ * or just fill reserved space, when the space flag is in effect.
+ */
+ __pformat_putc( '\x20', stream );
+
+ /* If the `0' flag is in effect, and not overridden by the `-' flag,
+ * then zero padding, to fill out the field, goes here...
+ */
+ if( (stream->width > 0)
+ && ((stream->flags & PFORMAT_JUSTIFY) == PFORMAT_ZEROFILL) )
+ while( stream->width-- > 0 )
+ __pformat_putc( '0', stream );
+
+ /* Emit the digits of the encoded numeric value...
+ */
+ if( len > 0 )
+ {
+ /*
+ * ...beginning with those which precede the radix point,
+ * and appending any necessary significant trailing zeros.
+ */
+ do {
+ __pformat_putc( *value ? *value++ : '0', stream);
+ --len;
+ if (len != 0 && (stream->flags & PFORMAT_GROUPED) != 0 && stream->thousands_chr != 0
+ && (len % 3) == 0)
+ __pformat_wputchars (&stream->thousands_chr, 1, stream);
+ }
+ while (len > 0);
+ }
+ else
+ /* The magnitude of the encoded value is less than 1.0, so no
+ * digits precede the radix point; we emit a mandatory initial
+ * zero, followed immediately by the radix point.
+ */
+ __pformat_putc( '0', stream );
+
+ /* Unless the encoded value is integral, AND the radix point
+ * is not expressly demanded by the `#' flag, we must insert
+ * the appropriately localised radix point mark here...
+ */
+ if( (stream->precision > 0) || (stream->flags & PFORMAT_HASHED) )
+ __pformat_emit_radix_point( stream );
+
+ /* When the radix point offset, `len', is negative, this implies
+ * that additional zeros must appear, following the radix point,
+ * and preceding the first significant digit...
+ */
+ if( len < 0 )
+ {
+ /* To accommodate these, we adjust the precision, (reducing it
+ * by adding a negative value), and then we emit as many zeros
+ * as are required.
+ */
+ stream->precision += len;
+ do __pformat_putc( '0', stream );
+ while( ++len < 0 );
+ }
+
+ /* Now we emit any remaining significant digits, or trailing zeros,
+ * until the required precision has been achieved.
+ */
+ while( stream->precision-- > 0 )
+ __pformat_putc( *value ? *value++ : '0', stream );
+}
+
+static
+void __pformat_emit_efloat( int sign, char *value, int e, __pformat_t *stream )
+{
+ /* Helper to emit a floating point representation of numeric data,
+ * as encoded by a prior call to `ecvt()' or `fcvt()'; (this DOES
+ * include the following exponent).
+ */
+ int exp_width = 1;
+ __pformat_intarg_t exponent; exponent.__pformat_llong_t = e -= 1;
+
+ /* Determine how many digit positions are required for the exponent.
+ */
+ while( (e /= 10) != 0 )
+ exp_width++;
+
+ /* Ensure that this is at least as many as the standard requirement.
+ * The C99 standard requires the expenent to contain at least two
+ * digits, unless specified explicitly otherwise.
+ */
+ if (stream->expmin == -1)
+ stream->expmin = 2;
+ if( exp_width < stream->expmin )
+ exp_width = stream->expmin;
+
+ /* Adjust the residual field width allocation, to allow for the
+ * number of exponent digits to be emitted, together with a sign
+ * and exponent separator...
+ */
+ if( stream->width > (exp_width += 2) )
+ stream->width -= exp_width;
+
+ else
+ /* ignoring the field width specification, if insufficient.
+ */
+ stream->width = PFORMAT_IGNORE;
+
+ /* Emit the significand, as a fixed point value with one digit
+ * preceding the radix point.
+ */
+ __pformat_emit_float( sign, value, 1, stream );
+
+ /* Reset precision, to ensure the mandatory minimum number of
+ * exponent digits will be emitted, and set the flags to ensure
+ * the sign is displayed.
+ */
+ stream->precision = stream->expmin;
+ stream->flags |= PFORMAT_SIGNED;
+
+ /* Emit the exponent separator.
+ */
+ __pformat_putc( ('E' | (stream->flags & PFORMAT_XCASE)), stream );
+
+ /* Readjust the field width setting, such that it again allows
+ * for the digits of the exponent, (which had been discounted when
+ * computing any left side padding requirement), so that they are
+ * correctly included in the computation of any right side padding
+ * requirement, (but here we exclude the exponent separator, which
+ * has been emitted, and so counted already).
+ */
+ stream->width += exp_width - 1;
+
+ /* And finally, emit the exponent itself, as a signed integer,
+ * with any padding required to achieve flush left justification,
+ * (which will be added automatically, by `__pformat_int()').
+ */
+ __pformat_int( exponent, stream );
+}
+
+static
+void __pformat_float( long double x, __pformat_t *stream )
+{
+ /* Handler for `%f' and `%F' format specifiers.
+ *
+ * This wraps calls to `__pformat_cvt()', `__pformat_emit_float()'
+ * and `__pformat_emit_inf_or_nan()', as appropriate, to achieve
+ * output in fixed point format.
+ */
+ int sign, intlen; char *value;
+
+ /* Establish the precision for the displayed value, defaulting to six
+ * digits following the decimal point, if not explicitly specified.
+ */
+ if( stream->precision < 0 )
+ stream->precision = 6;
+
+ /* Encode the input value as ASCII, for display...
+ */
+ value = __pformat_fcvt( x, stream->precision, &intlen, &sign );
+
+ if( intlen == PFORMAT_INFNAN )
+ /*
+ * handle cases of `infinity' or `not-a-number'...
+ */
+ __pformat_emit_inf_or_nan( sign, value, stream );
+
+ else
+ { /* or otherwise, emit the formatted result.
+ */
+ __pformat_emit_float( sign, value, intlen, stream );
+
+ /* and, if there is any residual field width as yet unfilled,
+ * then we must be doing flush left justification, so pad out to
+ * the right hand field boundary.
+ */
+ while( stream->width-- > 0 )
+ __pformat_putc( '\x20', stream );
+ }
+
+ /* Clean up `__pformat_fcvt()' memory allocation for `value'...
+ */
+ __pformat_fcvt_release( value );
+}
+
+#ifdef __ENABLE_DFP
+
+typedef struct decimal128_decode {
+ int64_t significand[2];
+ int32_t exponent;
+ int sig_neg;
+ int exp_neg;
+} decimal128_decode;
+
+static uint32_t dec128_decode(decimal128_decode *result, const _Decimal128 deci){
+ int64_t significand2;
+ int64_t significand1;
+ int32_t exp_part;
+ int8_t sig_sign;
+ ud128 in;
+ in.d = deci;
+
+ if(in.t0.bits == 0x3){ /*case 11 */
+ /* should not enter here */
+ sig_sign = in.t2.sign;
+ exp_part = in.t2.exponent;
+ significand1 = in.t2.mantissaL;
+ significand2 = (in.t2.mantissaH | (0x1ULL << 49));
+ } else {
+ sig_sign = in.t1.sign;
+ exp_part = in.t1.exponent;
+ significand1 = in.t1.mantissaL;
+ significand2 = in.t1.mantissaH;
+ }
+ exp_part -= 6176; /* exp bias */
+
+ result->significand[0] = significand1;
+ result->significand[1] = significand2; /* higher */
+ result->exponent = exp_part;
+ result->exp_neg = (exp_part < 0 )? 1 : 0;
+ result->sig_neg = sig_sign;
+
+ return 0;
+}
+
+static
+void __pformat_efloat_decimal(_Decimal128 x, __pformat_t *stream ){
+ decimal128_decode in;
+ char str_exp[8];
+ char str_sig[40];
+ int floatclass = __fpclassifyd128(x);
+
+ /* precision control */
+ int32_t prec = ( (stream->precision < 0) || (stream->precision > 38) ) ?
+ 6 : stream->precision;
+ int32_t max_prec;
+ int32_t exp_strlen;
+
+ dec128_decode(&in,x);
+
+ if((floatclass & FP_INFINITE) == FP_INFINITE){
+ stream->precision = 3;
+ if(stream->flags & PFORMAT_SIGNED)
+ __pformat_putc( in.sig_neg ? '-' : '+', stream );
+ __pformat_puts( (stream->flags & PFORMAT_XCASE) ? "inf" : "INF", stream);
+ return;
+ } else if(floatclass & FP_NAN){
+ stream->precision = 3;
+ if(stream->flags & PFORMAT_SIGNED)
+ __pformat_putc( in.sig_neg ? '-' : '+', stream );
+ __pformat_puts( (stream->flags & PFORMAT_XCASE) ? "nan" : "NAN", stream);
+ return;
+ }
+
+ /* Stringify significand */
+ __bigint_to_string(
+ (uint32_t[4]){in.significand[0] & 0x0ffffffff, in.significand[0] >> 32, in.significand[1] & 0x0ffffffff, in.significand[1] >> 32 },
+ 4, str_sig, sizeof(str_sig));
+ __bigint_trim_leading_zeroes(str_sig,1);
+ max_prec = strlen(str_sig+1);
+
+ /* Try to canonize exponent */
+ in.exponent += max_prec;
+ in.exp_neg = (in.exponent < 0 ) ? 1 : 0;
+
+ /* stringify exponent */
+ __bigint_to_string(
+ (uint32_t[1]) { in.exp_neg ? -in.exponent : in.exponent},
+ 1, str_exp, sizeof(str_exp));
+ exp_strlen = strlen(__bigint_trim_leading_zeroes(str_exp,3));
+
+ /* account for dot, +-e */
+ for(int32_t spacers = 0; spacers < stream->width - max_prec - exp_strlen - 4; spacers++)
+ __pformat_putc( ' ', stream );
+
+ /* optional sign */
+ if (in.sig_neg || (stream->flags & PFORMAT_SIGNED)) {
+ __pformat_putc( in.sig_neg ? '-' : '+', stream );
+ } else if( stream->width - max_prec - exp_strlen - 4 > 0 ) {
+ __pformat_putc( ' ', stream );
+ }
+ stream->width = 0;
+ /* s.sss form */
+ __pformat_putc(str_sig[0], stream);
+ if(prec) {
+ /* str_sig[prec+1] = '\0';*/
+ __pformat_emit_radix_point(stream);
+ __pformat_putchars(str_sig+1, prec, stream);
+
+ /* Pad with 0s */
+ for(int i = max_prec; i < prec; i++)
+ __pformat_putc('0', stream);
+ }
+
+ stream->precision = exp_strlen; /* force puts to emit */
+
+ __pformat_putc( ('E' | (stream->flags & PFORMAT_XCASE)), stream );
+ __pformat_putc( in.exp_neg ? '-' : '+', stream );
+
+ for(int32_t trailing = 0; trailing < 3 - exp_strlen; trailing++)
+ __pformat_putc('0', stream);
+ __pformat_putchars(str_exp, exp_strlen,stream);
+}
+
+static
+void __pformat_float_decimal(_Decimal128 x, __pformat_t *stream ){
+ decimal128_decode in;
+ char str_exp[8];
+ char str_sig[40];
+ int floatclass = __fpclassifyd128(x);
+
+ /* precision control */
+ int prec = ( (stream->precision < 0) || (stream->precision > 38) ) ?
+ 6 : stream->precision;
+ int max_prec;
+
+ dec128_decode(&in,x);
+
+ if((floatclass & FP_INFINITE) == FP_INFINITE){
+ stream->precision = 3;
+ if(stream->flags & PFORMAT_SIGNED)
+ __pformat_putc( in.sig_neg ? '-' : '+', stream );
+ __pformat_puts( (stream->flags & PFORMAT_XCASE) ? "inf" : "INF", stream);
+ return;
+ } else if(floatclass & FP_NAN){
+ stream->precision = 3;
+ if(stream->flags & PFORMAT_SIGNED)
+ __pformat_putc( in.sig_neg ? '-' : '+', stream );
+ __pformat_puts( (stream->flags & PFORMAT_XCASE) ? "nan" : "NAN", stream);
+ return;
+ }
+
+ /* Stringify significand */
+ __bigint_to_string(
+ (uint32_t[4]){in.significand[0] & 0x0ffffffff, in.significand[0] >> 32, in.significand[1] & 0x0ffffffff, in.significand[1] >> 32 },
+ 4, str_sig, sizeof(str_sig));
+ __bigint_trim_leading_zeroes(str_sig,0);
+ max_prec = strlen(str_sig);
+
+ /* stringify exponent */
+ __bigint_to_string(
+ (uint32_t[1]) { in.exp_neg ? -in.exponent : in.exponent},
+ 1, str_exp, sizeof(str_exp));
+ __bigint_trim_leading_zeroes(str_exp,0);
+
+ int32_t decimal_place = max_prec + in.exponent;
+ int32_t sig_written = 0;
+
+ /*account for . +- */
+ for(int32_t spacers = 0; spacers < stream->width - decimal_place - prec - 2; spacers++)
+ __pformat_putc( ' ', stream );
+
+ if (in.sig_neg || (stream->flags & PFORMAT_SIGNED)) {
+ __pformat_putc( in.sig_neg ? '-' : '+', stream );
+ } else if(stream->width - decimal_place - prec - 1 > 0){
+ __pformat_putc( ' ', stream );
+ }
+
+ if(decimal_place <= 0){ /* easy mode */
+ __pformat_putc( '0', stream );
+ points:
+ __pformat_emit_radix_point(stream);
+ for(int32_t written = 0; written < prec; written++){
+ if(decimal_place < 0){ /* leading 0s */
+ decimal_place++;
+ __pformat_putc( '0', stream );
+ /* significand */
+ } else if ( sig_written < max_prec ){
+ __pformat_putc( str_sig[sig_written], stream );
+ sig_written++;
+ } else { /* trailing 0s */
+ __pformat_putc( '0', stream );
+ }
+ }
+ } else { /* hard mode */
+ for(; sig_written < decimal_place; sig_written++){
+ __pformat_putc( str_sig[sig_written], stream );
+ if(sig_written == max_prec - 1) break;
+ }
+ decimal_place -= sig_written;
+ for(; decimal_place > 0; decimal_place--)
+ __pformat_putc( '0', stream );
+ goto points;
+ }
+
+ return;
+}
+
+static
+void __pformat_gfloat_decimal(_Decimal128 x, __pformat_t *stream ){
+ int prec = ( (stream->precision < 0)) ?
+ 6 : stream->precision;
+ decimal128_decode in;
+ dec128_decode(&in,x);
+ if(in.exponent > prec) __pformat_efloat_decimal(x,stream);
+ else __pformat_float_decimal(x,stream);
+}
+
+#endif /* __ENABLE_DFP */
+
+static
+void __pformat_efloat( long double x, __pformat_t *stream )
+{
+ /* Handler for `%e' and `%E' format specifiers.
+ *
+ * This wraps calls to `__pformat_cvt()', `__pformat_emit_efloat()'
+ * and `__pformat_emit_inf_or_nan()', as appropriate, to achieve
+ * output in floating point format.
+ */
+ int sign, intlen; char *value;
+
+ /* Establish the precision for the displayed value, defaulting to six
+ * digits following the decimal point, if not explicitly specified.
+ */
+ if( stream->precision < 0 )
+ stream->precision = 6;
+
+ /* Encode the input value as ASCII, for display...
+ */
+ value = __pformat_ecvt( x, stream->precision + 1, &intlen, &sign );
+
+ if( intlen == PFORMAT_INFNAN )
+ /*
+ * handle cases of `infinity' or `not-a-number'...
+ */
+ __pformat_emit_inf_or_nan( sign, value, stream );
+
+ else
+ /* or otherwise, emit the formatted result.
+ */
+ __pformat_emit_efloat( sign, value, intlen, stream );
+
+ /* Clean up `__pformat_ecvt()' memory allocation for `value'...
+ */
+ __pformat_ecvt_release( value );
+}
+
+static
+void __pformat_gfloat( long double x, __pformat_t *stream )
+{
+ /* Handler for `%g' and `%G' format specifiers.
+ *
+ * This wraps calls to `__pformat_cvt()', `__pformat_emit_float()',
+ * `__pformat_emit_efloat()' and `__pformat_emit_inf_or_nan()', as
+ * appropriate, to achieve output in the more suitable of either
+ * fixed or floating point format.
+ */
+ int sign, intlen; char *value;
+
+ /* Establish the precision for the displayed value, defaulting to
+ * six significant digits, if not explicitly specified...
+ */
+ if( stream->precision < 0 )
+ stream->precision = 6;
+
+ /* or to a minimum of one digit, otherwise...
+ */
+ else if( stream->precision == 0 )
+ stream->precision = 1;
+
+ /* Encode the input value as ASCII, for display.
+ */
+ value = __pformat_ecvt( x, stream->precision, &intlen, &sign );
+
+ if( intlen == PFORMAT_INFNAN )
+ /*
+ * Handle cases of `infinity' or `not-a-number'.
+ */
+ __pformat_emit_inf_or_nan( sign, value, stream );
+
+ else if( (-4 < intlen) && (intlen <= stream->precision) )
+ {
+ /* Value lies in the acceptable range for fixed point output,
+ * (i.e. the exponent is no less than minus four, and the number
+ * of significant digits which precede the radix point is fewer
+ * than the least number which would overflow the field width,
+ * specified or implied by the established precision).
+ */
+ if( (stream->flags & PFORMAT_HASHED) == PFORMAT_HASHED )
+ /*
+ * The `#' flag is in effect...
+ * Adjust precision to retain the specified number of significant
+ * digits, with the proper number preceding the radix point, and
+ * the balance following it...
+ */
+ stream->precision -= intlen;
+
+ else
+ /* The `#' flag is not in effect...
+ * Here we adjust the precision to accommodate all digits which
+ * precede the radix point, but we truncate any balance following
+ * it, to suppress output of non-significant trailing zeros...
+ */
+ if( ((stream->precision = strlen( value ) - intlen) < 0)
+ /*
+ * This may require a compensating adjustment to the field
+ * width, to accommodate significant trailing zeros, which
+ * precede the radix point...
+ */
+ && (stream->width > 0) )
+ stream->width += stream->precision;
+
+ /* Now, we format the result as any other fixed point value.
+ */
+ __pformat_emit_float( sign, value, intlen, stream );
+
+ /* If there is any residual field width as yet unfilled, then
+ * we must be doing flush left justification, so pad out to the
+ * right hand field boundary.
+ */
+ while( stream->width-- > 0 )
+ __pformat_putc( '\x20', stream );
+ }
+
+ else
+ { /* Value lies outside the acceptable range for fixed point;
+ * one significant digit will precede the radix point, so we
+ * decrement the precision to retain only the appropriate number
+ * of additional digits following it, when we emit the result
+ * in floating point format.
+ */
+ if( (stream->flags & PFORMAT_HASHED) == PFORMAT_HASHED )
+ /*
+ * The `#' flag is in effect...
+ * Adjust precision to emit the specified number of significant
+ * digits, with one preceding the radix point, and the balance
+ * following it, retaining any non-significant trailing zeros
+ * which are required to exactly match the requested precision...
+ */
+ stream->precision--;
+
+ else
+ /* The `#' flag is not in effect...
+ * Adjust precision to emit only significant digits, with one
+ * preceding the radix point, and any others following it, but
+ * suppressing non-significant trailing zeros...
+ */
+ stream->precision = strlen( value ) - 1;
+
+ /* Now, we format the result as any other floating point value.
+ */
+ __pformat_emit_efloat( sign, value, intlen, stream );
+ }
+
+ /* Clean up `__pformat_ecvt()' memory allocation for `value'.
+ */
+ __pformat_ecvt_release( value );
+}
+
+static
+void __pformat_emit_xfloat( __pformat_fpreg_t value, __pformat_t *stream )
+{
+ /* Helper for emitting floating point data, originating as
+ * either `double' or `long double' type, as a hexadecimal
+ * representation of the argument value.
+ */
+ char buf[18 + 6], *p = buf;
+ __pformat_intarg_t exponent; short exp_width = 2;
+
+ /* The mantissa field of the argument value representation can
+ * accommodate at most 16 hexadecimal digits, of which one will
+ * be placed before the radix point, leaving at most 15 digits
+ * to satisfy any requested precision; thus...
+ */
+ if( (stream->precision >= 0) && (stream->precision < 15) )
+ {
+ /* When the user specifies a precision within this range,
+ * we want to adjust the mantissa, to retain just the number
+ * of digits required, rounding up when the high bit of the
+ * leftmost discarded digit is set; (mask of 0x08 accounts
+ * for exactly one digit discarded, shifting 4 bits per
+ * digit, with up to 14 additional digits, to consume the
+ * full availability of 15 precision digits).
+ *
+ * However, before we perform the rounding operation, we
+ * normalise the mantissa, shifting it to the left by as many
+ * bit positions may be necessary, until its highest order bit
+ * is set, thus preserving the maximum number of bits in the
+ * rounded result as possible.
+ */
+ while( value.__pformat_fpreg_mantissa < (LLONG_MAX + 1ULL) )
+ value.__pformat_fpreg_mantissa <<= 1;
+
+ /* We then shift the mantissa one bit position back to the
+ * right, to guard against possible overflow when the rounding
+ * adjustment is added.
+ */
+ value.__pformat_fpreg_mantissa >>= 1;
+
+ /* We now add the rounding adjustment, noting that to keep the
+ * 0x08 mask aligned with the shifted mantissa, we also need to
+ * shift it right by one bit initially, changing its starting
+ * value to 0x04...
+ */
+ value.__pformat_fpreg_mantissa += 0x04LL << (4 * (14 - stream->precision));
+ if( (value.__pformat_fpreg_mantissa & (LLONG_MAX + 1ULL)) == 0ULL )
+ /*
+ * When the rounding adjustment would not have overflowed,
+ * then we shift back to the left again, to fill the vacated
+ * bit we reserved to accommodate the carry.
+ */
+ value.__pformat_fpreg_mantissa <<= 1;
+
+ else
+ /* Otherwise the rounding adjustment would have overflowed,
+ * so the carry has already filled the vacated bit; the effect
+ * of this is equivalent to an increment of the exponent.
+ */
+ value.__pformat_fpreg_exponent++;
+
+ /* We now complete the rounding to the required precision, by
+ * shifting the unwanted digits out, from the right hand end of
+ * the mantissa.
+ */
+ value.__pformat_fpreg_mantissa >>= 4 * (15 - stream->precision);
+ }
+
+ /* Encode the significant digits of the mantissa in hexadecimal
+ * ASCII notation, ready for transfer to the output stream...
+ */
+ while( value.__pformat_fpreg_mantissa )
+ {
+ /* taking the rightmost digit in each pass...
+ */
+ unsigned c = value.__pformat_fpreg_mantissa & 0xF;
+ if( c == value.__pformat_fpreg_mantissa)
+ {
+ /* inserting the radix point, when we reach the last,
+ * (i.e. the most significant digit), unless we found no
+ * less significant digits, with no mandatory radix point
+ * inclusion, and no additional required precision...
+ */
+ if( (p > buf)
+ || (stream->flags & PFORMAT_HASHED) || (stream->precision > 0) )
+ {
+ /*
+ * Internally, we represent the radix point as an ASCII '.';
+ * we will replace it with any locale specific alternative,
+ * at the time of transfer to the ultimate destination.
+ */
+ *p++ = '.';
+ }
+
+ /* If the most significant hexadecimal digit of the encoded
+ * output value is greater than one, then the indicated value
+ * will appear too large, by an additional binary exponent
+ * corresponding to the number of higher order bit positions
+ * which it occupies...
+ */
+ while( value.__pformat_fpreg_mantissa > 1 )
+ {
+ /* so reduce the exponent value to compensate...
+ */
+ value.__pformat_fpreg_exponent--;
+ value.__pformat_fpreg_mantissa >>= 1;
+ }
+ }
+
+ else if( stream->precision > 0 )
+ /*
+ * we have not yet fulfilled the desired precision,
+ * and we have not yet found the most significant digit,
+ * so account for the current digit, within the field
+ * width required to meet the specified precision.
+ */
+ stream->precision--;
+
+ if( (c > 0) || (p > buf) || (stream->precision >= 0) )
+ {
+ /*
+ * Ignoring insignificant trailing zeros, (unless required to
+ * satisfy specified precision), store the current encoded digit
+ * into the pending output buffer, in LIFO order, and using the
+ * appropriate case for digits in the `A'..`F' range.
+ */
+ *p++ = c > 9 ? (c - 10 + 'A') | (stream->flags & PFORMAT_XCASE) : c + '0';
+ }
+ /* Shift out the current digit, (4-bit logical shift right),
+ * to align the next more significant digit to be extracted,
+ * and encoded in the next pass.
+ */
+ value.__pformat_fpreg_mantissa >>= 4;
+ }
+
+ if( p == buf )
+ {
+ /* Nothing has been queued for output...
+ * We need at least one zero, and possibly a radix point.
+ */
+ if( (stream->precision > 0) || (stream->flags & PFORMAT_HASHED) )
+ *p++ = '.';
+
+ *p++ = '0';
+ }
+
+ if( stream->width > 0 )
+ {
+ /* Adjust the user specified field width, to account for the
+ * number of digits minimally required, to display the encoded
+ * value, at the requested precision.
+ *
+ * FIXME: this uses the minimum number of digits possible for
+ * representation of the binary exponent, in strict conformance
+ * with C99 and POSIX specifications. Although there appears to
+ * be no Microsoft precedent for doing otherwise, we may wish to
+ * relate this to the `_get_output_format()' result, to maintain
+ * consistency with `%e', `%f' and `%g' styles.
+ */
+ int min_width = p - buf;
+ int exponent2 = value.__pformat_fpreg_exponent;
+
+ /* If we have not yet queued sufficient digits to fulfil the
+ * requested precision, then we must adjust the minimum width
+ * specification, to accommodate the additional digits which
+ * are required to do so.
+ */
+ if( stream->precision > 0 )
+ min_width += stream->precision;
+
+ /* Adjust the minimum width requirement, to accomodate the
+ * sign, radix indicator and at least one exponent digit...
+ */
+ min_width += stream->flags & PFORMAT_SIGNED ? 6 : 5;
+ while( (exponent2 = exponent2 / 10) != 0 )
+ {
+ /* and increase as required, if additional exponent digits
+ * are needed, also saving the exponent field width adjustment,
+ * for later use when that is emitted.
+ */
+ min_width++;
+ exp_width++;
+ }
+
+ if( stream->width > min_width )
+ {
+ /* When specified field width exceeds the minimum required,
+ * adjust to retain only the excess...
+ */
+ stream->width -= min_width;
+
+ /* and then emit any required left side padding spaces.
+ */
+ if( (stream->flags & PFORMAT_JUSTIFY) == 0 )
+ while( stream->width-- > 0 )
+ __pformat_putc( '\x20', stream );
+ }
+
+ else
+ /* Specified field width is insufficient; just ignore it!
+ */
+ stream->width = PFORMAT_IGNORE;
+ }
+
+ /* Emit the sign of the encoded value, as required...
+ */
+ if( stream->flags & PFORMAT_NEGATIVE )
+ /*
+ * this is mandatory, to indicate a negative value...
+ */
+ __pformat_putc( '-', stream );
+
+ else if( stream->flags & PFORMAT_POSITIVE )
+ /*
+ * but this is optional, for a positive value...
+ */
+ __pformat_putc( '+', stream );
+
+ else if( stream->flags & PFORMAT_ADDSPACE )
+ /*
+ * with this optional alternative.
+ */
+ __pformat_putc( '\x20', stream );
+
+ /* Prefix a `0x' or `0X' radix indicator to the encoded value,
+ * with case appropriate to the format specification.
+ */
+ __pformat_putc( '0', stream );
+ __pformat_putc( 'X' | (stream->flags & PFORMAT_XCASE), stream );
+
+ /* If the `0' flag is in effect...
+ * Zero padding, to fill out the field, goes here...
+ */
+ if( (stream->width > 0) && (stream->flags & PFORMAT_ZEROFILL) )
+ while( stream->width-- > 0 )
+ __pformat_putc( '0', stream );
+
+ /* Next, we emit the encoded value, without its exponent...
+ */
+ while( p > buf )
+ __pformat_emit_numeric_value( *--p, stream );
+
+ /* followed by any additional zeros needed to satisfy the
+ * precision specification...
+ */
+ while( stream->precision-- > 0 )
+ __pformat_putc( '0', stream );
+
+ /* then the exponent prefix, (C99 and POSIX specify `p'),
+ * in the case appropriate to the format specification...
+ */
+ __pformat_putc( 'P' | (stream->flags & PFORMAT_XCASE), stream );
+
+ /* and finally, the decimal representation of the binary exponent,
+ * as a signed value with mandatory sign displayed, in a field width
+ * adjusted to accommodate it, LEFT justified, with any additional
+ * right side padding remaining from the original field width.
+ */
+ stream->width += exp_width;
+ stream->flags |= PFORMAT_SIGNED;
+ /* sign extend */
+ exponent.__pformat_u128_t.t128.digits[1] = (value.__pformat_fpreg_exponent < 0) ? -1 : 0;
+ exponent.__pformat_u128_t.t128.digits[0] = value.__pformat_fpreg_exponent;
+ __pformat_int( exponent, stream );
+}
+
+static
+void __pformat_xldouble( long double x, __pformat_t *stream )
+{
+ /* Handler for `%La' and `%LA' format specifiers, (with argument
+ * value specified as `long double' type).
+ */
+ unsigned sign_bit = 0;
+ __pformat_fpreg_t z; z.__pformat_fpreg_ldouble_t = x;
+
+ /* First check for NaN; it is emitted unsigned...
+ */
+ if( isnan( x ) )
+ __pformat_emit_inf_or_nan( sign_bit, "NaN", stream );
+
+ else
+ { /* Capture the sign bit up-front, so we can show it correctly
+ * even when the argument value is zero or infinite.
+ */
+ if( (sign_bit = (z.__pformat_fpreg_exponent & 0x8000)) != 0 )
+ stream->flags |= PFORMAT_NEGATIVE;
+
+ /* Check for infinity, (positive or negative)...
+ */
+ if( isinf( x ) )
+ /*
+ * displaying the appropriately signed indicator,
+ * when appropriate.
+ */
+ __pformat_emit_inf_or_nan( sign_bit, "Inf", stream );
+
+ else
+ { /* The argument value is a representable number...
+ * extract the effective value of the biased exponent...
+ */
+ z.__pformat_fpreg_exponent &= 0x7FFF;
+ if( z.__pformat_fpreg_exponent == 0 )
+ {
+ /* A biased exponent value of zero means either a
+ * true zero value, if the mantissa field also has
+ * a zero value, otherwise...
+ */
+ if( z.__pformat_fpreg_mantissa != 0 )
+ {
+ /* ...this mantissa represents a subnormal value;
+ * adjust the exponent, while shifting the mantissa
+ * to the left, until its leading bit is 1.
+ */
+ z.__pformat_fpreg_exponent = 1-0x3FFF;
+ while( (z.__pformat_fpreg_mantissa & (LLONG_MAX + 1ULL)) == 0 )
+ {
+ z.__pformat_fpreg_mantissa <<= 1;
+ --z.__pformat_fpreg_exponent;
+ }
+ }
+ }
+ else
+ /* This argument represents a non-zero normal number;
+ * eliminate the bias from the exponent...
+ */
+ z.__pformat_fpreg_exponent -= 0x3FFF;
+
+ /* Finally, hand the adjusted representation off to the
+ * generalised hexadecimal floating point format handler...
+ */
+ __pformat_emit_xfloat( z, stream );
+ }
+ }
+}
+
+int
+__pformat (int flags, void *dest, int max, const APICHAR *fmt, va_list argv)
+{
+ int c;
+ int saved_errno = errno;
+
+ __pformat_t stream =
+ {
+ /* Create and initialise a format control block
+ * for this output request.
+ */
+ dest, /* output goes to here */
+ flags &= PFORMAT_TO_FILE | PFORMAT_NOLIMIT, /* only these valid initially */
+ PFORMAT_IGNORE, /* no field width yet */
+ PFORMAT_IGNORE, /* nor any precision spec */
+ PFORMAT_RPINIT, /* radix point uninitialised */
+ (wchar_t)(0), /* leave it unspecified */
+ 0,
+ (wchar_t)(0), /* leave it unspecified */
+ 0, /* zero output char count */
+ max, /* establish output limit */
+ -1 /* exponent chars preferred;
+ -1 means to be determined. */
+ };
+
+#ifdef __BUILD_WIDEAPI
+ const APICHAR *literal_string_start = NULL;
+#endif
+
+ format_scan: while( (c = *fmt++) != 0 )
+ {
+ /* Format string parsing loop...
+ * The entry point is labelled, so that we can return to the start state
+ * from within the inner `conversion specification' interpretation loop,
+ * as soon as a conversion specification has been resolved.
+ */
+ if( c == '%' )
+ {
+ /* Initiate parsing of a `conversion specification'...
+ */
+ __pformat_intarg_t argval;
+ __pformat_state_t state = PFORMAT_INIT;
+ __pformat_length_t length = PFORMAT_LENGTH_INT;
+
+ /* Save the current format scan position, so that we can backtrack
+ * in the event of encountering an invalid format specification...
+ */
+ const APICHAR *backtrack = fmt;
+
+ /* Restart capture for dynamic field width and precision specs...
+ */
+ int *width_spec = &stream.width;
+
+ #ifdef __BUILD_WIDEAPI
+ if (literal_string_start)
+ {
+ stream.width = stream.precision = PFORMAT_IGNORE;
+ __pformat_wputchars( literal_string_start, fmt - literal_string_start - 1, &stream );
+ literal_string_start = NULL;
+ }
+ #endif
+
+ /* Reset initial state for flags, width and precision specs...
+ */
+ stream.flags = flags;
+ stream.width = stream.precision = PFORMAT_IGNORE;
+
+ while( *fmt )
+ {
+ switch( c = *fmt++ )
+ {
+ /* Data type specifiers...
+ * All are terminal, so exit the conversion spec parsing loop
+ * with a `goto format_scan', thus resuming at the outer level
+ * in the regular format string parser.
+ */
+ case '%':
+ /*
+ * Not strictly a data type specifier...
+ * it simply converts as a literal `%' character.
+ *
+ * FIXME: should we require this to IMMEDIATELY follow the
+ * initial `%' of the "conversion spec"? (glibc `printf()'
+ * on GNU/Linux does NOT appear to require this, but POSIX
+ * and SUSv3 do seem to demand it).
+ */
+ #ifndef __BUILD_WIDEAPI
+ __pformat_putc( c, &stream );
+ #else
+ stream.width = stream.precision = PFORMAT_IGNORE;
+ __pformat_wputchars( L"%", 1, &stream );
+ #endif
+ goto format_scan;
+
+ case 'C':
+ /*
+ * Equivalent to `%lc'; set `length' accordingly,
+ * and simply fall through.
+ */
+ length = PFORMAT_LENGTH_LONG;
+
+ case 'c':
+ /*
+ * Single, (or single multibyte), character output...
+ *
+ * We handle these by copying the argument into our local
+ * `argval' buffer, and then we pass the address of that to
+ * either `__pformat_putchars()' or `__pformat_wputchars()',
+ * as appropriate, effectively formatting it as a string of
+ * the appropriate type, with a length of one.
+ *
+ * A side effect of this method of handling character data
+ * is that, if the user sets a precision of zero, then no
+ * character is actually emitted; we don't want that, so we
+ * forcibly override any user specified precision.
+ */
+ stream.precision = PFORMAT_IGNORE;
+
+ /* Now we invoke the appropriate format handler...
+ */
+ if( (length == PFORMAT_LENGTH_LONG)
+ || (length == PFORMAT_LENGTH_LLONG) )
+ {
+ /* considering any `long' type modifier as a reference to
+ * `wchar_t' data, (which is promoted to an `int' argument)...
+ */
+ wchar_t iargval = (wchar_t)(va_arg( argv, int ));
+ __pformat_wputchars( &iargval, 1, &stream );
+ }
+ else
+ { /* while anything else is simply taken as `char', (which
+ * is also promoted to an `int' argument)...
+ */
+ argval.__pformat_uchar_t = (unsigned char)(va_arg( argv, int ));
+ __pformat_putchars( (char *)(&argval), 1, &stream );
+ }
+ goto format_scan;
+
+ case 'S':
+ /*
+ * Equivalent to `%ls'; set `length' accordingly,
+ * and simply fall through.
+ */
+ length = PFORMAT_LENGTH_LONG;
+
+ case 's':
+ if( (length == PFORMAT_LENGTH_LONG)
+ || (length == PFORMAT_LENGTH_LLONG))
+ {
+ /* considering any `long' type modifier as a reference to
+ * a `wchar_t' string...
+ */
+ __pformat_wcputs( va_arg( argv, wchar_t * ), &stream );
+ }
+ else
+ /* This is normal string output;
+ * we simply invoke the appropriate handler...
+ */
+ __pformat_puts( va_arg( argv, char * ), &stream );
+ goto format_scan;
+ case 'm': /* strerror (errno) */
+ __pformat_puts (strerror (saved_errno), &stream);
+ goto format_scan;
+
+ case 'o':
+ case 'u':
+ case 'x':
+ case 'X':
+ /*
+ * Unsigned integer values; octal, decimal or hexadecimal format...
+ */
+#if __ENABLE_PRINTF128
+ argval.__pformat_u128_t.t128.digits[1] = 0LL; /* no sign extend needed */
+ if( length == PFORMAT_LENGTH_LLONG128 )
+ argval.__pformat_u128_t.t128 = va_arg( argv, __tI128 );
+ else
+#endif
+ if( length == PFORMAT_LENGTH_LLONG ) {
+ /*
+ * with an `unsigned long long' argument, which we
+ * process `as is'...
+ */
+ argval.__pformat_ullong_t = va_arg( argv, unsigned long long );
+
+ } else if( length == PFORMAT_LENGTH_LONG ) {
+ /*
+ * or with an `unsigned long', which we promote to
+ * `unsigned long long'...
+ */
+ argval.__pformat_ullong_t = va_arg( argv, unsigned long );
+
+ } else
+ { /* or for any other size, which will have been promoted
+ * to `unsigned int', we select only the appropriately sized
+ * least significant segment, and again promote to the same
+ * size as `unsigned long long'...
+ */
+ argval.__pformat_ullong_t = va_arg( argv, unsigned int );
+ if( length == PFORMAT_LENGTH_SHORT )
+ /*
+ * from `unsigned short'...
+ */
+ argval.__pformat_ullong_t = argval.__pformat_ushort_t;
+
+ else if( length == PFORMAT_LENGTH_CHAR )
+ /*
+ * or even from `unsigned char'...
+ */
+ argval.__pformat_ullong_t = argval.__pformat_uchar_t;
+ }
+
+ /* so we can pass any size of argument to either of two
+ * common format handlers...
+ */
+ if( c == 'u' )
+ /*
+ * depending on whether output is to be encoded in
+ * decimal format...
+ */
+ __pformat_int( argval, &stream );
+
+ else
+ /* or in octal or hexadecimal format...
+ */
+ __pformat_xint( c, argval, &stream );
+
+ goto format_scan;
+
+ case 'd':
+ case 'i':
+ /*
+ * Signed integer values; decimal format...
+ * This is similar to `u', but must process `argval' as signed,
+ * and be prepared to handle negative numbers.
+ */
+ stream.flags |= PFORMAT_NEGATIVE;
+#if __ENABLE_PRINTF128
+ if( length == PFORMAT_LENGTH_LLONG128 ) {
+ argval.__pformat_u128_t.t128 = va_arg( argv, __tI128 );
+ goto skip_sign; /* skip sign extend */
+ } else
+#endif
+ if( length == PFORMAT_LENGTH_LLONG ){
+ /*
+ * The argument is a `long long' type...
+ */
+ argval.__pformat_u128_t.t128.digits[0] = va_arg( argv, long long );
+ } else if( length == PFORMAT_LENGTH_LONG ) {
+ /*
+ * or here, a `long' type...
+ */
+ argval.__pformat_u128_t.t128.digits[0] = va_arg( argv, long );
+ } else
+ { /* otherwise, it's an `int' type...
+ */
+ argval.__pformat_u128_t.t128.digits[0] = va_arg( argv, int );
+ if( length == PFORMAT_LENGTH_SHORT )
+ /*
+ * but it was promoted from a `short' type...
+ */
+ argval.__pformat_u128_t.t128.digits[0] = argval.__pformat_short_t;
+ else if( length == PFORMAT_LENGTH_CHAR )
+ /*
+ * or even from a `char' type...
+ */
+ argval.__pformat_u128_t.t128.digits[0] = argval.__pformat_char_t;
+ }
+
+ /* In any case, all share a common handler...
+ */
+ argval.__pformat_u128_t.t128.digits[1] = (argval.__pformat_llong_t < 0) ? -1LL : 0LL;
+#if __ENABLE_PRINTF128
+ skip_sign:
+#endif
+ __pformat_int( argval, &stream );
+ goto format_scan;
+
+ case 'p':
+ /*
+ * Pointer argument; format as hexadecimal, subject to...
+ */
+ if( (state == PFORMAT_INIT) && (stream.flags == flags) )
+ {
+ /* Here, the user didn't specify any particular
+ * formatting attributes. We must choose a default
+ * which will be compatible with Microsoft's (broken)
+ * scanf() implementation, (i.e. matching the default
+ * used by MSVCRT's printf(), which appears to resemble
+ * "%0.8X" for 32-bit pointers); in particular, we MUST
+ * NOT adopt a GNU-like format resembling "%#x", because
+ * Microsoft's scanf() will choke on the "0x" prefix.
+ */
+ stream.flags |= PFORMAT_ZEROFILL;
+ stream.precision = 2 * sizeof( uintptr_t );
+ }
+ argval.__pformat_u128_t.t128.digits[0] = va_arg( argv, uintptr_t );
+ argval.__pformat_u128_t.t128.digits[1] = 0;
+ __pformat_xint( 'x', argval, &stream );
+ goto format_scan;
+
+ case 'e':
+ /*
+ * Floating point format, with lower case exponent indicator
+ * and lower case `inf' or `nan' representation when required;
+ * select lower case mode, and simply fall through...
+ */
+ stream.flags |= PFORMAT_XCASE;
+
+ case 'E':
+ /*
+ * Floating point format, with upper case exponent indicator
+ * and upper case `INF' or `NAN' representation when required,
+ * (or lower case for all of these, on fall through from above);
+ * select lower case mode, and simply fall through...
+ */
+#ifdef __ENABLE_DFP
+ if( stream.flags & PFORMAT_DECIM32 )
+ /* Is a 32bit decimal float */
+ __pformat_efloat_decimal((_Decimal128)va_arg( argv, _Decimal32 ), &stream );
+ else if( stream.flags & PFORMAT_DECIM64 )
+ /*
+ * Is a 64bit decimal float
+ */
+ __pformat_efloat_decimal((_Decimal128)va_arg( argv, _Decimal64 ), &stream );
+ else if( stream.flags & PFORMAT_DECIM128 )
+ /*
+ * Is a 128bit decimal float
+ */
+ __pformat_efloat_decimal(va_arg( argv, _Decimal128 ), &stream );
+ else
+#endif /* __ENABLE_DFP */
+ if( stream.flags & PFORMAT_LDOUBLE )
+ /*
+ * for a `long double' argument...
+ */
+ __pformat_efloat( va_arg( argv, long double ), &stream );
+
+ else
+ /* or just a `double', which we promote to `long double',
+ * so the two may share a common format handler.
+ */
+ __pformat_efloat( (long double)(va_arg( argv, double )), &stream );
+
+ goto format_scan;
+
+ case 'f':
+ /*
+ * Fixed point format, using lower case for `inf' and
+ * `nan', when appropriate; select lower case mode, and
+ * simply fall through...
+ */
+ stream.flags |= PFORMAT_XCASE;
+
+ case 'F':
+ /*
+ * Fixed case format using upper case, or lower case on
+ * fall through from above, for `INF' and `NAN'...
+ */
+#ifdef __ENABLE_DFP
+ if( stream.flags & PFORMAT_DECIM32 )
+ /* Is a 32bit decimal float */
+ __pformat_float_decimal((_Decimal128)va_arg( argv, _Decimal32 ), &stream );
+ else if( stream.flags & PFORMAT_DECIM64 )
+ /*
+ * Is a 64bit decimal float
+ */
+ __pformat_float_decimal((_Decimal128)va_arg( argv, _Decimal64 ), &stream );
+ else if( stream.flags & PFORMAT_DECIM128 )
+ /*
+ * Is a 128bit decimal float
+ */
+ __pformat_float_decimal(va_arg( argv, _Decimal128 ), &stream );
+ else
+#endif /* __ENABLE_DFP */
+ if( stream.flags & PFORMAT_LDOUBLE )
+ /*
+ * for a `long double' argument...
+ */
+ __pformat_float( va_arg( argv, long double ), &stream );
+
+ else
+ /* or just a `double', which we promote to `long double',
+ * so the two may share a common format handler.
+ */
+ __pformat_float( (long double)(va_arg( argv, double )), &stream );
+
+ goto format_scan;
+
+ case 'g':
+ /*
+ * Generalised floating point format, with lower case
+ * exponent indicator when required; select lower case
+ * mode, and simply fall through...
+ */
+ stream.flags |= PFORMAT_XCASE;
+
+ case 'G':
+ /*
+ * Generalised floating point format, with upper case,
+ * or on fall through from above, with lower case exponent
+ * indicator when required...
+ */
+#ifdef __ENABLE_DFP
+ if( stream.flags & PFORMAT_DECIM32 )
+ /* Is a 32bit decimal float */
+ __pformat_gfloat_decimal((_Decimal128)va_arg( argv, _Decimal32 ), &stream );
+ else if( stream.flags & PFORMAT_DECIM64 )
+ /*
+ * Is a 64bit decimal float
+ */
+ __pformat_gfloat_decimal((_Decimal128)va_arg( argv, _Decimal64 ), &stream );
+ else if( stream.flags & PFORMAT_DECIM128 )
+ /*
+ * Is a 128bit decimal float
+ */
+ __pformat_gfloat_decimal(va_arg( argv, _Decimal128 ), &stream );
+ else
+#endif /* __ENABLE_DFP */
+ if( stream.flags & PFORMAT_LDOUBLE )
+ /*
+ * for a `long double' argument...
+ */
+ __pformat_gfloat( va_arg( argv, long double ), &stream );
+
+ else
+ /* or just a `double', which we promote to `long double',
+ * so the two may share a common format handler.
+ */
+ __pformat_gfloat( (long double)(va_arg( argv, double )), &stream );
+
+ goto format_scan;
+
+ case 'a':
+ /*
+ * Hexadecimal floating point format, with lower case radix
+ * and exponent indicators; select the lower case mode, and
+ * fall through...
+ */
+ stream.flags |= PFORMAT_XCASE;
+
+ case 'A':
+ /*
+ * Hexadecimal floating point format; handles radix and
+ * exponent indicators in either upper or lower case...
+ */
+ if( stream.flags & PFORMAT_LDOUBLE )
+ /*
+ * with a `long double' argument...
+ */
+ __pformat_xldouble( va_arg( argv, long double ), &stream );
+
+ else
+ /* or just a `double'.
+ */
+ __pformat_xldouble( (long double)(va_arg( argv, double )), &stream );
+
+ goto format_scan;
+
+ case 'n':
+ /*
+ * Save current output character count...
+ */
+ if( length == PFORMAT_LENGTH_CHAR )
+ /*
+ * to a signed `char' destination...
+ */
+ *va_arg( argv, char * ) = stream.count;
+
+ else if( length == PFORMAT_LENGTH_SHORT )
+ /*
+ * or to a signed `short'...
+ */
+ *va_arg( argv, short * ) = stream.count;
+
+ else if( length == PFORMAT_LENGTH_LONG )
+ /*
+ * or to a signed `long'...
+ */
+ *va_arg( argv, long * ) = stream.count;
+
+ else if( length == PFORMAT_LENGTH_LLONG )
+ /*
+ * or to a signed `long long'...
+ */
+ *va_arg( argv, long long * ) = stream.count;
+
+ else
+ /*
+ * or, by default, to a signed `int'.
+ */
+ *va_arg( argv, int * ) = stream.count;
+
+ goto format_scan;
+
+ /* Argument length modifiers...
+ * These are non-terminal; each sets the format parser
+ * into the PFORMAT_END state, and ends with a `break'.
+ */
+ case 'h':
+ /*
+ * Interpret the argument as explicitly of a `short'
+ * or `char' data type, truncated from the standard
+ * length defined for integer promotion.
+ */
+ if( *fmt == 'h' )
+ {
+ /* Modifier is `hh'; data type is `char' sized...
+ * Skip the second `h', and set length accordingly.
+ */
+ ++fmt;
+ length = PFORMAT_LENGTH_CHAR;
+ }
+
+ else
+ /* Modifier is `h'; data type is `short' sized...
+ */
+ length = PFORMAT_LENGTH_SHORT;
+
+ state = PFORMAT_END;
+ break;
+
+ case 'j':
+ /*
+ * Interpret the argument as being of the same size as
+ * a `intmax_t' entity...
+ */
+ length = __pformat_arg_length( intmax_t );
+ state = PFORMAT_END;
+ break;
+
+# ifdef _WIN32
+
+ case 'I':
+ /*
+ * The MSVCRT implementation of the printf() family of
+ * functions explicitly uses...
+ */
+#ifdef __ENABLE_PRINTF128
+ if( (fmt[0] == '1') && (fmt[1] == '2') && (fmt[2] == '8')){
+ length = PFORMAT_LENGTH_LLONG128;
+ fmt += 3;
+ } else
+#endif
+ if( (fmt[0] == '6') && (fmt[1] == '4') )
+ {
+ /* I64' instead of `ll',
+ * when referring to `long long' integer types...
+ */
+ length = PFORMAT_LENGTH_LLONG;
+ fmt += 2;
+ } else
+ if( (fmt[0] == '3') && (fmt[1] == '2') )
+ {
+ /* and `I32' instead of `l',
+ * when referring to `long' integer types...
+ */
+ length = PFORMAT_LENGTH_LONG;
+ fmt += 2;
+ }
+
+ else
+ /* or unqualified `I' instead of `t' or `z',
+ * when referring to `ptrdiff_t' or `size_t' entities;
+ * (we will choose to map it to `ptrdiff_t').
+ */
+ length = __pformat_arg_length( ptrdiff_t );
+
+ state = PFORMAT_END;
+ break;
+
+# endif
+
+#ifdef __ENABLE_DFP
+ case 'H':
+ stream.flags |= PFORMAT_DECIM32;
+ state = PFORMAT_END;
+ break;
+
+ case 'D':
+ /*
+ * Interpret the argument as explicitly of a
+ * `_Decimal64' or `_Decimal128' data type.
+ */
+ if( *fmt == 'D' )
+ {
+ /* Modifier is `DD'; data type is `_Decimal128' sized...
+ * Skip the second `D', and set length accordingly.
+ */
+ ++fmt;
+ stream.flags |= PFORMAT_DECIM128;
+ }
+
+ else
+ /* Modifier is `D'; data type is `_Decimal64' sized...
+ */
+ stream.flags |= PFORMAT_DECIM64;
+
+ state = PFORMAT_END;
+ break;
+#endif /* __ENABLE_DFP */
+ case 'l':
+ /*
+ * Interpret the argument as explicitly of a
+ * `long' or `long long' data type.
+ */
+ if( *fmt == 'l' )
+ {
+ /* Modifier is `ll'; data type is `long long' sized...
+ * Skip the second `l', and set length accordingly.
+ */
+ ++fmt;
+ length = PFORMAT_LENGTH_LLONG;
+ }
+
+ else
+ /* Modifier is `l'; data type is `long' sized...
+ */
+ length = PFORMAT_LENGTH_LONG;
+
+ state = PFORMAT_END;
+ break;
+
+ case 'L':
+ /*
+ * Identify the appropriate argument as a `long double',
+ * when associated with `%a', `%A', `%e', `%E', `%f', `%F',
+ * `%g' or `%G' format specifications.
+ */
+ stream.flags |= PFORMAT_LDOUBLE;
+ state = PFORMAT_END;
+ break;
+
+ case 't':
+ /*
+ * Interpret the argument as being of the same size as
+ * a `ptrdiff_t' entity...
+ */
+ length = __pformat_arg_length( ptrdiff_t );
+ state = PFORMAT_END;
+ break;
+
+ case 'z':
+ /*
+ * Interpret the argument as being of the same size as
+ * a `size_t' entity...
+ */
+ length = __pformat_arg_length( size_t );
+ state = PFORMAT_END;
+ break;
+
+ /* Precision indicator...
+ * May appear once only; it must precede any modifier
+ * for argument length, or any data type specifier.
+ */
+ case '.':
+ if( state < PFORMAT_GET_PRECISION )
+ {
+ /* We haven't seen a precision specification yet,
+ * so initialise it to zero, (in case no digits follow),
+ * and accept any following digits as the precision.
+ */
+ stream.precision = 0;
+ width_spec = &stream.precision;
+ state = PFORMAT_GET_PRECISION;
+ }
+
+ else
+ /* We've already seen a precision specification,
+ * so this is just junk; proceed to end game.
+ */
+ state = PFORMAT_END;
+
+ /* Either way, we must not fall through here.
+ */
+ break;
+
+ /* Variable field width, or precision specification,
+ * derived from the argument list...
+ */
+ case '*':
+ /*
+ * When this appears...
+ */
+ if( width_spec
+ && ((state == PFORMAT_INIT) || (state == PFORMAT_GET_PRECISION)) )
+ {
+ /* in proper context; assign to field width
+ * or precision, as appropriate.
+ */
+ if( (*width_spec = va_arg( argv, int )) < 0 )
+ {
+ /* Assigned value was negative...
+ */
+ if( state == PFORMAT_INIT )
+ {
+ /* For field width, this is equivalent to
+ * a positive value with the `-' flag...
+ */
+ stream.flags |= PFORMAT_LJUSTIFY;
+ stream.width = -stream.width;
+ }
+
+ else
+ /* while as a precision specification,
+ * it should simply be ignored.
+ */
+ stream.precision = PFORMAT_IGNORE;
+ }
+ }
+
+ else
+ /* out of context; give up on width and precision
+ * specifications for this conversion.
+ */
+ state = PFORMAT_END;
+
+ /* Mark as processed...
+ * we must not see `*' again, in this context.
+ */
+ width_spec = NULL;
+ break;
+
+ /* Formatting flags...
+ * Must appear while in the PFORMAT_INIT state,
+ * and are non-terminal, so again, end with `break'.
+ */
+ case '#':
+ /*
+ * Select alternate PFORMAT_HASHED output style.
+ */
+ if( state == PFORMAT_INIT )
+ stream.flags |= PFORMAT_HASHED;
+ break;
+
+ case '+':
+ /*
+ * Print a leading sign with numeric output,
+ * for both positive and negative values.
+ */
+ if( state == PFORMAT_INIT )
+ stream.flags |= PFORMAT_POSITIVE;
+ break;
+
+ case '-':
+ /*
+ * Select left justification of displayed output
+ * data, within the output field width, instead of
+ * the default flush right justification.
+ */
+ if( state == PFORMAT_INIT )
+ stream.flags |= PFORMAT_LJUSTIFY;
+ break;
+
+ case '\'':
+ /*
+ * This is an XSI extension to the POSIX standard,
+ * which we do not support, at present.
+ */
+ if (state == PFORMAT_INIT)
+ {
+ stream.flags |= PFORMAT_GROUPED; /* $$$$ */
+ int len; wchar_t rpchr; mbstate_t cstate;
+ memset (&cstate, 0, sizeof(state));
+ if ((len = mbrtowc( &rpchr, localeconv()->thousands_sep, 16, &cstate)) > 0)
+ stream.thousands_chr = rpchr;
+ stream.thousands_chr_len = len;
+ }
+ break;
+
+ case '\x20':
+ /*
+ * Reserve a single space, within the output field,
+ * for display of the sign of signed data; this will
+ * be occupied by the minus sign, if the data value
+ * is negative, or by a plus sign if the data value
+ * is positive AND the `+' flag is also present, or
+ * by a space otherwise. (Technically, this flag
+ * is redundant, if the `+' flag is present).
+ */
+ if( state == PFORMAT_INIT )
+ stream.flags |= PFORMAT_ADDSPACE;
+ break;
+
+ case '0':
+ /*
+ * May represent a flag, to activate the `pad with zeros'
+ * option, or it may simply be a digit in a width or in a
+ * precision specification...
+ */
+ if( state == PFORMAT_INIT )
+ {
+ /* This is the flag usage...
+ */
+ stream.flags |= PFORMAT_ZEROFILL;
+ break;
+ }
+
+ default:
+ /*
+ * If we didn't match anything above, then we will check
+ * for digits, which we may accumulate to generate field
+ * width or precision specifications...
+ */
+ if( (state < PFORMAT_END) && ('9' >= c) && (c >= '0') )
+ {
+ if( state == PFORMAT_INIT )
+ /*
+ * Initial digits explicitly relate to field width...
+ */
+ state = PFORMAT_SET_WIDTH;
+
+ else if( state == PFORMAT_GET_PRECISION )
+ /*
+ * while those following a precision indicator
+ * explicitly relate to precision.
+ */
+ state = PFORMAT_SET_PRECISION;
+
+ if( width_spec )
+ {
+ /* We are accepting a width or precision specification...
+ */
+ if( *width_spec < 0 )
+ /*
+ * and accumulation hasn't started yet; we simply
+ * initialise the accumulator with the current digit
+ * value, converting from ASCII to decimal.
+ */
+ *width_spec = c - '0';
+
+ else
+ /* Accumulation has already started; we perform a
+ * `leftwise decimal digit shift' on the accumulator,
+ * (i.e. multiply it by ten), then add the decimal
+ * equivalent value of the current digit.
+ */
+ *width_spec = *width_spec * 10 + c - '0';
+ }
+ }
+
+ else
+ {
+ /* We found a digit out of context, or some other character
+ * with no designated meaning; reject this format specification,
+ * backtrack, and emit it as literal text...
+ */
+ fmt = backtrack;
+ #ifndef __BUILD_WIDEAPI
+ __pformat_putc( '%', &stream );
+ #else
+ stream.width = stream.precision = PFORMAT_IGNORE;
+ __pformat_wputchars( L"%", 1, &stream );
+ #endif
+ goto format_scan;
+ }
+ }
+ }
+ }
+
+ else
+ /* We just parsed a character which is not included within any format
+ * specification; we simply emit it as a literal.
+ */
+ #ifndef __BUILD_WIDEAPI
+ __pformat_putc( c, &stream );
+ #else
+ if (literal_string_start == NULL)
+ literal_string_start = fmt - 1;
+ #endif
+ }
+
+ /* When we have fully dispatched the format string, the return value is the
+ * total number of bytes we transferred to the output destination.
+ */
+#ifdef __BUILD_WIDEAPI
+ if (literal_string_start)
+ {
+ stream.width = stream.precision = PFORMAT_IGNORE;
+ __pformat_wputchars( literal_string_start, fmt - literal_string_start - 1, &stream );
+ }
+#endif
+
+ return stream.count;
+}
+
+/* $RCSfile: pformat.c,v $Revision: 1.9 $: end of file */
+
libc/mingw/stdio/mingw_pformat.h
@@ -0,0 +1,99 @@
+#ifndef PFORMAT_H
+/*
+ * pformat.h
+ *
+ * $Id: pformat.h,v 1.1 2008/07/28 23:24:20 keithmarshall Exp $
+ *
+ * A private header, defining the `pformat' API; it is to be included
+ * in each compilation unit implementing any of the `printf' family of
+ * functions, but serves no useful purpose elsewhere.
+ *
+ * Written by Keith Marshall <keithmarshall@users.sourceforge.net>
+ *
+ * This is free software. You may redistribute and/or modify it as you
+ * see fit, without restriction of copyright.
+ *
+ * This software is provided "as is", in the hope that it may be useful,
+ * but WITHOUT WARRANTY OF ANY KIND, not even any implied warranty of
+ * MERCHANTABILITY, nor of FITNESS FOR ANY PARTICULAR PURPOSE. At no
+ * time will the author accept any form of liability for any damages,
+ * however caused, resulting from the use of this software.
+ */
+#define PFORMAT_H
+
+/* The following macros reproduce definitions from _mingw.h,
+ * so that compilation will not choke, if using any compiler
+ * other than the MinGW implementation of GCC.
+ */
+#ifndef __cdecl
+# ifdef __GNUC__
+# define __cdecl __attribute__((__cdecl__))
+# else
+# define __cdecl
+# endif
+#endif
+
+#ifndef __MINGW_GNUC_PREREQ
+# if defined __GNUC__ && defined __GNUC_MINOR__
+# define __MINGW_GNUC_PREREQ( major, minor )\
+ (__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)))
+# else
+# define __MINGW_GNUC_PREREQ( major, minor )
+# endif
+#endif
+
+#ifndef __MINGW_NOTHROW
+# if __MINGW_GNUC_PREREQ( 3, 3 )
+# define __MINGW_NOTHROW __attribute__((__nothrow__))
+# else
+# define __MINGW_NOTHROW
+# endif
+#endif
+
+#ifdef __BUILD_WIDEAPI
+#define APICHAR wchar_t
+#else
+#define APICHAR char
+#endif
+
+/* The following are the declarations specific to the `pformat' API...
+ */
+#define PFORMAT_TO_FILE 0x2000
+#define PFORMAT_NOLIMIT 0x4000
+
+#if defined(__MINGW32__) || defined(__MINGW64__)
+ /*
+ * Map MinGW specific function names, for use in place of the generic
+ * implementation defined equivalent function names.
+ */
+#ifdef __BUILD_WIDEAPI
+# define __pformat __mingw_wpformat
+#define __fputc(X,STR) fputwc((wchar_t) (X), (STR))
+
+# define __printf __mingw_wprintf
+# define __fprintf __mingw_fwprintf
+# define __sprintf __mingw_swprintf
+# define __snprintf __mingw_snwprintf
+
+# define __vprintf __mingw_vwprintf
+# define __vfprintf __mingw_vfwprintf
+# define __vsprintf __mingw_vswprintf
+# define __vsnprintf __mingw_vsnwprintf
+#else
+# define __pformat __mingw_pformat
+#define __fputc(X,STR) fputc((X), (STR))
+
+# define __printf __mingw_printf
+# define __fprintf __mingw_fprintf
+# define __sprintf __mingw_sprintf
+# define __snprintf __mingw_snprintf
+
+# define __vprintf __mingw_vprintf
+# define __vfprintf __mingw_vfprintf
+# define __vsprintf __mingw_vsprintf
+# define __vsnprintf __mingw_vsnprintf
+#endif /* __BUILD_WIDEAPI */
+#endif
+
+int __cdecl __pformat(int, void *, int, const APICHAR *, va_list) __MINGW_NOTHROW;
+#endif /* !defined PFORMAT_H */
libc/mingw/stdio/mingw_pformatw.c
@@ -0,0 +1,9 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __BUILD_WIDEAPI 1
+
+#include "mingw_pformat.c"
+
libc/mingw/stdio/mingw_printf.c
@@ -0,0 +1,59 @@
+/* printf.c
+ *
+ * $Id: printf.c,v 1.1 2008/08/11 22:41:55 keithmarshall Exp $
+ *
+ * Provides an implementation of the "printf" function, conforming
+ * generally to C99 and SUSv3/POSIX specifications, with extensions
+ * to support Microsoft's non-standard format specifications. This
+ * is included in libmingwex.a, whence it may replace the Microsoft
+ * function of the same name.
+ *
+ * Written by Keith Marshall <keithmarshall@users.sourceforge.net>
+ *
+ * This implementation of "printf" will normally be invoked by calling
+ * "__mingw_printf()" in preference to a direct reference to "printf()"
+ * itself; this leaves the MSVCRT implementation as the default, which
+ * will be deployed when user code invokes "print()". Users who then
+ * wish to use this implementation may either call "__mingw_printf()"
+ * directly, or may use conditional preprocessor defines, to redirect
+ * references to "printf()" to "__mingw_printf()".
+ *
+ * Compiling this module with "-D INSTALL_AS_DEFAULT" will change this
+ * recommended convention, such that references to "printf()" in user
+ * code will ALWAYS be redirected to "__mingw_printf()"; if this option
+ * is adopted, then users wishing to use the MSVCRT implementation of
+ * "printf()" will be forced to use a "back-door" mechanism to do so.
+ * Such a "back-door" mechanism is provided with MinGW, allowing the
+ * MSVCRT implementation to be called as "__msvcrt_printf()"; however,
+ * since users may not expect this behaviour, a standard libmingwex.a
+ * installation does not employ this option.
+ *
+ *
+ * This is free software. You may redistribute and/or modify it as you
+ * see fit, without restriction of copyright.
+ *
+ * This software is provided "as is", in the hope that it may be useful,
+ * but WITHOUT WARRANTY OF ANY KIND, not even any implied warranty of
+ * MERCHANTABILITY, nor of FITNESS FOR ANY PARTICULAR PURPOSE. At no
+ * time will the author accept any form of liability for any damages,
+ * however caused, resulting from the use of this software.
+ *
+ */
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "mingw_pformat.h"
+
+int __cdecl __printf(const APICHAR *, ...) __MINGW_NOTHROW;
+
+int __cdecl __printf(const APICHAR *fmt, ...)
+{
+ register int retval;
+ va_list argv; va_start( argv, fmt );
+ _lock_file( stdout );
+ retval = __pformat( PFORMAT_TO_FILE | PFORMAT_NOLIMIT, stdout, 0, fmt, argv );
+ _unlock_file( stdout );
+ va_end( argv );
+ return retval;
+}
+
libc/mingw/stdio/mingw_printfw.c
@@ -0,0 +1,9 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __BUILD_WIDEAPI 1
+
+#include "mingw_printf.c"
+
libc/mingw/stdio/mingw_scanf.c
@@ -0,0 +1,28 @@
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern int __mingw_vfscanf (FILE *stream, const char *format, va_list argp);
+
+int __mingw_scanf (const char *format, ...);
+int __mingw_vscanf (const char *format, va_list argp);
+
+int
+__mingw_scanf (const char *format, ...)
+{
+ va_list argp;
+ int r;
+
+ va_start (argp, format);
+ r = __mingw_vfscanf (stdin, format, argp);
+ va_end (argp);
+
+ return r;
+}
+
+int
+__mingw_vscanf (const char *format, va_list argp)
+{
+ return __mingw_vfscanf (stdin, format, argp);
+}
+
libc/mingw/stdio/mingw_snprintf.c
@@ -0,0 +1,40 @@
+/* snprintf.c
+ *
+ * $Id: snprintf.c,v 1.3 2008/07/28 23:24:20 keithmarshall Exp $
+ *
+ * Provides an implementation of the "snprintf" function, conforming
+ * generally to C99 and SUSv3/POSIX specifications, with extensions
+ * to support Microsoft's non-standard format specifications. This
+ * is included in libmingwex.a, replacing the redirection through
+ * libmoldnames.a, to the MSVCRT standard "_snprintf" function; (the
+ * standard MSVCRT function remains available, and may be invoked
+ * directly, using this fully qualified form of its name).
+ *
+ * Written by Keith Marshall <keithmarshall@users.sourceforge.net>
+ *
+ * This is free software. You may redistribute and/or modify it as you
+ * see fit, without restriction of copyright.
+ *
+ * This software is provided "as is", in the hope that it may be useful,
+ * but WITHOUT WARRANTY OF ANY KIND, not even any implied warranty of
+ * MERCHANTABILITY, nor of FITNESS FOR ANY PARTICULAR PURPOSE. At no
+ * time will the author accept any form of liability for any damages,
+ * however caused, resulting from the use of this software.
+ *
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "mingw_pformat.h"
+
+int __cdecl __snprintf (APICHAR *, size_t, const APICHAR *fmt, ...) __MINGW_NOTHROW;
+int __cdecl __vsnprintf (APICHAR *, size_t, const APICHAR *fmt, va_list) __MINGW_NOTHROW;
+
+int __cdecl __snprintf(APICHAR *buf, size_t length, const APICHAR *fmt, ...)
+{
+ va_list argv; va_start( argv, fmt );
+ register int retval = __vsnprintf( buf, length, fmt, argv );
+ va_end( argv );
+ return retval;
+}
libc/mingw/stdio/mingw_snprintfw.c
@@ -0,0 +1,9 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __BUILD_WIDEAPI 1
+
+#include "mingw_snprintf.c"
+
libc/mingw/stdio/mingw_sprintf.c
@@ -0,0 +1,56 @@
+/* sprintf.c
+ *
+ * $Id: sprintf.c,v 1.1 2008/08/11 22:41:55 keithmarshall Exp $
+ *
+ * Provides an implementation of the "sprintf" function, conforming
+ * generally to C99 and SUSv3/POSIX specifications, with extensions
+ * to support Microsoft's non-standard format specifications. This
+ * is included in libmingwex.a, whence it may replace the Microsoft
+ * function of the same name.
+ *
+ * Written by Keith Marshall <keithmarshall@users.sourceforge.net>
+ *
+ * This implementation of "sprintf" will normally be invoked by calling
+ * "__mingw_sprintf()" in preference to a direct reference to "sprintf()"
+ * itself; this leaves the MSVCRT implementation as the default, which
+ * will be deployed when user code invokes "sprint()". Users who then
+ * wish to use this implementation may either call "__mingw_sprintf()"
+ * directly, or may use conditional preprocessor defines, to redirect
+ * references to "sprintf()" to "__mingw_sprintf()".
+ *
+ * Compiling this module with "-D INSTALL_AS_DEFAULT" will change this
+ * recommended convention, such that references to "sprintf()" in user
+ * code will ALWAYS be redirected to "__mingw_sprintf()"; if this option
+ * is adopted, then users wishing to use the MSVCRT implementation of
+ * "sprintf()" will be forced to use a "back-door" mechanism to do so.
+ * Such a "back-door" mechanism is provided with MinGW, allowing the
+ * MSVCRT implementation to be called as "__msvcrt_sprintf()"; however,
+ * since users may not expect this behaviour, a standard libmingwex.a
+ * installation does not employ this option.
+ *
+ *
+ * This is free software. You may redistribute and/or modify it as you
+ * see fit, without restriction of copyright.
+ *
+ * This software is provided "as is", in the hope that it may be useful,
+ * but WITHOUT WARRANTY OF ANY KIND, not even any implied warranty of
+ * MERCHANTABILITY, nor of FITNESS FOR ANY PARTICULAR PURPOSE. At no
+ * time will the author accept any form of liability for any damages,
+ * however caused, resulting from the use of this software.
+ *
+ */
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "mingw_pformat.h"
+
+int __cdecl __sprintf (APICHAR *, const APICHAR *, ...) __MINGW_NOTHROW;
+
+int __cdecl __sprintf(APICHAR *buf, const APICHAR *fmt, ...)
+{
+ register int retval;
+ va_list argv; va_start( argv, fmt );
+ buf[retval = __pformat( PFORMAT_NOLIMIT, buf, 0, fmt, argv )] = '\0';
+ va_end( argv );
+ return retval;
+}
libc/mingw/stdio/mingw_sprintfw.c
@@ -0,0 +1,10 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __BUILD_WIDEAPI 1
+#define _CRT_NON_CONFORMING_SWPRINTFS 1
+
+#include "mingw_sprintf.c"
+
libc/mingw/stdio/mingw_sscanf.c
@@ -0,0 +1,20 @@
+#include <stdarg.h>
+#include <stdlib.h>
+
+extern int __mingw_vsscanf (const char *buf, const char *format, va_list argp);
+
+int __mingw_sscanf (const char *buf, const char *format, ...);
+
+int
+__mingw_sscanf (const char *buf, const char *format, ...)
+{
+ va_list argp;
+ int r;
+
+ va_start (argp, format);
+ r = __mingw_vsscanf (buf, format, argp);
+ va_end (argp);
+
+ return r;
+}
+
libc/mingw/stdio/mingw_swscanf.c
@@ -0,0 +1,20 @@
+#include <stdarg.h>
+#include <stdlib.h>
+
+extern int __mingw_vswscanf (const wchar_t *buf, const wchar_t *format, va_list argp);
+
+int __mingw_swscanf (const wchar_t *buf, const wchar_t *format, ...);
+
+int
+__mingw_swscanf (const wchar_t *buf, const wchar_t *format, ...)
+{
+ va_list argp;
+ int r;
+
+ va_start (argp, format);
+ r = __mingw_vswscanf (buf, format, argp);
+ va_end (argp);
+
+ return r;
+}
+
libc/mingw/stdio/mingw_vasprintf.c
@@ -0,0 +1,25 @@
+#define _GNU_SOURCE
+#define __CRT__NO_INLINE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+int __mingw_vasprintf(char ** __restrict__ ret,
+ const char * __restrict__ format,
+ va_list ap) {
+ int len;
+ /* Get Length */
+ len = __mingw_vsnprintf(NULL,0,format,ap);
+ if (len < 0) return -1;
+ /* +1 for \0 terminator. */
+ *ret = malloc(len + 1);
+ /* Check malloc fail*/
+ if (!*ret) return -1;
+ /* Write String */
+ __mingw_vsnprintf(*ret,len+1,format,ap);
+ /* Terminate explicitly */
+ (*ret)[len] = '\0';
+ return len;
+}
+
libc/mingw/stdio/mingw_vfprintf.c
@@ -0,0 +1,58 @@
+/* vfprintf.c
+ *
+ * $Id: vfprintf.c,v 1.1 2008/08/11 22:41:55 keithmarshall Exp $
+ *
+ * Provides an implementation of the "vfprintf" function, conforming
+ * generally to C99 and SUSv3/POSIX specifications, with extensions
+ * to support Microsoft's non-standard format specifications. This
+ * is included in libmingwex.a, whence it may replace the Microsoft
+ * function of the same name.
+ *
+ * Written by Keith Marshall <keithmarshall@users.sourceforge.net>
+ *
+ * This implementation of "vfprintf" will normally be invoked by calling
+ * "__mingw_vfprintf()" in preference to a direct reference to "vfprintf()"
+ * itself; this leaves the MSVCRT implementation as the default, which
+ * will be deployed when user code invokes "vfprint()". Users who then
+ * wish to use this implementation may either call "__mingw_vfprintf()"
+ * directly, or may use conditional preprocessor defines, to redirect
+ * references to "vfprintf()" to "__mingw_vfprintf()".
+ *
+ * Compiling this module with "-D INSTALL_AS_DEFAULT" will change this
+ * recommended convention, such that references to "vfprintf()" in user
+ * code will ALWAYS be redirected to "__mingw_vfprintf()"; if this option
+ * is adopted, then users wishing to use the MSVCRT implementation of
+ * "vfprintf()" will be forced to use a "back-door" mechanism to do so.
+ * Such a "back-door" mechanism is provided with MinGW, allowing the
+ * MSVCRT implementation to be called as "__msvcrt_vfprintf()"; however,
+ * since users may not expect this behaviour, a standard libmingwex.a
+ * installation does not employ this option.
+ *
+ *
+ * This is free software. You may redistribute and/or modify it as you
+ * see fit, without restriction of copyright.
+ *
+ * This software is provided "as is", in the hope that it may be useful,
+ * but WITHOUT WARRANTY OF ANY KIND, not even any implied warranty of
+ * MERCHANTABILITY, nor of FITNESS FOR ANY PARTICULAR PURPOSE. At no
+ * time will the author accept any form of liability for any damages,
+ * however caused, resulting from the use of this software.
+ *
+ */
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "mingw_pformat.h"
+
+int __cdecl __vfprintf (FILE *, const APICHAR *, va_list) __MINGW_NOTHROW;
+
+int __cdecl __vfprintf(FILE *stream, const APICHAR *fmt, va_list argv)
+{
+ register int retval;
+
+ _lock_file( stream );
+ retval = __pformat( PFORMAT_TO_FILE | PFORMAT_NOLIMIT, stream, 0, fmt, argv );
+ _unlock_file( stream );
+
+ return retval;
+}
libc/mingw/stdio/mingw_vfprintfw.c
@@ -0,0 +1,9 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __BUILD_WIDEAPI 1
+
+#include "mingw_vfprintf.c"
+
libc/mingw/stdio/mingw_vfscanf.c
@@ -0,0 +1,1630 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2011 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 <limits.h>
+#include <stddef.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <ctype.h>
+#include <wctype.h>
+#include <locale.h>
+#include <errno.h>
+
+/* Helper flags for conversion. */
+#define IS_C 0x0001
+#define IS_S 0x0002
+#define IS_L 0x0004
+#define IS_LL 0x0008
+#define IS_SIGNED_NUM 0x0010
+#define IS_POINTER 0x0020
+#define IS_HEX_FLOAT 0x0040
+#define IS_SUPPRESSED 0x0080
+#define USE_GROUP 0x0100
+#define USE_GNU_ALLOC 0x0200
+#define USE_POSIX_ALLOC 0x0400
+
+#define IS_ALLOC_USED (USE_GNU_ALLOC | USE_POSIX_ALLOC)
+
+/* internal stream structure with back-buffer. */
+typedef struct _IFP
+{
+ __extension__ union {
+ void *fp;
+ const char *str;
+ };
+ int bch[1024];
+ int is_string : 1;
+ int back_top;
+ int seen_eof : 1;
+} _IFP;
+
+static void *
+get_va_nth (va_list argp, unsigned int n)
+{
+ va_list ap;
+ if (!n) abort ();
+ va_copy (ap, argp);
+ while (--n > 0)
+ (void) va_arg(ap, void *);
+ return va_arg (ap, void *);
+}
+
+static void
+optimize_alloc (char **p, char *end, size_t alloc_sz)
+{
+ size_t need_sz;
+ char *h;
+
+ if (!p || !*p)
+ return;
+
+ need_sz = end - *p;
+ if (need_sz == alloc_sz)
+ return;
+
+ if ((h = (char *) realloc (*p, need_sz)) != NULL)
+ *p = h;
+}
+
+static void
+back_ch (int c, _IFP *s, size_t *rin, int not_eof)
+{
+ if (!not_eof && c == EOF)
+ return;
+ if (s->is_string == 0)
+ {
+ FILE *fp = s->fp;
+ ungetc (c, fp);
+ rin[0] -= 1;
+ return;
+ }
+ rin[0] -= 1;
+ s->bch[s->back_top] = c;
+ s->back_top += 1;
+}
+
+static int
+in_ch (_IFP *s, size_t *rin)
+{
+ int r;
+ if (s->back_top)
+ {
+ s->back_top -= 1;
+ r = s->bch[s->back_top];
+ rin[0] += 1;
+ }
+ else if (s->seen_eof)
+ {
+ return EOF;
+ }
+ else if (s->is_string)
+ {
+ const char *ps = s->str;
+ r = ((int) *ps) & 0xff;
+ ps++;
+ if (r != 0)
+ {
+ rin[0] += 1;
+ s->str = ps;
+ return r;
+ }
+ s->seen_eof = 1;
+ return EOF;
+ }
+ else
+ {
+ FILE *fp = (FILE *) s->fp;
+ r = getc (fp);
+ if (r != EOF)
+ rin[0] += 1;
+ else s->seen_eof = 1;
+ }
+ return r;
+}
+
+static int
+match_string (_IFP *s, size_t *rin, int *c, const char *str)
+{
+ int ch = *c;
+
+ if (*str == 0)
+ return 1;
+
+ if (*str != (char) tolower (ch))
+ return 0;
+ ++str;
+ while (*str != 0)
+ {
+ if ((ch = in_ch (s, rin)) == EOF)
+ {
+ c[0] = ch;
+ return 0;
+ }
+
+ if (*str != (char) tolower (ch))
+ {
+ c[0] = ch;
+ return 0;
+ }
+ ++str;
+ }
+ c[0] = ch;
+ return 1;
+}
+
+struct gcollect
+{
+ size_t count;
+ struct gcollect *next;
+ char **ptrs[32];
+};
+
+static void
+release_ptrs (struct gcollect **pt, char **wbuf)
+{
+ struct gcollect *pf;
+ size_t cnt;
+
+ if (wbuf)
+ {
+ free (*wbuf);
+ *wbuf = NULL;
+ }
+ if (!pt || (pf = *pt) == NULL)
+ return;
+ while (pf != NULL)
+ {
+ struct gcollect *pf_sv = pf;
+ for (cnt = 0; cnt < pf->count; ++cnt)
+ {
+ free (*pf->ptrs[cnt]);
+ *pf->ptrs[cnt] = NULL;
+ }
+ pf = pf->next;
+ free (pf_sv);
+ }
+ *pt = NULL;
+}
+
+static int
+cleanup_return (int rval, struct gcollect **pfree, char **strp, char **wbuf)
+{
+ if (rval == EOF)
+ release_ptrs (pfree, wbuf);
+ else
+ {
+ if (pfree)
+ {
+ struct gcollect *pf = *pfree, *pf_sv;
+ while (pf != NULL)
+ {
+ pf_sv = pf;
+ pf = pf->next;
+ free (pf_sv);
+ }
+ *pfree = NULL;
+ }
+ if (strp != NULL)
+ {
+ free (*strp);
+ *strp = NULL;
+ }
+ if (wbuf)
+ {
+ free (*wbuf);
+ *wbuf = NULL;
+ }
+ }
+ return rval;
+}
+
+static struct gcollect *
+resize_gcollect (struct gcollect *pf)
+{
+ struct gcollect *np;
+ if (pf && pf->count < 32)
+ return pf;
+ np = malloc (sizeof (struct gcollect));
+ np->count = 0;
+ np->next = pf;
+ return np;
+}
+
+static char *
+resize_wbuf (size_t wpsz, size_t *wbuf_max_sz, char *old)
+{
+ char *wbuf;
+ size_t nsz;
+ if (*wbuf_max_sz != wpsz)
+ return old;
+ nsz = (256 > (2 * wbuf_max_sz[0]) ? 256 : (2 * wbuf_max_sz[0]));
+ if (!old)
+ wbuf = (char *) malloc (nsz);
+ else
+ wbuf = (char *) realloc (old, nsz);
+ if (!wbuf)
+ {
+ if (old)
+ free (old);
+ }
+ else
+ *wbuf_max_sz = nsz;
+ return wbuf;
+}
+
+static int
+__mingw_sformat (_IFP *s, const char *format, va_list argp)
+{
+ const char *f = format;
+ struct gcollect *gcollect = NULL;
+ size_t read_in = 0, wbuf_max_sz = 0, cnt;
+ ssize_t str_sz = 0;
+ char *str = NULL, **pstr = NULL, *wbuf = NULL;
+ wchar_t *wstr = NULL;
+ int rval = 0, c = 0, ignore_ws = 0;
+ va_list arg;
+ unsigned char fc;
+ unsigned int npos;
+ int width, flags, base = 0, errno_sv;
+ size_t wbuf_cur_sz, read_in_sv, new_sz, n;
+ char seen_dot, seen_exp, is_neg, not_in;
+ char *tmp_wbuf_ptr, buf[MB_LEN_MAX];
+ const char *lc_decimal_point, *lc_thousands_sep;
+ mbstate_t state, cstate;
+ union {
+ unsigned long long ull;
+ unsigned long ul;
+ long long ll;
+ long l;
+ } cv_val;
+
+ arg = argp;
+
+ if (!s || s->fp == NULL || !format)
+ {
+ errno = EINVAL;
+ return EOF;
+ }
+
+ memset (&state, 0, sizeof (state));
+
+ lc_decimal_point = localeconv()->decimal_point;
+ lc_thousands_sep = localeconv()->thousands_sep;
+ if (lc_thousands_sep != NULL && *lc_thousands_sep == 0)
+ lc_thousands_sep = NULL;
+
+ while (*f != 0)
+ {
+ if (!isascii ((unsigned char) *f))
+ {
+ int len;
+
+ if ((len = mbrlen (f, strlen (f), &state)) > 0)
+ {
+ do
+ {
+ if ((c = in_ch (s, &read_in)) == EOF || c != (unsigned char) *f++)
+ {
+ back_ch (c, s, &read_in, 1);
+ return cleanup_return ((!rval ? EOF : rval), &gcollect, pstr, &wbuf);
+ }
+ }
+ while (--len > 0);
+
+ continue;
+ }
+ }
+
+ fc = *f++;
+ if (fc != '%')
+ {
+ if (isspace (fc))
+ ignore_ws = 1;
+ else
+ {
+ if ((c = in_ch (s, &read_in)) == EOF)
+ return cleanup_return ((!rval ? EOF : rval), &gcollect, pstr, &wbuf);
+
+ if (ignore_ws)
+ {
+ ignore_ws = 0;
+ if (isspace (c))
+ {
+ do
+ {
+ if ((c = in_ch (s, &read_in)) == EOF)
+ return cleanup_return ((!rval ? EOF : rval), &gcollect, pstr, &wbuf);
+ }
+ while (isspace (c));
+ }
+ }
+
+ if (c != fc)
+ {
+ back_ch (c, s, &read_in, 0);
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+
+ continue;
+ }
+
+ width = flags = 0;
+ npos = 0;
+ wbuf_cur_sz = 0;
+
+ if (isdigit ((unsigned char) *f))
+ {
+ const char *svf = f;
+ npos = (unsigned char) *f++ - '0';
+ while (isdigit ((unsigned char) *f))
+ npos = npos * 10 + ((unsigned char) *f++ - '0');
+ if (*f != '$')
+ {
+ npos = 0;
+ f = svf;
+ }
+ else
+ f++;
+ }
+
+ do
+ {
+ if (*f == '*')
+ flags |= IS_SUPPRESSED;
+ else if (*f == '\'')
+ {
+ if (lc_thousands_sep)
+ flags |= USE_GROUP;
+ }
+ else if (*f == 'I')
+ {
+ /* we don't support locale's digits (i18N), but ignore it for now silently. */
+ ;
+#ifdef _WIN32
+ if (f[1] == '6' && f[2] == '4')
+ {
+ flags |= IS_LL | IS_L;
+ f += 2;
+ }
+ else if (f[1] == '3' && f[2] == '2')
+ {
+ flags |= IS_L;
+ f += 2;
+ }
+ else
+ {
+#ifdef _WIN64
+ flags |= IS_LL | IS_L;
+#else
+ flags |= IS_L;
+#endif
+ }
+#endif
+ }
+ else
+ break;
+ ++f;
+ }
+ while (1);
+
+ while (isdigit ((unsigned char) *f))
+ width = width * 10 + ((unsigned char) *f++ - '0');
+
+ if (!width)
+ width = -1;
+
+ switch (*f)
+ {
+ case 'h':
+ ++f;
+ flags |= (*f == 'h' ? IS_C : IS_S);
+ if (*f == 'h')
+ ++f;
+ break;
+ case 'l':
+ ++f;
+ flags |= (*f == 'l' ? IS_LL : 0) | IS_L;
+ if (*f == 'l')
+ ++f;
+ break;
+ case 'q': case 'L':
+ ++f;
+ flags |= IS_LL | IS_L;
+ break;
+ case 'a':
+ if (f[1] != 's' && f[1] != 'S' && f[1] != '[')
+ break;
+ ++f;
+ flags |= USE_GNU_ALLOC;
+ break;
+ case 'm':
+ flags |= USE_POSIX_ALLOC;
+ ++f;
+ if (*f == 'l')
+ {
+ flags |= IS_L;
+ f++;
+ }
+ break;
+ case 'z':
+#ifdef _WIN64
+ flags |= IS_LL | IS_L;
+#else
+ flags |= IS_L;
+#endif
+ ++f;
+ break;
+ case 'j':
+ if (sizeof (uintmax_t) > sizeof (unsigned long))
+ flags |= IS_LL;
+ else if (sizeof (uintmax_t) > sizeof (unsigned int))
+ flags |= IS_L;
+ ++f;
+ break;
+ case 't':
+#ifdef _WIN64
+ flags |= IS_LL;
+#else
+ flags |= IS_L;
+#endif
+ ++f;
+ break;
+ case 0:
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ default:
+ break;
+ }
+
+ if (*f == 0)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+ fc = *f++;
+ if (ignore_ws || (fc != '[' && fc != 'c' && fc != 'C' && fc != 'n'))
+ {
+ errno_sv = errno;
+ errno = 0;
+ do
+ {
+ if ((c == EOF || (c = in_ch (s, &read_in)) == EOF)
+ && errno == EINTR)
+ return cleanup_return ((!rval ? EOF : rval), &gcollect, pstr, &wbuf);
+ }
+ while (isspace (c));
+
+ ignore_ws = 0;
+ errno = errno_sv;
+ back_ch (c, s, &read_in, 0);
+ }
+
+ switch (fc)
+ {
+ case 'c':
+ if ((flags & IS_L) != 0)
+ fc = 'C';
+ break;
+ case 's':
+ if ((flags & IS_L) != 0)
+ fc = 'S';
+ break;
+ }
+
+ switch (fc)
+ {
+ case '%':
+ if ((c = in_ch (s, &read_in)) == EOF)
+ return cleanup_return ((!rval ? EOF : rval), &gcollect, pstr, &wbuf);
+ if (c != fc)
+ {
+ back_ch (c, s, &read_in, 1);
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ break;
+
+ case 'n':
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_LL) != 0)
+ *(npos != 0 ? (long long *) get_va_nth (argp, npos) : va_arg (arg, long long *)) = read_in;
+ else if ((flags & IS_L) != 0)
+ *(npos != 0 ? (long *) get_va_nth (argp, npos) : va_arg (arg, long *)) = read_in;
+ else if ((flags & IS_S) != 0)
+ *(npos != 0 ? (short *) get_va_nth (argp, npos) : va_arg (arg, short *)) = read_in;
+ else if ((flags & IS_C) != 0)
+ *(npos != 0 ? (char *) get_va_nth (argp, npos) : va_arg (arg, char *)) = read_in;
+ else
+ *(npos != 0 ? (int *) get_va_nth (argp, npos) : va_arg (arg, int *)) = read_in;
+ }
+ break;
+
+ case 'c':
+ if (width == -1)
+ width = 1;
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_ALLOC_USED) != 0)
+ {
+ if (npos != 0)
+ pstr = (char **) get_va_nth (argp, npos);
+ else
+ pstr = va_arg (arg, char **);
+
+ if (!pstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+ str_sz = (width > 1024 ? 1024 : width);
+ if ((str = *pstr = (char *) malloc (str_sz)) == NULL)
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? EOF : rval), &gcollect, pstr, &wbuf);
+
+ gcollect = resize_gcollect (gcollect);
+ gcollect->ptrs[gcollect->count++] = pstr;
+ }
+ else
+ {
+ if (npos != 0)
+ str = (char *) get_va_nth (argp, npos);
+ else
+ str = va_arg (arg, char *);
+ if (!str)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+
+ if ((c = in_ch (s, &read_in)) == EOF)
+ return cleanup_return ((!rval ? EOF : rval), &gcollect, pstr, &wbuf);
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ do
+ {
+ if ((flags & IS_ALLOC_USED) != 0 && str == (*pstr + str_sz))
+ {
+ new_sz = str_sz + (str_sz >= width ? width - 1 : str_sz);
+ while ((str = (char *) realloc (*pstr, new_sz)) == NULL
+ && new_sz > (size_t) (str_sz + 1))
+ new_sz = str_sz + 1;
+ if (!str)
+ {
+ release_ptrs (&gcollect, &wbuf);
+ return EOF;
+ }
+ *pstr = str;
+ str += str_sz;
+ str_sz = new_sz;
+ }
+ *str++ = c;
+ }
+ while (--width > 0 && (c = in_ch (s, &read_in)) != EOF);
+ }
+ else
+ while (--width > 0 && (c = in_ch (s, &read_in)) != EOF);
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ optimize_alloc (pstr, str, str_sz);
+ pstr = NULL;
+ ++rval;
+ }
+
+ break;
+
+ case 'C':
+ if (width == -1)
+ width = 1;
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_ALLOC_USED) != 0)
+ {
+ if (npos != 0)
+ pstr = (char **) get_va_nth (argp, npos);
+ else
+ pstr = va_arg (arg, char **);
+
+ if (!pstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ str_sz = (width > 1024 ? 1024 : width);
+ *pstr = (char *) malloc (str_sz * sizeof (wchar_t));
+ if ((wstr = (wchar_t *) *pstr) == NULL)
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? EOF : rval), &gcollect, pstr, &wbuf);
+ gcollect = resize_gcollect (gcollect);
+ gcollect->ptrs[gcollect->count++] = pstr;
+ }
+ else
+ {
+ if (npos != 0)
+ wstr = (wchar_t *) get_va_nth (argp, npos);
+ else
+ wstr = va_arg (arg, wchar_t *);
+ if (!wstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+
+ if ((c = in_ch (s, &read_in)) == EOF)
+ return cleanup_return ((!rval ? EOF : rval), &gcollect, pstr, &wbuf);
+
+ memset (&cstate, 0, sizeof (cstate));
+
+ do
+ {
+ buf[0] = c;
+
+ if ((flags & IS_SUPPRESSED) == 0 && (flags & IS_ALLOC_USED) != 0
+ && wstr == ((wchar_t *) *pstr + str_sz))
+ {
+ new_sz = str_sz + (str_sz > width ? width - 1 : str_sz);
+
+ while ((wstr = (wchar_t *) realloc (*pstr, new_sz * sizeof (wchar_t))) == NULL
+ && new_sz > (size_t) (str_sz + 1))
+ new_sz = str_sz + 1;
+ if (!wstr)
+ {
+ release_ptrs (&gcollect, &wbuf);
+ return EOF;
+ }
+ *pstr = (char *) wstr;
+ wstr += str_sz;
+ str_sz = new_sz;
+ }
+
+ while (1)
+ {
+ n = mbrtowc ((flags & IS_SUPPRESSED) == 0 ? wstr : NULL, buf, 1, &cstate);
+
+ if (n == (size_t) -2)
+ {
+ if ((c = in_ch (s, &read_in)) == EOF)
+ {
+ errno = EILSEQ;
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+
+ buf[0] = c;
+ continue;
+ }
+
+ if (n != 1)
+ {
+ errno = EILSEQ;
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ break;
+ }
+
+ ++wstr;
+ }
+ while (--width > 0 && (c = in_ch (s, &read_in)) != EOF);
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ optimize_alloc (pstr, (char *) wstr, str_sz * sizeof (wchar_t));
+ pstr = NULL;
+ ++rval;
+ }
+ break;
+
+ case 's':
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_ALLOC_USED) != 0)
+ {
+ if (npos != 0)
+ pstr = (char **) get_va_nth (argp, npos);
+ else
+ pstr = va_arg (arg, char **);
+
+ if (!pstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+ str_sz = 100;
+ if ((str = *pstr = (char *) malloc (100)) == NULL)
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? EOF : rval), &gcollect, pstr, &wbuf);
+ gcollect = resize_gcollect (gcollect);
+ gcollect->ptrs[gcollect->count++] = pstr;
+ }
+ else
+ {
+ if (npos != 0)
+ str = (char *) get_va_nth (argp, npos);
+ else
+ str = va_arg (arg, char *);
+ if (!str)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+
+ if ((c = in_ch (s, &read_in)) == EOF)
+ return cleanup_return ((!rval ? EOF : rval), &gcollect, pstr, &wbuf);
+
+ do
+ {
+ if (isspace (c))
+ {
+ back_ch (c, s, &read_in, 1);
+ break;
+ }
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ *str++ = c;
+ if ((flags & IS_ALLOC_USED) != 0 && str == (*pstr + str_sz))
+ {
+ new_sz = str_sz * 2;
+
+ while ((str = (char *) realloc (*pstr, new_sz)) == NULL
+ && new_sz > (size_t) (str_sz + 1))
+ new_sz = str_sz + 1;
+ if (!str)
+ {
+ if ((flags & USE_POSIX_ALLOC) == 0)
+ {
+ (*pstr)[str_sz - 1] = 0;
+ pstr = NULL;
+ ++rval;
+ }
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? EOF : rval), &gcollect, pstr, &wbuf);
+ }
+ *pstr = str;
+ str += str_sz;
+ str_sz = new_sz;
+ }
+ }
+ }
+ while ((width <= 0 || --width > 0) && (c = in_ch (s, &read_in)) != EOF);
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ *str++ = 0;
+ optimize_alloc (pstr, str, str_sz);
+ pstr = NULL;
+ ++rval;
+ }
+ break;
+
+ case 'S':
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_ALLOC_USED) != 0)
+ {
+ if (npos != 0)
+ pstr = (char **) get_va_nth (argp, npos);
+ else
+ pstr = va_arg (arg, char **);
+
+ if (!pstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+ str_sz = 100;
+ *pstr = (char *) malloc (100 * sizeof (wchar_t));
+ if ((wstr = (wchar_t *) *pstr) == NULL)
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? EOF : rval), &gcollect, pstr, &wbuf);
+ gcollect = resize_gcollect (gcollect);
+ gcollect->ptrs[gcollect->count++] = pstr;
+ }
+ else
+ {
+ if (npos != 0)
+ wstr = (wchar_t *) get_va_nth (argp, npos);
+ else
+ wstr = va_arg (arg, wchar_t *);
+ if (!wstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+
+ if ((c = in_ch (s, &read_in)) == EOF)
+ return cleanup_return ((!rval ? EOF : rval), &gcollect, pstr, &wbuf);
+
+ memset (&cstate, 0, sizeof (cstate));
+
+ do
+ {
+ if (isspace (c))
+ {
+ back_ch (c, s, &read_in, 1);
+ break;
+ }
+
+ buf[0] = c;
+
+ while (1)
+ {
+ n = mbrtowc ((flags & IS_SUPPRESSED) == 0 ? wstr : NULL, buf, 1, &cstate);
+
+ if (n == (size_t) -2)
+ {
+ if ((c = in_ch (s, &read_in)) == EOF)
+ {
+ errno = EILSEQ;
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+
+ buf[0] = c;
+ continue;
+ }
+
+ if (n != 1)
+ {
+ errno = EILSEQ;
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+
+ ++wstr;
+ break;
+ }
+
+ if ((flags & IS_SUPPRESSED) == 0 && (flags & IS_ALLOC_USED) != 0
+ && wstr == ((wchar_t *) *pstr + str_sz))
+ {
+ new_sz = str_sz * 2;
+ while ((wstr = (wchar_t *) realloc (*pstr, new_sz * sizeof (wchar_t))) == NULL
+ && new_sz > (size_t) (str_sz + 1))
+ new_sz = str_sz + 1;
+ if (!wstr)
+ {
+ if ((flags & USE_POSIX_ALLOC) == 0)
+ {
+ ((wchar_t *) (*pstr))[str_sz - 1] = 0;
+ pstr = NULL;
+ ++rval;
+ }
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? EOF : rval), &gcollect, pstr, &wbuf);
+ }
+ *pstr = (char *) wstr;
+ wstr += str_sz;
+ str_sz = new_sz;
+ }
+ }
+ while ((width <= 0 || --width > 0) && (c = in_ch (s, &read_in)) != EOF);
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ *wstr++ = 0;
+ optimize_alloc (pstr, (char *) wstr, str_sz * sizeof (wchar_t));
+ pstr = NULL;
+ ++rval;
+ }
+ break;
+
+ case 'd': case 'i':
+ case 'o': case 'p':
+ case 'u':
+ case 'x': case 'X':
+ switch (fc)
+ {
+ case 'd':
+ flags |= IS_SIGNED_NUM;
+ base = 10;
+ break;
+ case 'i':
+ flags |= IS_SIGNED_NUM;
+ base = 0;
+ break;
+ case 'o':
+ base = 8;
+ break;
+ case 'p':
+ base = 16;
+ flags &= ~(IS_S | IS_LL | IS_L);
+ #ifdef _WIN64
+ flags |= IS_LL;
+ #endif
+ flags |= IS_L | IS_POINTER;
+ break;
+ case 'u':
+ base = 10;
+ break;
+ case 'x': case 'X':
+ base = 16;
+ break;
+ }
+
+ if ((c = in_ch (s, &read_in)) == EOF)
+ return cleanup_return ((!rval ? EOF : rval), &gcollect, pstr, &wbuf);
+ if (c == '+' || c == '-')
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+ if (width > 0)
+ --width;
+ c = in_ch (s, &read_in);
+ }
+ if (width != 0 && c == '0')
+ {
+ if (width > 0)
+ --width;
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+ c = in_ch (s, &read_in);
+
+ if (width != 0 && tolower (c) == 'x')
+ {
+ if (!base)
+ base = 16;
+ if (base == 16)
+ {
+ if (width > 0)
+ --width;
+ c = in_ch (s, &read_in);
+ }
+ }
+ else if (!base)
+ base = 8;
+ }
+
+ if (!base)
+ base = 10;
+
+ while (c != EOF && width != 0)
+ {
+ if (base == 16)
+ {
+ if (!isxdigit (c))
+ break;
+ }
+ else if (!isdigit (c) || (int) (c - '0') >= base)
+ {
+ const char *p = lc_thousands_sep;
+ int remain;
+
+ if (base != 10 || (flags & USE_GROUP) == 0)
+ break;
+ remain = width > 0 ? width : INT_MAX;
+ while ((unsigned char) *p == c && remain >= 0)
+ {
+ /* As our conversion routines aren't supporting thousands
+ separators, we are filtering them here. */
+
+ ++p;
+ if (*p == 0 || !remain || (c = in_ch (s, &read_in)) == EOF)
+ break;
+ --remain;
+ }
+
+ if (*p != 0)
+ {
+ if (p > lc_thousands_sep)
+ {
+ back_ch (c, s, &read_in, 0);
+ while (--p > lc_thousands_sep)
+ back_ch ((unsigned char) *p, s, &read_in, 1);
+ c = (unsigned char) *p;
+ }
+ break;
+ }
+
+ if (width > 0)
+ width = remain;
+ --wbuf_cur_sz;
+ }
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+ if (width > 0)
+ --width;
+
+ c = in_ch (s, &read_in);
+ }
+
+ if (!wbuf_cur_sz || (wbuf_cur_sz == 1 && (wbuf[0] == '+' || wbuf[0] == '-')))
+ {
+ if (!wbuf_cur_sz && (flags & IS_POINTER) != 0
+ && match_string (s, &read_in, &c, "(nil)"))
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = '0';
+ }
+ else
+ {
+ back_ch (c, s, &read_in, 0);
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+ else
+ back_ch (c, s, &read_in, 0);
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = 0;
+
+ if ((flags & IS_LL))
+ {
+ if (flags & IS_SIGNED_NUM)
+ cv_val.ll = strtoll (wbuf, &tmp_wbuf_ptr, base/*, flags & USE_GROUP*/);
+ else
+ cv_val.ull = strtoull (wbuf, &tmp_wbuf_ptr, base);
+ }
+ else
+ {
+ if (flags & IS_SIGNED_NUM)
+ cv_val.l = strtol (wbuf, &tmp_wbuf_ptr, base/*, flags & USE_GROUP*/);
+ else
+ cv_val.ul = strtoul (wbuf, &tmp_wbuf_ptr, base);
+ }
+ if (wbuf == tmp_wbuf_ptr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_SIGNED_NUM) != 0)
+ {
+ if ((flags & IS_LL) != 0)
+ *(npos != 0 ? (long long *) get_va_nth (argp, npos) : va_arg (arg, long long *)) = cv_val.ll;
+ else if ((flags & IS_L) != 0)
+ *(npos != 0 ? (long *) get_va_nth (argp, npos) : va_arg (arg, long *)) = cv_val.l;
+ else if ((flags & IS_S) != 0)
+ *(npos != 0 ? (short *) get_va_nth (argp, npos) : va_arg (arg, short *)) = (short) cv_val.l;
+ else if ((flags & IS_C) != 0)
+ *(npos != 0 ? (signed char *) get_va_nth (argp, npos) : va_arg (arg, signed char *)) = (signed char) cv_val.ul;
+ else
+ *(npos != 0 ? (int *) get_va_nth (argp, npos) : va_arg (arg, int *)) = (int) cv_val.l;
+ }
+ else
+ {
+ if ((flags & IS_LL) != 0)
+ *(npos != 0 ? (unsigned long long *) get_va_nth (argp, npos) : va_arg (arg, unsigned long long *)) = cv_val.ull;
+ else if ((flags & IS_L) != 0)
+ *(npos != 0 ? (unsigned long *) get_va_nth (argp, npos) : va_arg (arg, unsigned long *)) = cv_val.ul;
+ else if ((flags & IS_S) != 0)
+ *(npos != 0 ? (unsigned short *) get_va_nth (argp, npos) : va_arg (arg, unsigned short *))
+ = (unsigned short) cv_val.ul;
+ else if ((flags & IS_C) != 0)
+ *(npos != 0 ? (unsigned char *) get_va_nth (argp, npos) : va_arg (arg, unsigned char *)) = (unsigned char) cv_val.ul;
+ else
+ *(npos != 0 ? (unsigned int *) get_va_nth (argp, npos) : va_arg (arg, unsigned int *)) = (unsigned int) cv_val.ul;
+ }
+ ++rval;
+ }
+ break;
+
+ case 'e': case 'E':
+ case 'f': case 'F':
+ case 'g': case 'G':
+ case 'a': case 'A':
+ if (width > 0)
+ --width;
+ if ((c = in_ch (s, &read_in)) == EOF)
+ return cleanup_return ((!rval ? EOF : rval), &gcollect, pstr, &wbuf);
+
+ seen_dot = seen_exp = 0;
+ is_neg = (c == '-' ? 1 : 0);
+
+ if (c == '-' || c == '+')
+ {
+ if (width == 0 || (c = in_ch (s, &read_in)) == EOF)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ if (width > 0)
+ --width;
+ }
+
+ if (tolower (c) == 'n')
+ {
+ const char *match_txt = "nan";
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+
+ ++match_txt;
+ do
+ {
+ if (width == 0 || (c = in_ch (s, &read_in)) == EOF || tolower (c) != match_txt[0])
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+ if (width > 0)
+ --width;
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+ ++match_txt;
+ }
+ while (*match_txt != 0);
+ }
+ else if (tolower (c) == 'i')
+ {
+ const char *match_txt = "inf";
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+
+ ++match_txt;
+ do
+ {
+ if (width == 0 || (c = in_ch (s, &read_in)) == EOF || tolower (c) != match_txt[0])
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ if (width > 0)
+ --width;
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+ ++match_txt;
+ }
+ while (*match_txt != 0);
+
+ if (width != 0 && (c = in_ch (s, &read_in)) != EOF && tolower (c) == 'i')
+ {
+ match_txt = "inity";
+
+ if (width > 0)
+ --width;
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+ ++match_txt;
+
+ do
+ {
+ if (width == 0 || (c = in_ch (s, &read_in)) == EOF || tolower (c) != match_txt[0])
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ if (width > 0)
+ --width;
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+ ++match_txt;
+ }
+ while (*match_txt != 0);
+ }
+ else if (width != 0 && c != EOF)
+ back_ch (c, s, &read_in, 0);
+ }
+ else
+ {
+ not_in = 'e';
+ if (width != 0 && c == '0')
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+
+ c = in_ch (s, &read_in);
+ if (width > 0)
+ --width;
+ if (width != 0 && tolower (c) == 'x')
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+
+ flags |= IS_HEX_FLOAT;
+ not_in = 'p';
+
+ flags &= ~USE_GROUP;
+ c = in_ch (s, &read_in);
+ if (width > 0)
+ --width;
+ }
+ }
+
+ while (1)
+ {
+ if (isdigit (c) || (!seen_exp && (flags & IS_HEX_FLOAT) != 0 && isxdigit (c))
+ || (seen_exp && wbuf[wbuf_cur_sz - 1] == not_in && (c == '-' || c == '+')))
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+ }
+ else if (wbuf_cur_sz > 0 && !seen_exp && (char) tolower (c) == not_in)
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = not_in;
+ seen_exp = seen_dot = 1;
+ }
+ else
+ {
+ const char *p = lc_decimal_point;
+ int remain = width > 0 ? width : INT_MAX;
+
+ if (! seen_dot)
+ {
+ while ((unsigned char) *p == c && remain >= 0)
+ {
+ ++p;
+ if (*p == 0 || !remain || (c = in_ch (s, &read_in)) == EOF)
+ break;
+ --remain;
+ }
+ }
+
+ if (*p == 0)
+ {
+ for (p = lc_decimal_point; *p != 0; ++p)
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = (unsigned char) *p;
+ }
+ if (width > 0)
+ width = remain;
+ seen_dot = 1;
+ }
+ else
+ {
+ const char *pp = lc_thousands_sep;
+
+ if (!seen_dot && (flags & USE_GROUP) != 0)
+ {
+ while ((pp - lc_thousands_sep) < (p - lc_decimal_point)
+ && *pp == lc_decimal_point[(pp - lc_thousands_sep)])
+ ++pp;
+ if ((pp - lc_thousands_sep) == (p - lc_decimal_point))
+ {
+ while ((unsigned char) *pp == c && remain >= 0)
+ {
+ ++pp;
+ if (*pp == 0 || !remain || (c = in_ch (s, &read_in)) == EOF)
+ break;
+ --remain;
+ }
+ }
+ }
+
+ if (pp != NULL && *pp == 0)
+ {
+ /* As our conversion routines aren't supporting thousands
+ separators, we are filtering them here. */
+ if (width > 0)
+ width = remain;
+ }
+ else
+ {
+ back_ch (c, s, &read_in, 0);
+ break;
+ }
+ }
+ }
+
+ if (width == 0 || (c = in_ch (s, &read_in)) == EOF)
+ break;
+
+ if (width > 0)
+ --width;
+ }
+
+ if (!wbuf_cur_sz || ((flags & IS_HEX_FLOAT) != 0 && wbuf_cur_sz == 2))
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = 0;
+
+ if ((flags & IS_LL) != 0)
+ {
+ long double ld;
+ ld = __mingw_strtold (wbuf, &tmp_wbuf_ptr/*, flags & USE_GROUP*/);
+ if ((flags & IS_SUPPRESSED) == 0 && tmp_wbuf_ptr != wbuf)
+ *(npos != 0 ? (long double *) get_va_nth (argp, npos) : va_arg (arg, long double *)) = is_neg ? -ld : ld;
+ }
+ else if ((flags & IS_L) != 0)
+ {
+ double d;
+ d = (double) __mingw_strtold (wbuf, &tmp_wbuf_ptr/*, flags & USE_GROUP*/);
+ if ((flags & IS_SUPPRESSED) == 0 && tmp_wbuf_ptr != wbuf)
+ *(npos != 0 ? (double *) get_va_nth (argp, npos) : va_arg (arg, double *)) = is_neg ? -d : d;
+ }
+ else
+ {
+ float d = __mingw_strtof (wbuf, &tmp_wbuf_ptr/*, flags & USE_GROUP*/);
+ if ((flags & IS_SUPPRESSED) == 0 && tmp_wbuf_ptr != wbuf)
+ *(npos != 0 ? (float *) get_va_nth (argp, npos) : va_arg (arg, float *)) = is_neg ? -d : d;
+ }
+
+ if (wbuf == tmp_wbuf_ptr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ ++rval;
+ break;
+
+ case '[':
+ if ((flags & IS_L) != 0)
+ {
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_ALLOC_USED) != 0)
+ {
+ if (npos != 0)
+ pstr = (char **) get_va_nth (argp, npos);
+ else
+ pstr = va_arg (arg, char **);
+
+ if (!pstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+ str_sz = 100;
+ *pstr = (char *) malloc (100 * sizeof (wchar_t));
+
+ if ((wstr = (wchar_t *) *pstr) == NULL)
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? EOF : rval), &gcollect, pstr, &wbuf);
+ gcollect = resize_gcollect (gcollect);
+ gcollect->ptrs[gcollect->count++] = pstr;
+ }
+ else
+ {
+ if (npos != 0)
+ wstr = (wchar_t *) get_va_nth (argp, npos);
+ else
+ wstr = va_arg (arg, wchar_t *);
+ if (!wstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+ }
+ else if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_ALLOC_USED) != 0)
+ {
+ if (npos != 0)
+ pstr = (char **) get_va_nth (argp, npos);
+ else
+ pstr = va_arg (arg, char **);
+
+ if (!pstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+ str_sz = 100;
+ if ((str = *pstr = (char *) malloc (100)) == NULL)
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? EOF : rval), &gcollect, pstr, &wbuf);
+
+ gcollect = resize_gcollect (gcollect);
+ gcollect->ptrs[gcollect->count++] = pstr;
+ }
+ else
+ {
+ if (npos != 0)
+ str = (char *) get_va_nth (argp, npos);
+ else
+ str = va_arg (arg, char *);
+ if (!str)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+
+ not_in = (*f == '^' ? 1 : 0);
+ if (*f == '^')
+ f++;
+
+ if (width < 0)
+ width = INT_MAX;
+
+ if (wbuf_max_sz < 256)
+ {
+ wbuf_max_sz = 256;
+ if (wbuf)
+ free (wbuf);
+ wbuf = (char *) malloc (wbuf_max_sz);
+ }
+ memset (wbuf, 0, 256);
+
+ fc = *f;
+ if (fc == ']' || fc == '-')
+ {
+ wbuf[fc] = 1;
+ ++f;
+ }
+
+ while ((fc = *f++) != 0 && fc != ']')
+ {
+ if (fc == '-' && *f != 0 && *f != ']' && (unsigned char) f[-2] <= (unsigned char) *f)
+ {
+ for (fc = (unsigned char) f[-2]; fc < (unsigned char) *f; ++fc)
+ wbuf[fc] = 1;
+ }
+ else
+ wbuf[fc] = 1;
+ }
+
+ if (!fc)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+ if ((flags & IS_L) != 0)
+ {
+ read_in_sv = read_in;
+ cnt = 0;
+
+ if ((c = in_ch (s, &read_in)) == EOF)
+ return cleanup_return ((!rval ? EOF : rval), &gcollect, pstr, &wbuf);
+
+ memset (&cstate, 0, sizeof (cstate));
+
+ do
+ {
+ if (wbuf[c] == not_in)
+ {
+ back_ch (c, s, &read_in, 1);
+ break;
+ }
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ buf[0] = c;
+ n = mbrtowc (wstr, buf, 1, &cstate);
+
+ if (n == (size_t) -2)
+ {
+ ++cnt;
+ continue;
+ }
+ cnt = 0;
+
+ ++wstr;
+ if ((flags & IS_ALLOC_USED) != 0 && wstr == ((wchar_t *) *pstr + str_sz))
+ {
+ new_sz = str_sz * 2;
+ while ((wstr = (wchar_t *) realloc (*pstr, new_sz * sizeof (wchar_t))) == NULL
+ && new_sz > (size_t) (str_sz + 1))
+ new_sz = str_sz + 1;
+ if (!wstr)
+ {
+ if ((flags & USE_POSIX_ALLOC) == 0)
+ {
+ ((wchar_t *) (*pstr))[str_sz - 1] = 0;
+ pstr = NULL;
+ ++rval;
+ }
+ else
+ rval = EOF;
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ *pstr = (char *) wstr;
+ wstr += str_sz;
+ str_sz = new_sz;
+ }
+ }
+
+ if (--width <= 0)
+ break;
+ }
+ while ((c = in_ch (s, &read_in)) != EOF);
+
+ if (cnt != 0)
+ {
+ errno = EILSEQ;
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+
+ if (read_in_sv == read_in)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ *wstr++ = 0;
+ optimize_alloc (pstr, (char *) wstr, str_sz * sizeof (wchar_t));
+ pstr = NULL;
+ ++rval;
+ }
+ }
+ else
+ {
+ read_in_sv = read_in;
+
+ if ((c = in_ch (s, &read_in)) == EOF)
+ return cleanup_return ((!rval ? EOF : rval), &gcollect, pstr, &wbuf);
+
+ do
+ {
+ if (wbuf[c] == not_in)
+ {
+ back_ch (c, s, &read_in, 1);
+ break;
+ }
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ *str++ = c;
+ if ((flags & IS_ALLOC_USED) != 0 && str == (*pstr + str_sz))
+ {
+ new_sz = str_sz * 2;
+
+ while ((str = (char *) realloc (*pstr, new_sz)) == NULL
+ && new_sz > (size_t) (str_sz + 1))
+ new_sz = str_sz + 1;
+ if (!str)
+ {
+ if ((flags & USE_POSIX_ALLOC) == 0)
+ {
+ (*pstr)[str_sz - 1] = 0;
+ pstr = NULL;
+ ++rval;
+ }
+ else
+ rval = EOF;
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ *pstr = str;
+ str += str_sz;
+ str_sz = new_sz;
+ }
+ }
+ }
+ while (--width > 0 && (c = in_ch (s, &read_in)) != EOF);
+
+ if (read_in_sv == read_in)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ *str++ = 0;
+ optimize_alloc (pstr, str, str_sz);
+ pstr = NULL;
+ ++rval;
+ }
+ }
+ break;
+
+ default:
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+
+ if (ignore_ws)
+ {
+ while (isspace ((c = in_ch (s, &read_in))));
+ back_ch (c, s, &read_in, 0);
+ }
+
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+}
+
+int
+__mingw_vfscanf (FILE *s, const char *format, va_list argp)
+{
+ _IFP ifp;
+ memset (&ifp, 0, sizeof (_IFP));
+ ifp.fp = s;
+ return __mingw_sformat (&ifp, format, argp);
+}
+
+int
+__mingw_vsscanf (const char *s, const char *format, va_list argp)
+{
+ _IFP ifp;
+ memset (&ifp, 0, sizeof (_IFP));
+ ifp.str = s;
+ ifp.is_string = 1;
+ return __mingw_sformat (&ifp, format, argp);
+}
+
libc/mingw/stdio/mingw_vprintf.c
@@ -0,0 +1,58 @@
+/* vprintf.c
+ *
+ * $Id: vprintf.c,v 1.1 2008/08/11 22:41:55 keithmarshall Exp $
+ *
+ * Provides an implementation of the "vprintf" function, conforming
+ * generally to C99 and SUSv3/POSIX specifications, with extensions
+ * to support Microsoft's non-standard format specifications. This
+ * is included in libmingwex.a, whence it may replace the Microsoft
+ * function of the same name.
+ *
+ * Written by Keith Marshall <keithmarshall@users.sourceforge.net>
+ *
+ * This implementation of "vprintf" will normally be invoked by calling
+ * "__mingw_vprintf()" in preference to a direct reference to "vprintf()"
+ * itself; this leaves the MSVCRT implementation as the default, which
+ * will be deployed when user code invokes "vprint()". Users who then
+ * wish to use this implementation may either call "__mingw_vprintf()"
+ * directly, or may use conditional preprocessor defines, to redirect
+ * references to "vprintf()" to "__mingw_vprintf()".
+ *
+ * Compiling this module with "-D INSTALL_AS_DEFAULT" will change this
+ * recommended convention, such that references to "vprintf()" in user
+ * code will ALWAYS be redirected to "__mingw_vprintf()"; if this option
+ * is adopted, then users wishing to use the MSVCRT implementation of
+ * "vprintf()" will be forced to use a "back-door" mechanism to do so.
+ * Such a "back-door" mechanism is provided with MinGW, allowing the
+ * MSVCRT implementation to be called as "__msvcrt_vprintf()"; however,
+ * since users may not expect this behaviour, a standard libmingwex.a
+ * installation does not employ this option.
+ *
+ *
+ * This is free software. You may redistribute and/or modify it as you
+ * see fit, without restriction of copyright.
+ *
+ * This software is provided "as is", in the hope that it may be useful,
+ * but WITHOUT WARRANTY OF ANY KIND, not even any implied warranty of
+ * MERCHANTABILITY, nor of FITNESS FOR ANY PARTICULAR PURPOSE. At no
+ * time will the author accept any form of liability for any damages,
+ * however caused, resulting from the use of this software.
+ *
+ */
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "mingw_pformat.h"
+
+int __cdecl __vprintf (const APICHAR *, va_list) __MINGW_NOTHROW;
+
+int __cdecl __vprintf(const APICHAR *fmt, va_list argv)
+{
+ register int retval;
+
+ _lock_file( stdout );
+ retval = __pformat( PFORMAT_TO_FILE | PFORMAT_NOLIMIT, stdout, 0, fmt, argv );
+ _unlock_file( stdout );
+
+ return retval;
+}
libc/mingw/stdio/mingw_vprintfw.c
@@ -0,0 +1,9 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __BUILD_WIDEAPI 1
+
+#include "mingw_vprintf.c"
+
libc/mingw/stdio/mingw_vsnprintf.c
@@ -0,0 +1,52 @@
+/* vsnprintf.c
+ *
+ * $Id: vsnprintf.c,v 1.3 2008/07/28 23:24:20 keithmarshall Exp $
+ *
+ * Provides an implementation of the "vsnprintf" function, conforming
+ * generally to C99 and SUSv3/POSIX specifications, with extensions
+ * to support Microsoft's non-standard format specifications. This
+ * is included in libmingwex.a, replacing the redirection through
+ * libmoldnames.a, to the MSVCRT standard "_vsnprintf" function; (the
+ * standard MSVCRT function remains available, and may be invoked
+ * directly, using this fully qualified form of its name).
+ *
+ * Written by Keith Marshall <keithmarshall@users.sourceforge.net>
+ *
+ * This is free software. You may redistribute and/or modify it as you
+ * see fit, without restriction of copyright.
+ *
+ * This software is provided "as is", in the hope that it may be useful,
+ * but WITHOUT WARRANTY OF ANY KIND, not even any implied warranty of
+ * MERCHANTABILITY, nor of FITNESS FOR ANY PARTICULAR PURPOSE. At no
+ * time will the author accept any form of liability for any damages,
+ * however caused, resulting from the use of this software.
+ *
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "mingw_pformat.h"
+
+int __cdecl __vsnprintf (APICHAR *, size_t, const APICHAR *fmt, va_list) __MINGW_NOTHROW;
+int __cdecl __vsnprintf(APICHAR *buf, size_t length, const APICHAR *fmt, va_list argv )
+{
+ register int retval;
+
+ if( length == (size_t)(0) )
+ /*
+ * No buffer; simply compute and return the size required,
+ * without actually emitting any data.
+ */
+ return __pformat( 0, buf, 0, fmt, argv);
+
+ /* If we get to here, then we have a buffer...
+ * Emit data up to the limit of buffer length less one,
+ * then add the requisite NUL terminator.
+ */
+ retval = __pformat( 0, buf, --length, fmt, argv );
+ buf[retval < (int) length ? retval : (int)length] = '\0';
+
+ return retval;
+}
+
libc/mingw/stdio/mingw_vsnprintfw.c
@@ -0,0 +1,9 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __BUILD_WIDEAPI 1
+
+#include "mingw_vsnprintf.c"
+
libc/mingw/stdio/mingw_vsprintf.c
@@ -0,0 +1,54 @@
+/* vsprintf.c
+ *
+ * $Id: vsprintf.c,v 1.1 2008/08/11 22:41:55 keithmarshall Exp $
+ *
+ * Provides an implementation of the "vsprintf" function, conforming
+ * generally to C99 and SUSv3/POSIX specifications, with extensions
+ * to support Microsoft's non-standard format specifications. This
+ * is included in libmingwex.a, whence it may replace the Microsoft
+ * function of the same name.
+ *
+ * Written by Keith Marshall <keithmarshall@users.sourceforge.net>
+ *
+ * This implementation of "vsprintf" will normally be invoked by calling
+ * "__mingw_vsprintf()" in preference to a direct reference to "vsprintf()"
+ * itself; this leaves the MSVCRT implementation as the default, which
+ * will be deployed when user code invokes "vsprint()". Users who then
+ * wish to use this implementation may either call "__mingw_vsprintf()"
+ * directly, or may use conditional preprocessor defines, to redirect
+ * references to "vsprintf()" to "__mingw_vsprintf()".
+ *
+ * Compiling this module with "-D INSTALL_AS_DEFAULT" will change this
+ * recommended convention, such that references to "vsprintf()" in user
+ * code will ALWAYS be redirected to "__mingw_vsprintf()"; if this option
+ * is adopted, then users wishing to use the MSVCRT implementation of
+ * "vsprintf()" will be forced to use a "back-door" mechanism to do so.
+ * Such a "back-door" mechanism is provided with MinGW, allowing the
+ * MSVCRT implementation to be called as "__msvcrt_vsprintf()"; however,
+ * since users may not expect this behaviour, a standard libmingwex.a
+ * installation does not employ this option.
+ *
+ *
+ * This is free software. You may redistribute and/or modify it as you
+ * see fit, without restriction of copyright.
+ *
+ * This software is provided "as is", in the hope that it may be useful,
+ * but WITHOUT WARRANTY OF ANY KIND, not even any implied warranty of
+ * MERCHANTABILITY, nor of FITNESS FOR ANY PARTICULAR PURPOSE. At no
+ * time will the author accept any form of liability for any damages,
+ * however caused, resulting from the use of this software.
+ *
+ */
+#include <stdio.h>
+#include <stdarg.h>
+
+#include "mingw_pformat.h"
+
+int __cdecl __vsprintf (APICHAR *, const APICHAR *, va_list) __MINGW_NOTHROW;
+
+int __cdecl __vsprintf(APICHAR *buf, const APICHAR *fmt, va_list argv)
+{
+ register int retval;
+ buf[retval = __pformat( PFORMAT_NOLIMIT, buf, 0, fmt, argv )] = '\0';
+ return retval;
+}
libc/mingw/stdio/mingw_vsprintfw.c
@@ -0,0 +1,10 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __BUILD_WIDEAPI 1
+#define _CRT_NON_CONFORMING_SWPRINTFS 1
+
+#include "mingw_vsprintf.c"
+
libc/mingw/stdio/mingw_wscanf.c
@@ -0,0 +1,28 @@
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+extern int __mingw_vfwscanf (FILE *stream, const wchar_t *format, va_list argp);
+
+int __mingw_wscanf (const wchar_t *format, ...);
+int __mingw_vwscanf (const wchar_t *format, va_list argp);
+
+int
+__mingw_wscanf (const wchar_t *format, ...)
+{
+ va_list argp;
+ int r;
+
+ va_start (argp, format);
+ r = __mingw_vfwscanf (stdin, format, argp);
+ va_end (argp);
+
+ return r;
+}
+
+int
+__mingw_vwscanf (const wchar_t *format, va_list argp)
+{
+ return __mingw_vfwscanf (stdin, format, argp);
+}
+
libc/mingw/stdio/mingw_wvfscanf.c
@@ -0,0 +1,1623 @@
+/*
+ This Software is provided under the Zope Public License (ZPL) Version 2.1.
+
+ Copyright (c) 2011 by the mingw-w64 project
+
+ See the AUTHORS file for the list of contributors to the mingw-w64 project.
+
+ This license has been certified as open source. It has also been designated
+ as GPL compatible by the Free Software Foundation (FSF).
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ 1. Redistributions in source code must retain the accompanying copyright
+ notice, this list of conditions, and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the accompanying
+ copyright notice, this list of conditions, and the following disclaimer
+ in the documentation and/or other materials provided with the
+ distribution.
+ 3. Names of the copyright holders must not be used to endorse or promote
+ products derived from this software without prior written permission
+ from the copyright holders.
+ 4. The right to distribute this software or to use it for any purpose does
+ not give you the right to use Servicemarks (sm) or Trademarks (tm) of
+ the copyright holders. Use of them is covered by separate agreement
+ with the copyright holders.
+ 5. If any files are modified, you must cause the modified files to carry
+ prominent notices stating that you changed the files and the date of
+ any change.
+
+ Disclaimer
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED
+ 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 COPYRIGHT HOLDERS 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 <limits.h>
+#include <stddef.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <wchar.h>
+#include <ctype.h>
+#include <wctype.h>
+#include <locale.h>
+#include <errno.h>
+
+#ifndef CP_UTF8
+#define CP_UTF8 65001
+#endif
+
+#ifndef MB_ERR_INVALID_CHARS
+#define MB_ERR_INVALID_CHARS 0x00000008
+#endif
+
+/* Helper flags for conversion. */
+#define IS_C 0x0001
+#define IS_S 0x0002
+#define IS_L 0x0004
+#define IS_LL 0x0008
+#define IS_SIGNED_NUM 0x0010
+#define IS_POINTER 0x0020
+#define IS_HEX_FLOAT 0x0040
+#define IS_SUPPRESSED 0x0080
+#define USE_GROUP 0x0100
+#define USE_GNU_ALLOC 0x0200
+#define USE_POSIX_ALLOC 0x0400
+
+#define IS_ALLOC_USED (USE_GNU_ALLOC | USE_POSIX_ALLOC)
+
+/* internal stream structure with back-buffer. */
+typedef struct _IFP
+{
+ __extension__ union {
+ void *fp;
+ const wchar_t *str;
+ };
+ int bch[1024];
+ int is_string : 1;
+ int back_top;
+ int seen_eof : 1;
+} _IFP;
+
+static void *
+get_va_nth (va_list argp, unsigned int n)
+{
+ va_list ap;
+ if (!n)
+ abort ();
+ va_copy (ap, argp);
+ while (--n > 0)
+ (void) va_arg(ap, void *);
+ return va_arg (ap, void *);
+}
+
+static void
+optimize_alloc (int do_realloc, char **p, size_t sz, size_t need_sz, size_t typ_sz)
+{
+ char *h;
+
+ if (!do_realloc || sz == need_sz || !p || *p == NULL)
+ return;
+ if ((h = (char *) realloc (*p, need_sz * typ_sz)) != NULL)
+ *p = h;
+}
+
+static void
+back_ch (int c, _IFP *s, size_t *rin, int not_eof)
+{
+ if (!not_eof && c == WEOF)
+ return;
+ if (s->is_string == 0)
+ {
+ FILE *fp = s->fp;
+ ungetwc (c, fp);
+ rin[0] -= 1;
+ return;
+ }
+ rin[0] -= 1;
+ s->bch[s->back_top] = c;
+ s->back_top += 1;
+}
+
+static int
+in_ch (_IFP *s, size_t *rin)
+{
+ int r;
+ if (s->back_top)
+ {
+ s->back_top -= 1;
+ r = s->bch[s->back_top];
+ rin[0] += 1;
+ }
+ else if (s->seen_eof)
+ {
+ return WEOF;
+ }
+ else if (s->is_string)
+ {
+ const wchar_t *ps = s->str;
+ r = ((int) *ps) & 0xffff;
+ ps++;
+ if (r != 0)
+ {
+ rin[0] += 1;
+ s->str = ps;
+ return r;
+ }
+ s->seen_eof = 1;
+ return WEOF;
+ }
+ else
+ {
+ FILE *fp = (FILE *) s->fp;
+ r = getwc (fp);
+ if (r != WEOF)
+ rin[0] += 1;
+ else s->seen_eof = 1;
+ }
+ return r;
+}
+
+static int
+match_string (_IFP *s, size_t *rin, wint_t *c, const wchar_t *str)
+{
+ int ch = *c;
+
+ if (*str == 0)
+ return 1;
+
+ if (*str != (wchar_t) towlower (ch))
+ return 0;
+ ++str;
+ while (*str != 0)
+ {
+ if ((ch = in_ch (s, rin)) == WEOF)
+ {
+ c[0] = ch;
+ return 0;
+ }
+
+ if (*str != (wchar_t) towlower (ch))
+ {
+ c[0] = ch;
+ return 0;
+ }
+ ++str;
+ }
+ c[0] = ch;
+ return 1;
+}
+
+struct gcollect
+{
+ size_t count;
+ struct gcollect *next;
+ char **ptrs[32];
+};
+
+static void
+release_ptrs (struct gcollect **pt, wchar_t **wbuf)
+{
+ struct gcollect *pf;
+ size_t cnt;
+
+ if (wbuf)
+ {
+ free (*wbuf);
+ *wbuf = NULL;
+ }
+ if (!pt || (pf = *pt) == NULL)
+ return;
+ while (pf != NULL)
+ {
+ struct gcollect *pf_sv = pf;
+ for (cnt = 0; cnt < pf->count; ++cnt)
+ {
+ free (*pf->ptrs[cnt]);
+ *pf->ptrs[cnt] = NULL;
+ }
+ pf = pf->next;
+ free (pf_sv);
+ }
+ *pt = NULL;
+}
+
+static int
+cleanup_return (int rval, struct gcollect **pfree, char **strp, wchar_t **wbuf)
+{
+ if (rval == WEOF)
+ release_ptrs (pfree, wbuf);
+ else
+ {
+ if (pfree)
+ {
+ struct gcollect *pf = *pfree, *pf_sv;
+ while (pf != NULL)
+ {
+ pf_sv = pf;
+ pf = pf->next;
+ free (pf_sv);
+ }
+ *pfree = NULL;
+ }
+ if (strp != NULL)
+ {
+ free (*strp);
+ *strp = NULL;
+ }
+ if (wbuf)
+ {
+ free (*wbuf);
+ *wbuf = NULL;
+ }
+ }
+ return rval;
+}
+
+static struct gcollect *
+resize_gcollect (struct gcollect *pf)
+{
+ struct gcollect *np;
+ if (pf && pf->count < 32)
+ return pf;
+ np = malloc (sizeof (struct gcollect));
+ np->count = 0;
+ np->next = pf;
+ return np;
+}
+
+static wchar_t *
+resize_wbuf (size_t wpsz, size_t *wbuf_max_sz, wchar_t *old)
+{
+ wchar_t *wbuf;
+ size_t nsz;
+ if (*wbuf_max_sz != wpsz)
+ return old;
+ nsz = (256 > (2 * wbuf_max_sz[0]) ? 256 : (2 * wbuf_max_sz[0]));
+ if (!old)
+ wbuf = (wchar_t *) malloc (nsz * sizeof (wchar_t));
+ else
+ wbuf = (wchar_t *) realloc (old, nsz * sizeof (wchar_t));
+ if (!wbuf)
+ {
+ if (old)
+ free (old);
+ }
+ else
+ *wbuf_max_sz = nsz;
+ return wbuf;
+}
+
+static int
+__mingw_swformat (_IFP *s, const wchar_t *format, va_list argp)
+{
+ const wchar_t *f = format;
+ struct gcollect *gcollect = NULL;
+ size_t read_in = 0, wbuf_max_sz = 0;
+ ssize_t str_sz = 0;
+ char *str = NULL, **pstr = NULL;;
+ wchar_t *wstr = NULL, *wbuf = NULL;
+ wint_t c = 0, rval = 0;
+ int ignore_ws = 0;
+ va_list arg;
+ size_t wbuf_cur_sz, str_len, read_in_sv, new_sz, n;
+ unsigned int fc, npos;
+ int width, flags, base = 0, errno_sv, clen;
+ char seen_dot, seen_exp, is_neg, *nstr, buf[MB_LEN_MAX];
+ wchar_t wc, not_in, *tmp_wbuf_ptr, *temp_wbuf_end, *wbuf_iter;
+ wint_t lc_decimal_point, lc_thousands_sep;
+ mbstate_t state;
+ union {
+ unsigned long long ull;
+ unsigned long ul;
+ long long ll;
+ long l;
+ } cv_val;
+
+ arg = argp;
+
+ if (!s || s->fp == NULL || !format)
+ {
+ errno = EINVAL;
+ return WEOF;
+ }
+
+ memset (&state, 0, sizeof(state));
+ clen = mbrtowc( &wc, localeconv()->decimal_point, 16, &state);
+ lc_decimal_point = (clen > 0 ? wc : '.');
+ memset( &state, 0, sizeof( state ) );
+ clen = mbrtowc( &wc, localeconv()->thousands_sep, 16, &state);
+ lc_thousands_sep = (clen > 0 ? wc : 0);
+
+ while (*f != 0)
+ {
+ fc = *f++;
+ if (fc != '%')
+ {
+ if (iswspace (fc))
+ ignore_ws = 1;
+ else
+ {
+ if ((c = in_ch (s, &read_in)) == WEOF)
+ return cleanup_return ((!rval ? WEOF : rval), &gcollect, pstr, &wbuf);
+
+ if (ignore_ws)
+ {
+ ignore_ws = 0;
+ if (iswspace (c))
+ {
+ do
+ {
+ if ((c = in_ch (s, &read_in)) == WEOF)
+ return cleanup_return ((!rval ? WEOF : rval), &gcollect, pstr, &wbuf);
+ }
+ while (iswspace (c));
+ }
+ }
+
+ if (c != fc)
+ {
+ back_ch (c, s, &read_in, 0);
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+
+ continue;
+ }
+
+ width = flags = 0;
+ npos = 0;
+ wbuf_cur_sz = 0;
+
+ if (iswdigit ((unsigned int) *f))
+ {
+ const wchar_t *svf = f;
+ npos = (unsigned int) *f++ - '0';
+ while (iswdigit ((unsigned int) *f))
+ npos = npos * 10 + ((unsigned int) *f++ - '0');
+ if (*f != '$')
+ {
+ npos = 0;
+ f = svf;
+ }
+ else
+ f++;
+ }
+
+ do
+ {
+ if (*f == '*')
+ flags |= IS_SUPPRESSED;
+ else if (*f == '\'')
+ {
+ if (lc_thousands_sep)
+ flags |= USE_GROUP;
+ }
+ else if (*f == 'I')
+ {
+ /* we don't support locale's digits (i18N), but ignore it for now silently. */
+ ;
+#ifdef _WIN32
+ if (f[1] == '6' && f[2] == '4')
+ {
+ flags |= IS_LL | IS_L;
+ f += 2;
+ }
+ else if (f[1] == '3' && f[2] == '2')
+ {
+ flags |= IS_L;
+ f += 2;
+ }
+ else
+ {
+#ifdef _WIN64
+ flags |= IS_LL | IS_L;
+#else
+ flags |= IS_L;
+#endif
+ }
+#endif
+ }
+ else
+ break;
+ ++f;
+ }
+ while (1);
+
+ while (iswdigit ((unsigned char) *f))
+ width = width * 10 + ((unsigned char) *f++ - '0');
+
+ if (!width)
+ width = -1;
+
+ switch (*f)
+ {
+ case 'h':
+ ++f;
+ flags |= (*f == 'h' ? IS_C : IS_S);
+ if (*f == 'h')
+ ++f;
+ break;
+ case 'l':
+ ++f;
+ flags |= (*f == 'l' ? IS_LL : 0) | IS_L;
+ if (*f == 'l')
+ ++f;
+ break;
+ case 'q': case 'L':
+ ++f;
+ flags |= IS_LL | IS_L;
+ break;
+ case 'a':
+ if (f[1] != 's' && f[1] != 'S' && f[1] != '[')
+ break;
+ ++f;
+ flags |= USE_GNU_ALLOC;
+ break;
+ case 'm':
+ flags |= USE_POSIX_ALLOC;
+ ++f;
+ if (*f == 'l')
+ {
+ flags |= IS_L;
+ ++f;
+ }
+ break;
+ case 'z':
+#ifdef _WIN64
+ flags |= IS_LL | IS_L;
+#else
+ flags |= IS_L;
+#endif
+ ++f;
+ break;
+ case 'j':
+ if (sizeof (uintmax_t) > sizeof (unsigned long))
+ flags |= IS_LL;
+ else if (sizeof (uintmax_t) > sizeof (unsigned int))
+ flags |= IS_L;
+ ++f;
+ break;
+ case 't':
+#ifdef _WIN64
+ flags |= IS_LL;
+#else
+ flags |= IS_L;
+#endif
+ ++f;
+ break;
+ case 0:
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ default:
+ break;
+ }
+
+ if (*f == 0)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+ fc = *f++;
+ if (ignore_ws || (fc != '[' && fc != 'c' && fc != 'C' && fc != 'n'))
+ {
+ errno_sv = errno;
+ errno = 0;
+ do
+ {
+ if ((c == WEOF || (c = in_ch (s, &read_in)) == WEOF) && errno == EINTR)
+ return cleanup_return ((!rval ? WEOF : rval), &gcollect, pstr, &wbuf);
+ }
+ while (iswspace (c));
+
+ ignore_ws = 0;
+ errno = errno_sv;
+ back_ch (c, s, &read_in, 0);
+ }
+
+ switch (fc)
+ {
+ case 'c':
+ if ((flags & IS_L) != 0)
+ fc = 'C';
+ break;
+ case 's':
+ if ((flags & IS_L) != 0)
+ fc = 'S';
+ break;
+ }
+
+ switch (fc)
+ {
+ case '%':
+ if ((c = in_ch (s, &read_in)) == WEOF)
+ return cleanup_return ((!rval ? WEOF : rval), &gcollect, pstr, &wbuf);
+ if (c != fc)
+ {
+ back_ch (c, s, &read_in, 1);
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ break;
+
+ case 'n':
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_LL) != 0)
+ *(npos != 0 ? (long long *) get_va_nth (argp, npos) : va_arg (arg, long long *)) = read_in;
+ else if ((flags & IS_L) != 0)
+ *(npos != 0 ? (long *) get_va_nth (argp, npos) : va_arg (arg, long *)) = read_in;
+ else if ((flags & IS_S) != 0)
+ *(npos != 0 ? (short *) get_va_nth (argp, npos) : va_arg (arg, short *)) = read_in;
+ else if ((flags & IS_C) != 0)
+ *(npos != 0 ? (char *) get_va_nth (argp, npos) : va_arg (arg, char *)) = read_in;
+ else
+ *(npos != 0 ? (int *) get_va_nth (argp, npos) : va_arg (arg, int *)) = read_in;
+ }
+ break;
+
+ case 'c':
+ if (width == -1)
+ width = 1;
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_ALLOC_USED) != 0)
+ {
+ if (npos != 0)
+ pstr = (char **) get_va_nth (argp, npos);
+ else
+ pstr = va_arg (arg, char **);
+
+ if (!pstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ str_sz = 100;
+ if ((str = *pstr = (char *) malloc (100)) == NULL)
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? WEOF : rval), &gcollect, pstr, &wbuf);
+ gcollect = resize_gcollect (gcollect);
+ gcollect->ptrs[gcollect->count++] = pstr;
+ }
+ else
+ {
+ if (npos != 0)
+ str = (char *) get_va_nth (argp, npos);
+ else
+ str = va_arg (arg, char *);
+ if (!str)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+ if ((c = in_ch (s, &read_in)) == WEOF)
+ return cleanup_return ((!rval ? WEOF : rval), &gcollect, pstr, &wbuf);
+
+ memset (&state, 0, sizeof (state));
+
+ do
+ {
+ if ((flags & IS_SUPPRESSED) == 0 && (flags & USE_POSIX_ALLOC) != 0
+ && (str + MB_CUR_MAX) >= (*pstr + str_sz))
+ {
+ new_sz = str_sz * 2;
+ str_len = (str - *pstr);
+ while ((nstr = (char *) realloc (*pstr, new_sz)) == NULL
+ && new_sz > (str_len + MB_CUR_MAX))
+ new_sz = str_len + MB_CUR_MAX;
+ if (!nstr)
+ {
+ release_ptrs (&gcollect, &wbuf);
+ return WEOF;
+ }
+ *pstr = nstr;
+ str = nstr + str_len;
+ str_sz = new_sz;
+ }
+
+ n = wcrtomb ((flags & IS_SUPPRESSED) == 0 ? str : NULL, c, &state);
+ if (n == (size_t) -1LL)
+ return cleanup_return ((!rval ? WEOF : rval), &gcollect, pstr, &wbuf);
+ str += n;
+ }
+ while (--width > 0 && (c = in_ch (s, &read_in)) != WEOF);
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ optimize_alloc ((flags & IS_ALLOC_USED) != 0, pstr, str_sz, (str - *pstr), sizeof (char));
+ pstr = NULL;
+ ++rval;
+ }
+
+ break;
+
+ case 'C':
+ if (width == -1)
+ width = 1;
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_ALLOC_USED) != 0)
+ {
+ if (npos != 0)
+ pstr = (char **) get_va_nth (argp, npos);
+ else
+ pstr = va_arg (arg, char **);
+
+ if (!pstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ str_sz = (width > 1024 ? 1024 : width);
+ *pstr = (char *) malloc (str_sz * sizeof (wchar_t));
+ if ((wstr = (wchar_t *) *pstr) == NULL)
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? WEOF : rval), &gcollect, pstr, &wbuf);
+
+ if ((wstr = (wchar_t *) *pstr) != NULL)
+ {
+ gcollect = resize_gcollect (gcollect);
+ gcollect->ptrs[gcollect->count++] = pstr;
+ }
+ }
+ else
+ {
+ if (npos != 0)
+ wstr = (wchar_t *) get_va_nth (argp, npos);
+ else
+ wstr = va_arg (arg, wchar_t *);
+ if (!wstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+
+ if ((c = in_ch (s, &read_in)) == WEOF)
+ return cleanup_return ((!rval ? WEOF : rval), &gcollect, pstr, &wbuf);
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ do
+ {
+ if ((flags & IS_ALLOC_USED) != 0
+ && wstr == ((wchar_t *) *pstr + str_sz))
+ {
+ new_sz = str_sz + (str_sz > width ? width - 1 : str_sz);
+ while ((wstr = (wchar_t *) realloc (*pstr,
+ new_sz * sizeof (wchar_t))) == NULL
+ && new_sz > (size_t) (str_sz + 1))
+ new_sz = str_sz + 1;
+ if (!wstr)
+ {
+ release_ptrs (&gcollect, &wbuf);
+ return WEOF;
+ }
+ *pstr = (char *) wstr;
+ wstr += str_sz;
+ str_sz = new_sz;
+ }
+ *wstr++ = c;
+ }
+ while (--width > 0 && (c = in_ch (s, &read_in)) != WEOF);
+ }
+ else
+ {
+ while (--width > 0 && (c = in_ch (s, &read_in)) != WEOF);
+ }
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ optimize_alloc ((flags & IS_ALLOC_USED) != 0, pstr, str_sz, (wstr - (wchar_t *) *pstr), sizeof (wchar_t));
+ pstr = NULL;
+ ++rval;
+ }
+ break;
+
+ case 's':
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_ALLOC_USED) != 0)
+ {
+ if (npos != 0)
+ pstr = (char **) get_va_nth (argp, npos);
+ else
+ pstr = va_arg (arg, char **);
+
+ if (!pstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ str_sz = 100;
+ if ((str = *pstr = (char *) malloc (100)) == NULL)
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? WEOF : rval), &gcollect, pstr, &wbuf);
+ gcollect = resize_gcollect (gcollect);
+ gcollect->ptrs[gcollect->count++] = pstr;
+ }
+ else
+ {
+ if (npos != 0)
+ str = (char *) get_va_nth (argp, npos);
+ else
+ str = va_arg (arg, char *);
+ if (!str)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+
+ if ((c = in_ch (s, &read_in)) == WEOF)
+ return cleanup_return ((!rval ? WEOF : rval), &gcollect, pstr, &wbuf);
+
+ memset (&state, 0, sizeof (state));
+
+ do
+ {
+ if (iswspace (c))
+ {
+ back_ch (c, s, &read_in, 1);
+ break;
+ }
+
+ {
+ if ((flags & IS_SUPPRESSED) == 0 && (flags & IS_ALLOC_USED) != 0
+ && (str + MB_CUR_MAX) >= (*pstr + str_sz))
+ {
+ new_sz = str_sz * 2;
+ str_len = (str - *pstr);
+
+ while ((nstr = (char *) realloc (*pstr, new_sz)) == NULL
+ && new_sz > (str_len + MB_CUR_MAX))
+ new_sz = str_len + MB_CUR_MAX;
+ if (!nstr)
+ {
+ if ((flags & USE_POSIX_ALLOC) == 0)
+ {
+ (*pstr)[str_len] = 0;
+ pstr = NULL;
+ ++rval;
+ }
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? WEOF : rval), &gcollect, pstr, &wbuf);
+ }
+ *pstr = nstr;
+ str = nstr + str_len;
+ str_sz = new_sz;
+ }
+
+ n = wcrtomb ((flags & IS_SUPPRESSED) == 0 ? str : NULL, c,
+ &state);
+ if (n == (size_t) -1LL)
+ {
+ errno = EILSEQ;
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+
+ str += n;
+ }
+ }
+ while ((width <= 0 || --width > 0) && (c = in_ch (s, &read_in)) != WEOF);
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ n = wcrtomb (buf, 0, &state);
+ if (n > 0 && (flags & IS_ALLOC_USED) != 0
+ && (str + n) >= (*pstr + str_sz))
+ {
+ str_len = (str - *pstr);
+
+ if ((nstr = (char *) realloc (*pstr, str_len + n + 1)) == NULL)
+ {
+ if ((flags & USE_POSIX_ALLOC) == 0)
+ {
+ (*pstr)[str_len] = 0;
+ pstr = NULL;
+ ++rval;
+ }
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? WEOF : rval), &gcollect, pstr, &wbuf);
+ }
+ *pstr = nstr;
+ str = nstr + str_len;
+ str_sz = str_len + n + 1;
+ }
+
+ if (n)
+ {
+ memcpy (str, buf, n);
+ str += n;
+ }
+ *str++ = 0;
+
+ optimize_alloc ((flags & IS_ALLOC_USED) != 0, pstr, str_sz, (str - *pstr), sizeof (char));
+ pstr = NULL;
+ ++rval;
+ }
+ break;
+
+ case 'S':
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_ALLOC_USED) != 0)
+ {
+ if (npos != 0)
+ pstr = (char **) get_va_nth (argp, npos);
+ else
+ pstr = va_arg (arg, char **);
+
+ if (!pstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ str_sz = 100;
+ *pstr = (char *) malloc (100 * sizeof (wchar_t));
+ if ((wstr = (wchar_t *) *pstr) == NULL)
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? WEOF : rval), &gcollect, pstr, &wbuf);
+ gcollect = resize_gcollect (gcollect);
+ gcollect->ptrs[gcollect->count++] = pstr;
+ }
+ else
+ {
+ if (npos != 0)
+ wstr = (wchar_t *) get_va_nth (argp, npos);
+ else
+ wstr = va_arg (arg, wchar_t *);
+ if (!wstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+ if ((c = in_ch (s, &read_in)) == WEOF)
+ return cleanup_return ((!rval ? WEOF : rval), &gcollect, pstr, &wbuf);
+
+ do
+ {
+ if (iswspace (c))
+ {
+ back_ch (c, s, &read_in, 1);
+ break;
+ }
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ *wstr++ = c;
+ if ((flags & IS_ALLOC_USED) != 0 && wstr == ((wchar_t *) *pstr + str_sz))
+ {
+ new_sz = str_sz * 2;
+
+ while ((wstr = (wchar_t *) realloc (*pstr,
+ new_sz * sizeof (wchar_t))) == NULL
+ && new_sz > (size_t) (str_sz + 1))
+ new_sz = str_sz + 1;
+ if (!wstr)
+ {
+ if ((flags & USE_POSIX_ALLOC) == 0)
+ {
+ ((wchar_t *) (*pstr))[str_sz - 1] = 0;
+ pstr = NULL;
+ ++rval;
+ }
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? WEOF : rval), &gcollect, pstr, &wbuf);
+ }
+ *pstr = (char *) wstr;
+ wstr += str_sz;
+ str_sz = new_sz;
+ }
+ }
+ }
+ while ((width <= 0 || --width > 0) && (c = in_ch (s, &read_in)) != WEOF);
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ *wstr++ = 0;
+
+ optimize_alloc ((flags & IS_ALLOC_USED) != 0, pstr, str_sz, (wstr - (wchar_t *) *pstr), sizeof (wchar_t));
+ pstr = NULL;
+ ++rval;
+ }
+ break;
+
+ case 'd': case 'i':
+ case 'o': case 'p':
+ case 'u':
+ case 'x': case 'X':
+ switch (fc)
+ {
+ case 'd':
+ flags |= IS_SIGNED_NUM;
+ base = 10;
+ break;
+ case 'i':
+ flags |= IS_SIGNED_NUM;
+ base = 0;
+ break;
+ case 'o':
+ base = 8;
+ break;
+ case 'p':
+ base = 16;
+ flags &= ~(IS_S | IS_LL | IS_L);
+ #ifdef _WIN64
+ flags |= IS_LL;
+ #endif
+ flags |= IS_L | IS_POINTER;
+ break;
+ case 'u':
+ base = 10;
+ break;
+ case 'x': case 'X':
+ base = 16;
+ break;
+ }
+
+ if ((c = in_ch (s, &read_in)) == WEOF)
+ return cleanup_return ((!rval ? WEOF : rval), &gcollect, pstr, &wbuf);
+
+ if (c == '+' || c == '-')
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+
+ if (width > 0)
+ --width;
+ c = in_ch (s, &read_in);
+ }
+
+ if (width != 0 && c == '0')
+ {
+ if (width > 0)
+ --width;
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+
+ c = in_ch (s, &read_in);
+
+ if (width != 0 && towlower (c) == 'x')
+ {
+ if (!base)
+ base = 16;
+ if (base == 16)
+ {
+ if (width > 0)
+ --width;
+ c = in_ch (s, &read_in);
+ }
+ }
+ else if (!base)
+ base = 8;
+ }
+
+ if (!base)
+ base = 10;
+
+ while (c != WEOF && width != 0)
+ {
+ if (base == 16)
+ {
+ if (!iswxdigit (c))
+ break;
+ }
+ else if (!iswdigit (c) || (int) (c - '0') >= base)
+ {
+ if (base != 10 || (flags & USE_GROUP) == 0 || c != lc_thousands_sep)
+ break;
+ }
+ if (c != lc_thousands_sep)
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+ }
+
+ if (width > 0)
+ --width;
+
+ c = in_ch (s, &read_in);
+ }
+
+ if (!wbuf_cur_sz || (wbuf_cur_sz == 1 && (wbuf[0] == '+' || wbuf[0] == '-')))
+ {
+ if (!wbuf_cur_sz && (flags & IS_POINTER) != 0
+ && match_string (s, &read_in, &c, L"(nil)"))
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = '0';
+ }
+ else
+ {
+ back_ch (c, s, &read_in, 0);
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+ else
+ back_ch (c, s, &read_in, 0);
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = 0;
+
+ if ((flags & IS_LL) != 0)
+ {
+ if ((flags & IS_SIGNED_NUM) != 0)
+ cv_val.ll = wcstoll (wbuf, &tmp_wbuf_ptr, base/*, flags & USE_GROUP*/);
+ else
+ cv_val.ull = wcstoull (wbuf, &tmp_wbuf_ptr, base/*, flags & USE_GROUP*/);
+ }
+ else
+ {
+ if ((flags & IS_SIGNED_NUM) != 0)
+ cv_val.l = wcstol (wbuf, &tmp_wbuf_ptr, base/*, flags & USE_GROUP*/);
+ else
+ cv_val.ul = wcstoul (wbuf, &tmp_wbuf_ptr, base/*, flags & USE_GROUP*/);
+ }
+ if (wbuf == tmp_wbuf_ptr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_SIGNED_NUM) != 0)
+ {
+ if ((flags & IS_LL) != 0)
+ *(npos != 0 ? (long long *) get_va_nth (argp, npos) : va_arg (arg, long long *)) = cv_val.ll;
+ else if ((flags & IS_L) != 0)
+ *(npos != 0 ? (long *) get_va_nth (argp, npos) : va_arg (arg, long *)) = cv_val.l;
+ else if ((flags & IS_S) != 0)
+ *(npos != 0 ? (short *) get_va_nth (argp, npos) : va_arg (arg, short *)) = (short) cv_val.l;
+ else if ((flags & IS_C) != 0)
+ *(npos != 0 ? (signed char *) get_va_nth (argp, npos) : va_arg (arg, signed char *)) = (signed char) cv_val.ul;
+ else
+ *(npos != 0 ? (int *) get_va_nth (argp, npos) : va_arg (arg, int *)) = (int) cv_val.l;
+ }
+ else
+ {
+ if ((flags & IS_LL) != 0)
+ *(npos != 0 ? (unsigned long long *) get_va_nth (argp, npos) : va_arg (arg, unsigned long long *)) = cv_val.ull;
+ else if ((flags & IS_L) != 0)
+ *(npos != 0 ? (unsigned long *) get_va_nth (argp, npos) : va_arg (arg, unsigned long *)) = cv_val.ul;
+ else if ((flags & IS_S) != 0)
+ *(npos != 0 ? (unsigned short *) get_va_nth (argp, npos) : va_arg (arg, unsigned short *))
+ = (unsigned short) cv_val.ul;
+ else if ((flags & IS_C) != 0)
+ *(npos != 0 ? (unsigned char *) get_va_nth (argp, npos) : va_arg (arg, unsigned char *)) = (unsigned char) cv_val.ul;
+ else
+ *(npos != 0 ? (unsigned int *) get_va_nth (argp, npos) : va_arg (arg, unsigned int *)) = (unsigned int) cv_val.ul;
+ }
+ ++rval;
+ }
+ break;
+
+ case 'e': case 'E':
+ case 'f': case 'F':
+ case 'g': case 'G':
+ case 'a': case 'A':
+ if (width > 0)
+ --width;
+ if ((c = in_ch (s, &read_in)) == WEOF)
+ return cleanup_return ((!rval ? WEOF : rval), &gcollect, pstr, &wbuf);
+
+ seen_dot = seen_exp = 0;
+ is_neg = (c == '-' ? 1 : 0);
+
+ if (c == '-' || c == '+')
+ {
+ if (width == 0 || (c = in_ch (s, &read_in)) == WEOF)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ if (width > 0)
+ --width;
+ }
+
+ if (towlower (c) == 'n')
+ {
+ const wchar_t *match_txt = L"nan";
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+
+ ++match_txt;
+ do
+ {
+ if (width == 0 || (c = in_ch (s, &read_in)) == WEOF
+ || towlower (c) != match_txt[0])
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ if (width > 0)
+ --width;
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+ ++match_txt;
+ }
+ while (*match_txt != 0);
+ }
+ else if (towlower (c) == 'i')
+ {
+ const wchar_t *match_txt = L"inf";
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+
+ ++match_txt;
+ do
+ {
+ if (width == 0 || (c = in_ch (s, &read_in)) == WEOF
+ || towlower (c) != match_txt[0])
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ if (width > 0)
+ --width;
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+ ++match_txt;
+ }
+ while (*match_txt != 0);
+
+ if (width != 0 && (c = in_ch (s, &read_in)) != WEOF && towlower (c) == 'i')
+ {
+ match_txt = L"inity";
+ if (width > 0)
+ --width;
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+
+ ++match_txt;
+ do
+ {
+ if (width == 0 || (c = in_ch (s, &read_in)) == WEOF
+ || towlower (c) != match_txt[0])
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ if (width > 0)
+ --width;
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+ ++match_txt;
+ }
+ while (*match_txt != 0);
+ }
+ else if (width != 0 && c != WEOF)
+ back_ch (c, s, &read_in, 0);
+ }
+ else
+ {
+ not_in = 'e';
+ if (width != 0 && c == '0')
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+
+ c = in_ch (s, &read_in);
+ if (width > 0)
+ --width;
+ if (width != 0 && towlower (c) == 'x')
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+ flags |= IS_HEX_FLOAT;
+ not_in = 'p';
+
+ flags &= ~USE_GROUP;
+ c = in_ch (s, &read_in);
+ if (width > 0)
+ --width;
+ }
+ }
+
+ while (1)
+ {
+ if (iswdigit (c))
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+ }
+ else if (!seen_exp && (flags & IS_HEX_FLOAT) != 0 && iswxdigit (c))
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+ }
+ else if (seen_exp && wbuf[wbuf_cur_sz - 1] == not_in
+ && (c == '-' || c == '+'))
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+ }
+ else if (wbuf_cur_sz > 0 && !seen_exp
+ && (wchar_t) towlower (c) == not_in)
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = not_in;
+
+ seen_exp = seen_dot = 1;
+ }
+ else
+ {
+ if (!seen_dot && c == lc_decimal_point)
+ {
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = c;
+
+ seen_dot = 1;
+ }
+ else if ((flags & USE_GROUP) != 0 && !seen_dot && c == lc_thousands_sep)
+ {
+ /* As our conversion routines aren't supporting thousands
+ separators, we are filtering them here. */
+ }
+ else
+ {
+ back_ch (c, s, &read_in, 0);
+ break;
+ }
+ }
+
+ if (width == 0 || (c = in_ch (s, &read_in)) == WEOF)
+ break;
+
+ if (width > 0)
+ --width;
+ }
+
+ if (wbuf_cur_sz == 0 || ((flags & IS_HEX_FLOAT) != 0 && wbuf_cur_sz == 2))
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+
+ wbuf = resize_wbuf (wbuf_cur_sz, &wbuf_max_sz, wbuf);
+ wbuf[wbuf_cur_sz++] = 0;
+
+ if ((flags & IS_LL) != 0)
+ {
+ long double d = __mingw_wcstold (wbuf, &tmp_wbuf_ptr/*, flags & USE_GROUP*/);
+ if ((flags & IS_SUPPRESSED) == 0 && tmp_wbuf_ptr != wbuf)
+ *(npos != 0 ? (long double *) get_va_nth (argp, npos) : va_arg (arg, long double *)) = is_neg ? -d : d;
+ }
+ else if ((flags & IS_L) != 0)
+ {
+ double d = __mingw_wcstod (wbuf, &tmp_wbuf_ptr/*, flags & USE_GROUP*/);
+ if ((flags & IS_SUPPRESSED) == 0 && tmp_wbuf_ptr != wbuf)
+ *(npos != 0 ? (double *) get_va_nth (argp, npos) : va_arg (arg, double *)) = is_neg ? -d : d;
+ }
+ else
+ {
+ float d = __mingw_wcstof (wbuf, &tmp_wbuf_ptr/*, flags & USE_GROUP*/);
+ if ((flags & IS_SUPPRESSED) == 0 && tmp_wbuf_ptr != wbuf)
+ *(npos != 0 ? (float *) get_va_nth (argp, npos) : va_arg (arg, float *)) = is_neg ? -d : d;
+ }
+
+ if (wbuf == tmp_wbuf_ptr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ ++rval;
+ break;
+
+ case '[':
+ if ((flags & IS_L) != 0)
+ {
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_ALLOC_USED) != 0)
+ {
+ if (npos != 0)
+ pstr = (char **) get_va_nth (argp, npos);
+ else
+ pstr = va_arg (arg, char **);
+
+ if (!pstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ str_sz = 100;
+ *pstr = (char *) malloc (100 * sizeof (wchar_t));
+ if ((wstr = (wchar_t *) *pstr) == NULL)
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? WEOF : rval), &gcollect, pstr, &wbuf);
+
+ gcollect = resize_gcollect (gcollect);
+ gcollect->ptrs[gcollect->count++] = pstr;
+ }
+ else
+ {
+ if (npos != 0)
+ wstr = (wchar_t *) get_va_nth (argp, npos);
+ else
+ wstr = va_arg (arg, wchar_t *);
+ if (!wstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+
+ }
+ else if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_ALLOC_USED) != 0)
+ {
+ if (npos != 0)
+ pstr = (char **) get_va_nth (argp, npos);
+ else
+ pstr = va_arg (arg, char **);
+
+ if (!pstr)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ str_sz = 100;
+ if ((str = *pstr = (char *) malloc (100)) == NULL)
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? WEOF : rval), &gcollect, pstr, &wbuf);
+ gcollect = resize_gcollect (gcollect);
+ gcollect->ptrs[gcollect->count++] = pstr;
+ }
+ else
+ {
+ if (npos != 0)
+ str = (char *) get_va_nth (argp, npos);
+ else
+ str = va_arg (arg, char *);
+ if (!str)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+
+ not_in = (*f == '^' ? 1 : 0);
+ if (*f == '^')
+ f++;
+
+ if (width < 0)
+ width = INT_MAX;
+
+ tmp_wbuf_ptr = (wchar_t *) f;
+
+ if (*f == L']')
+ ++f;
+
+ while ((fc = *f++) != 0 && fc != L']');
+
+ if (fc == 0)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ temp_wbuf_end = (wchar_t *) f - 1;
+
+ if ((flags & IS_L) != 0)
+ {
+ read_in_sv = read_in;
+
+ if ((c = in_ch (s, &read_in)) == WEOF)
+ return cleanup_return ((!rval ? WEOF : rval), &gcollect, pstr, &wbuf);
+
+ do
+ {
+ int ended = 0;
+ for (wbuf_iter = tmp_wbuf_ptr; wbuf_iter < temp_wbuf_end;)
+ {
+ if (wbuf_iter[0] == '-' && wbuf_iter[1] != 0
+ && (wbuf_iter + 1) != temp_wbuf_end
+ && wbuf_iter != tmp_wbuf_ptr
+ && (unsigned int) wbuf_iter[-1] <= (unsigned int) wbuf_iter[1])
+ {
+ for (wc = wbuf_iter[-1] + 1; wc <= wbuf_iter[1] && (wint_t) wc != c; ++wc);
+
+ if (wc <= wbuf_iter[1] && !not_in)
+ break;
+ if (wc <= wbuf_iter[1] && not_in)
+ {
+ back_ch (c, s, &read_in, 0);
+ ended = 1;
+ break;
+ }
+
+ wbuf_iter += 2;
+ }
+ else
+ {
+ if ((wint_t) *wbuf_iter == c && !not_in)
+ break;
+ if ((wint_t) *wbuf_iter == c && not_in)
+ {
+ back_ch (c, s, &read_in, 0);
+ ended = 1;
+ break;
+ }
+
+ ++wbuf_iter;
+ }
+ }
+ if (ended)
+ break;
+
+ if (wbuf_iter == temp_wbuf_end && !not_in)
+ {
+ back_ch (c, s, &read_in, 0);
+ break;
+ }
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ *wstr++ = c;
+
+ if ((flags & IS_ALLOC_USED) != 0
+ && wstr == ((wchar_t *) *pstr + str_sz))
+ {
+ new_sz = str_sz * 2;
+ while ((wstr = (wchar_t *) realloc (*pstr,
+ new_sz * sizeof (wchar_t))) == NULL
+ && new_sz > (size_t) (str_sz + 1))
+ new_sz = str_sz + 1;
+ if (!wstr)
+ {
+ if ((flags & USE_POSIX_ALLOC) == 0)
+ {
+ ((wchar_t *) (*pstr))[str_sz - 1] = 0;
+ pstr = NULL;
+ ++rval;
+ }
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? WEOF : rval), &gcollect, pstr, &wbuf);
+ }
+ *pstr = (char *) wstr;
+ wstr += str_sz;
+ str_sz = new_sz;
+ }
+ }
+ }
+ while (--width > 0 && (c = in_ch (s, &read_in)) != WEOF);
+
+ if (read_in_sv == read_in)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ *wstr++ = 0;
+
+ optimize_alloc ((flags & IS_ALLOC_USED) != 0, pstr, str_sz, (wstr - (wchar_t *) *pstr), sizeof (wchar_t));
+ pstr = NULL;
+ ++rval;
+ }
+ }
+ else
+ {
+ read_in_sv = read_in;
+
+ if ((c = in_ch (s, &read_in)) == WEOF)
+ return cleanup_return ((!rval ? WEOF : rval), &gcollect, pstr, &wbuf);
+
+ memset (&state, 0, sizeof (state));
+
+ do
+ {
+ int ended = 0;
+ wbuf_iter = tmp_wbuf_ptr;
+ while (wbuf_iter < temp_wbuf_end)
+ {
+ if (wbuf_iter[0] == '-' && wbuf_iter[1] != 0
+ && (wbuf_iter + 1) != temp_wbuf_end
+ && wbuf_iter != tmp_wbuf_ptr
+ && (unsigned int) wbuf_iter[-1] <= (unsigned int) wbuf_iter[1])
+ {
+ for (wc = wbuf_iter[-1] + 1; wc <= wbuf_iter[1] && (wint_t) wc != c; ++wc);
+
+ if (wc <= wbuf_iter[1] && !not_in)
+ break;
+ if (wc <= wbuf_iter[1] && not_in)
+ {
+ back_ch (c, s, &read_in, 0);
+ ended = 1;
+ break;
+ }
+
+ wbuf_iter += 2;
+ }
+ else
+ {
+ if ((wint_t) *wbuf_iter == c && !not_in)
+ break;
+ if ((wint_t) *wbuf_iter == c && not_in)
+ {
+ back_ch (c, s, &read_in, 0);
+ ended = 1;
+ break;
+ }
+
+ ++wbuf_iter;
+ }
+ }
+
+ if (ended)
+ break;
+ if (wbuf_iter == temp_wbuf_end && !not_in)
+ {
+ back_ch (c, s, &read_in, 0);
+ break;
+ }
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ if ((flags & IS_ALLOC_USED) != 0
+ && (str + MB_CUR_MAX) >= (*pstr + str_sz))
+ {
+ new_sz = str_sz * 2;
+ str_len = (str - *pstr);
+
+ while ((nstr = (char *) realloc (*pstr, new_sz)) == NULL
+ && new_sz > (str_len + MB_CUR_MAX))
+ new_sz = str_len + MB_CUR_MAX;
+ if (!nstr)
+ {
+ if ((flags & USE_POSIX_ALLOC) == 0)
+ {
+ ((*pstr))[str_len] = 0;
+ pstr = NULL;
+ ++rval;
+ }
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? WEOF : rval), &gcollect, pstr, &wbuf);
+ }
+ *pstr = nstr;
+ str = nstr + str_len;
+ str_sz = new_sz;
+ }
+ }
+
+ n = wcrtomb ((flags & IS_SUPPRESSED) == 0 ? str : NULL, c, &state);
+ if (n == (size_t) -1LL)
+ {
+ errno = EILSEQ;
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+
+ str += n;
+ }
+ while (--width > 0 && (c = in_ch (s, &read_in)) != WEOF);
+
+ if (read_in_sv == read_in)
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+
+ if ((flags & IS_SUPPRESSED) == 0)
+ {
+ n = wcrtomb (buf, 0, &state);
+ if (n > 0 && (flags & IS_ALLOC_USED) != 0
+ && (str + n) >= (*pstr + str_sz))
+ {
+ str_len = (str - *pstr);
+
+ if ((nstr = (char *) realloc (*pstr, str_len + n + 1)) == NULL)
+ {
+ if ((flags & USE_POSIX_ALLOC) == 0)
+ {
+ (*pstr)[str_len] = 0;
+ pstr = NULL;
+ ++rval;
+ }
+ return cleanup_return (((flags & USE_POSIX_ALLOC) != 0 ? WEOF : rval), &gcollect, pstr, &wbuf);
+ }
+ *pstr = nstr;
+ str = nstr + str_len;
+ str_sz = str_len + n + 1;
+ }
+
+ if (n)
+ {
+ memcpy (str, buf, n);
+ str += n;
+ }
+ *str++ = 0;
+
+ optimize_alloc ((flags & IS_ALLOC_USED) != 0, pstr, str_sz, (str - *pstr), sizeof (char));
+ pstr = NULL;
+ ++rval;
+ }
+ }
+ break;
+
+ default:
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+ }
+ }
+
+ if (ignore_ws)
+ {
+ while (iswspace ((c = in_ch (s, &read_in))));
+ back_ch (c, s, &read_in, 0);
+ }
+
+ return cleanup_return (rval, &gcollect, pstr, &wbuf);
+}
+
+int
+__mingw_vfwscanf (FILE *s, const wchar_t *format, va_list argp)
+{
+ _IFP ifp;
+ memset (&ifp, 0, sizeof (_IFP));
+ ifp.fp = s;
+ return __mingw_swformat (&ifp, format, argp);
+}
+
+int
+__mingw_vswscanf (const wchar_t *s, const wchar_t *format, va_list argp)
+{
+ _IFP ifp;
+ memset (&ifp, 0, sizeof (_IFP));
+ ifp.str = s;
+ ifp.is_string = 1;
+ return __mingw_swformat (&ifp, format, argp);
+}
+
libc/mingw/stdio/scanf.S
@@ -0,0 +1,232 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+/* vsscanf, vswscanf, vfscanf, and vfwscanf all come here for i386 and arm.
+
+ The goal of this routine is to turn a call to v*scanf into a call to
+ s*scanf. This is needed because mingw-w64 uses msvcr100.dll, which doesn't
+ support the v*scanf functions instead of msvcr120.dll which does.
+ Unfortunately, there is no defined way to know exactly how big a va_list
+ is, so we use a hard-coded buffer.
+
+ I suppose a sufficiently-motivated person could try to parse the format
+ to figure out how many tokens there are... */
+
+/* The function prototype here is (essentially):
+
+ int __ms_vsscanf_internal (void *s,
+ void *format,
+ void *arg,
+ void *func);
+
+ I say 'essentially' because passing a function pointer as void in ISO
+ is not supported. But in the end, I take the first parameter (which
+ may be a char *, a wchar_t *, or a FILE *) and put it into the newly
+ formed stack, and eventually call the address in func. */
+
+#if defined (__x86_64__)
+
+ .text
+ .align 16
+
+ /* scl 2: C_EXT - External (public) symbol - covers globals and externs
+ type 32: DT_FCN - function returning T
+ */
+ .def __argtos; .scl 2; .type 32; .endef
+
+ /* The max number of pointers we support. Must be an even number
+ to keep the 64bit stack 16byte aligned. Must not be less than 4. */
+ .equ entries, 30
+
+ /* 64bit pointers are 8 bytes. */
+ .equ sizeof, 8
+
+ /* Size of our buffer. */
+ .equ iBytes, entries * sizeof
+
+ /* Stack space for first 2 args to s*scanf. */
+ .equ iOffset, (2 * sizeof)
+
+ .seh_proc __argtos
+__argtos:
+
+ /* When we are done:
+ - s must be in rcx. That's where it is on entry.
+ - format must be in rdx. That's where it is on entry.
+ - The first pointer in arg must be in r8. arg is in r8 on entry.
+ - The second pointer in arg must be in r9. arg is in r8 on entry.
+ - The ($entries - 2) other pointers in arg must be on the stack,
+ starting 32bytes into rsp. */
+
+ /* We need enough room to shadow (s + format)
+ + (enough room for all the other args). */
+ subq $(iOffset + iBytes), %rsp
+ .seh_stackalloc iOffset + iBytes
+
+ .seh_endprologue
+
+ /* We are going to copy $entries pointers from arg to our
+ local stack. Except the first 2, since they will be
+ loaded in registers. */
+ movq $entries - 2, %r10 /* # of ptrs to copy. */
+
+ /* The first 32 bytes are in registers, but by spec, space
+ must still be reserved for them on the stack. Put the
+ rest of the pointers in the stack after that. */
+ lea 32(%rsp), %r11 /* dst. */
+
+.LOOP:
+ subq $1, %r10
+
+ /* Use 16 to skip over the first 2 pointers. */
+ movq 16(%r8, %r10, 8), %rax
+ movq %rax, (%r11, %r10, 8)
+ jnz .LOOP
+
+ /* r9 contains the routine we are going to call. Since we are about to
+ overwrite it, move it somewhere safe. */
+ movq %r9, %r10
+
+ /* The stack is now correctly populated, and so are rcx and rdx.
+ But we need to load the last 2 regs before making the call. */
+ movq 0x8(%r8), %r9 /* 2nd dest location (may be garbage if only 1 arg). */
+ movq (%r8), %r8 /* 1st dest location. */
+
+ /* Make the call. */
+ callq *%r10
+
+ addq $(iOffset + iBytes), %rsp
+
+ retq
+ .seh_endproc
+
+#elif defined (_X86_)
+
+ .text
+ .align 16
+
+ /* scl 2: C_EXT - External (public) symbol - covers globals and externs
+ type 32: DT_FCN - function returning T
+ */
+ .def __argtos; .scl 2; .type 32; .endef
+
+ /* The max number of pointers we support. Must not be less than 1. */
+ .equ entries, 30
+
+ /* 64bit pointers are 8 bytes. */
+ .equ sizeof, 4
+
+ /* Size of our buffer. */
+ .set iBytes, entries * sizeof
+
+ /* Stack space for first 2 args to s*scanf. */
+ .equ iOffset, (2 * sizeof)
+
+__argtos:
+ pushl %ebp
+ movl %esp, %ebp
+ pushl %edi
+
+ /* Reserve enough stack space for everything.
+
+ Stack usage will look like:
+ 4 bytes - s
+ 4 bytes - format
+ (iBytes) bytes - variable # of parameters for sscanf (all ptrs). */
+
+ subl $(iOffset + iBytes), %esp
+
+ /* Write out s and format where they need to be for the sscanf call. */
+ movl 8(%ebp), %eax
+ movl %eax, (%esp) /* s. */
+ movl 12(%ebp), %edx
+ movl %edx, 0x4(%esp) /* format. */
+
+ /* We are going to copy $entries pointers from arg to our
+ local stack. */
+ movl $entries, %ecx /* # of ptrs to copy. */
+ lea iOffset(%esp), %edi /* dst. */
+ movl 16(%ebp), %edx /* src. */
+
+.LOOP:
+ subl $1, %ecx
+
+ movl (%edx, %ecx, 4), %eax
+ movl %eax, (%edi, %ecx, 4)
+ jnz .LOOP
+
+ /* The stack is now correctly populated. */
+
+ /* Make the call. */
+ call *20(%ebp)
+
+ /* Restore stack. */
+ popl %edi
+ leave
+
+ ret
+
+#elif defined (__arm__)
+
+ .text
+ .align 2
+ .thumb_func
+ .globl __argtos
+
+__argtos:
+ push {r4-r7, lr}
+ sub sp, sp, #128
+ mov r12, r3
+ mov r4, sp
+
+ ldr r5, [r2], #4
+ ldr r6, [r2], #4
+
+ mov r3, #116
+1: ldr r7, [r2], #4
+ str r7, [r4], #4
+ subs r3, r3, #4
+ bne 1b
+
+ mov r2, r5
+ mov r3, r6
+ blx r12
+ add sp, sp, #128
+ pop {r4-r7, pc}
+
+#elif defined (__aarch64__)
+
+ .text
+ .align 2
+ .globl __argtos
+
+__argtos:
+ stp x29, x30, [sp, #-16]!
+ mov x29, sp
+ sub sp, sp, #256
+ mov x9, sp
+ mov x10, x2
+ mov x11, x3
+
+ ldr x2, [x10], #8
+ ldr x3, [x10], #8
+ ldr x4, [x10], #8
+ ldr x5, [x10], #8
+ ldr x6, [x10], #8
+ ldr x7, [x10], #8
+
+ mov x12, #240
+1: ldr x13, [x10], #8
+ str x13, [x9], #8
+ subs x12, x12, #8
+ b.ne 1b
+
+ blr x11
+ mov sp, x29
+ ldp x29, x30, [sp], #16
+ ret
+
+#endif
libc/mingw/stdio/scanf2-template.S
@@ -0,0 +1,32 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#if defined(_ARM_) || defined(__arm__)
+ .thumb
+#endif
+ .text
+ .p2align 4,,15
+ .globl FCT
+ .def FCT; .scl 2; .type 32; .endef
+#ifdef __x86_64__
+ .seh_proc FCT
+#endif
+FCT:
+#ifdef __x86_64__
+ .seh_endprologue
+#endif
+#if defined(_AMD64_) || defined(__x86_64__) || defined(_X86_) || defined(__i386__)
+ jmp FWD
+#elif defined(_ARM_) || defined(__arm__)
+ .thumb_func
+ b FWD
+#elif defined(_ARM64_) || defined(__aarch64__)
+ b FWD
+#endif
+#ifdef __x86_64__
+ .seh_endproc
+#endif
+ .def FWD; .scl 2; .type 32; .endef
libc/mingw/stdio/snprintf.c
@@ -0,0 +1,18 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <stdarg.h>
+#include <stdio.h>
+
+int __cdecl __ms_snprintf(char* buffer, size_t n, const char *format, ...)
+{
+ int retval;
+ va_list argptr;
+
+ va_start(argptr, format);
+ retval = _vsnprintf (buffer, n, format, argptr);
+ va_end(argptr);
+ return retval;
+}
libc/mingw/stdio/snwprintf.c
@@ -0,0 +1,18 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <stdarg.h>
+#include <wchar.h>
+
+int __cdecl __ms_snwprintf(wchar_t *buffer, size_t n, const wchar_t *format, ...)
+{
+ int retval;
+ va_list argptr;
+
+ va_start(argptr, format);
+ retval = _vsnwprintf(buffer, n, format, argptr);
+ va_end(argptr);
+ return retval;
+}
libc/mingw/stdio/strtof.c
@@ -0,0 +1,11 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <stdlib.h>
+
+float strtof( const char *nptr, char **endptr)
+{
+ return (strtod(nptr, endptr));
+}
libc/mingw/stdio/strtok_r.c
@@ -0,0 +1,98 @@
+/*-
+ * Copyright (c) 1998 Softweyr LLC. All rights reserved.
+ *
+ * strtok_r, from Berkeley strtok
+ * Oct 13, 1998 by Wes Peters <wes@softweyr.com>
+ *
+ * Copyright (c) 1988, 1993
+ * The 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
+ * notices, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notices, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. 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 SOFTWEYR LLC, 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 SOFTWEYR LLC, 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.
+ */
+
+#define _POSIX_SOURCE 1
+#include <string.h>
+
+/*
+ * strtok_r documentation:
+ * http://pubs.opengroup.org/onlinepubs/009695399/functions/strtok.html
+ *
+ * Implementation:
+ * http://svnweb.freebsd.org/base/head/lib/libc/string/strtok.c?view=co
+ *
+ * strtok_r cannot completely be implemented by strtok because of the internal state.
+ * It breaks when used on 2 strings where they are scanned A, B then A, B.
+ * Thread-safety is not the issue.
+ *
+ * Sample strtok implemenatation, note the internal state:
+ * char *strtok(char *s, const char *d) { static char *t; return strtok_r(s,d,t); }
+ *
+ */
+
+char *
+strtok_r(char * __restrict s, const char * __restrict delim, char ** __restrict last)
+{
+ char *spanp, *tok;
+ int c, sc;
+
+ if (s == NULL && (s = *last) == NULL)
+ return (NULL);
+
+ /*
+ * Skip (span) leading delimiters (s += strspn(s, delim), sort of).
+ */
+cont:
+ c = *s++;
+ for (spanp = (char *)delim; (sc = *spanp++) != 0;) {
+ if (c == sc)
+ goto cont;
+ }
+
+ if (c == 0) { /* no non-delimiter characters */
+ *last = NULL;
+ return (NULL);
+ }
+ tok = s - 1;
+
+ /*
+ * Scan token (scan for delimiters: s += strcspn(s, delim), sort of).
+ * Note that delim must have one NUL; we stop if we see that, too.
+ */
+ for (;;) {
+ c = *s++;
+ spanp = (char *)delim;
+ do {
+ if ((sc = *spanp++) == c) {
+ if (c == 0)
+ s = NULL;
+ else
+ s[-1] = '\0';
+ *last = s;
+ return (tok);
+ }
+ } while (sc != 0);
+ }
+ /* NOTREACHED */
+}
libc/mingw/stdio/truncate.c
@@ -0,0 +1,25 @@
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+
+int truncate(const char *pathname, _off_t len){
+ int ret, err;
+ int fd = _open(pathname,_O_BINARY|_O_RDWR);
+ if (fd == -1) return fd;
+ ret = ftruncate(fd,len);
+ _get_errno(&err);
+ _close(fd);
+ _set_errno(err);
+ return ret;
+}
+
+int truncate64(const char *pathname, _off64_t len){
+ int ret, err;
+ int fd = _open(pathname,_O_BINARY|_O_RDWR);
+ if (fd == -1) return fd;
+ ret = ftruncate64(fd,len);
+ _get_errno(&err);
+ _close(fd);
+ _set_errno(err);
+ return ret;
+}
libc/mingw/stdio/ulltoa.c
@@ -0,0 +1,10 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __CRT__NO_INLINE
+#include <stdlib.h>
+
+char* ulltoa(unsigned long long _n, char * _c, int _i)
+ { return _ui64toa (_n, _c, _i); }
libc/mingw/stdio/ulltow.c
@@ -0,0 +1,10 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __CRT__NO_INLINE
+#include <stdlib.h>
+
+wchar_t* ulltow(unsigned long long _n, wchar_t * _w, int _i)
+ { return _ui64tow (_n, _w, _i); }
libc/mingw/stdio/vasprintf.c
@@ -0,0 +1,25 @@
+#define _GNU_SOURCE
+#define __CRT__NO_INLINE
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+
+int vasprintf(char ** __restrict__ ret,
+ const char * __restrict__ format,
+ va_list ap) {
+ int len;
+ /* Get Length */
+ len = _vsnprintf(NULL,0,format,ap);
+ if (len < 0) return -1;
+ /* +1 for \0 terminator. */
+ *ret = malloc(len + 1);
+ /* Check malloc fail*/
+ if (!*ret) return -1;
+ /* Write String */
+ _vsnprintf(*ret,len+1,format,ap);
+ /* Terminate explicitly */
+ (*ret)[len] = '\0';
+ return len;
+}
+
libc/mingw/stdio/vfscanf.c
@@ -0,0 +1,31 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <stdio.h>
+#include <stdarg.h>
+
+extern int __ms_vfscanf_internal (
+ FILE * s,
+ const char * format,
+ va_list arg,
+ int (*func)(FILE * __restrict__, const char * __restrict__, ...))
+ asm("__argtos");
+
+int __ms_vfscanf (FILE * __restrict__ stream, const char * __restrict__ format, va_list arg)
+{
+ int ret;
+
+#if defined(_AMD64_) || defined(__x86_64__) || \
+ defined(_X86_) || defined(__i386__) || \
+ defined(_ARM_) || defined(__arm__) || \
+ defined(_ARM64_) || defined(__aarch64__)
+ ret = __ms_vfscanf_internal (stream, format, arg, fscanf);
+#else
+#error "unknown platform"
+#endif
+
+ return ret;
+}
libc/mingw/stdio/vfscanf2.S
@@ -0,0 +1,12 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+#define FCT __MINGW_USYMBOL(vfscanf)
+#define FWD __MINGW_USYMBOL(__ms_vfscanf)
+
+ .file "vfscanf2.S"
+#include "scanf2-template.S"
libc/mingw/stdio/vfwscanf.c
@@ -0,0 +1,32 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <stdarg.h>
+#include <wchar.h>
+
+extern int __ms_vfwscanf_internal (
+ FILE * s,
+ const wchar_t * format,
+ va_list arg,
+ int (*func)(FILE * __restrict__, const wchar_t * __restrict__, ...))
+ asm("__argtos");
+
+int __ms_vfwscanf (FILE * __restrict__ stream,
+ const wchar_t * __restrict__ format, va_list arg)
+{
+ int ret;
+
+#if defined(_AMD64_) || defined(__x86_64__) || \
+ defined(_X86_) || defined(__i386__) || \
+ defined(_ARM_) || defined(__arm__) || \
+ defined (_ARM64_) || defined (__aarch64__)
+ ret = __ms_vfwscanf_internal (stream, format, arg, fwscanf);
+#else
+#error "unknown platform"
+#endif
+
+ return ret;
+}
libc/mingw/stdio/vfwscanf2.S
@@ -0,0 +1,12 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+#define FCT __MINGW_USYMBOL(vfwscanf)
+#define FWD __MINGW_USYMBOL(__ms_vfwscanf)
+
+ .file "vfwscanf2.S"
+#include "scanf2-template.S"
libc/mingw/stdio/vscanf.c
@@ -0,0 +1,15 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+// By aaronwl 2003-01-28 for mingw-msvcrt
+// Public domain: all copyrights disclaimed, absolutely no warranties
+
+#include <stdarg.h>
+#include <stdio.h>
+
+int __ms_vscanf(const char * __restrict__ format, va_list arg)
+{
+ return __ms_vfscanf(stdin, format, arg);
+}
libc/mingw/stdio/vscanf2.S
@@ -0,0 +1,12 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+#define FCT __MINGW_USYMBOL(vscanf)
+#define FWD __MINGW_USYMBOL(__ms_vscanf)
+
+ .file "vscanf2.S"
+#include "scanf2-template.S"
libc/mingw/stdio/vsnprintf.c
@@ -0,0 +1,13 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __CRT__NO_INLINE
+#include <stdarg.h>
+#include <stdio.h>
+
+int __cdecl __ms_vsnprintf (char *s,size_t n,const char *format,va_list arg)
+{
+ return _vsnprintf(s, n, format, arg);
+}
libc/mingw/stdio/vsnwprintf.c
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __CRT__NO_INLINE
+#include <_mingw.h>
+#include <stdarg.h>
+#include <wchar.h>
+
+int __cdecl __ms_vsnwprintf(wchar_t *buffer, size_t n, const wchar_t * format, va_list argptr);
+
+int __cdecl __ms_vsnwprintf(wchar_t *buffer, size_t n, const wchar_t * format, va_list argptr)
+{
+ return _vsnwprintf(buffer, n, format, argptr);
+}
libc/mingw/stdio/vsscanf.c
@@ -0,0 +1,32 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+
+extern int __ms_vsscanf_internal (
+ const char * s,
+ const char * format,
+ va_list arg,
+ int (*func)(const char * __restrict__, const char * __restrict__, ...))
+ asm("__argtos");
+
+int __ms_vsscanf (const char * __restrict__ s,
+ const char * __restrict__ format, va_list arg)
+{
+ int ret;
+
+#if defined(_AMD64_) || defined(__x86_64__) || \
+ defined(_X86_) || defined(__i386__) || \
+ defined(_ARM_) || defined(__arm__) || \
+ defined(_ARM64_) || defined(__aarch64__)
+ ret = __ms_vsscanf_internal (s, format, arg, sscanf);
+#else
+#error "unknown platform"
+#endif
+
+ return ret;
+}
libc/mingw/stdio/vsscanf2.S
@@ -0,0 +1,12 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+#define FCT __MINGW_USYMBOL(vsscanf)
+#define FWD __MINGW_USYMBOL(__ms_vsscanf)
+
+ .file "vsscanf2.S"
+#include "scanf2-template.S"
libc/mingw/stdio/vswscanf.c
@@ -0,0 +1,32 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <stdarg.h>
+#include <wchar.h>
+
+extern int __ms_vswscanf_internal (
+ const wchar_t * s,
+ const wchar_t * format,
+ va_list arg,
+ int (*func)(const wchar_t * __restrict__, const wchar_t * __restrict__, ...))
+ asm("__argtos");
+
+int __ms_vswscanf(const wchar_t * __restrict__ s, const wchar_t * __restrict__ format,
+ va_list arg)
+{
+ int ret;
+
+#if defined(_AMD64_) || defined(__x86_64__) || \
+ defined(_X86_) || defined(__i386__) || \
+ defined(_ARM_) || defined(__arm__) || \
+ defined(_ARM64_) || defined(__aarch64__)
+ ret = __ms_vswscanf_internal (s, format, arg, swscanf);
+#else
+#error "unknown platform"
+#endif
+
+ return ret;
+}
libc/mingw/stdio/vswscanf2.S
@@ -0,0 +1,12 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+#define FCT __MINGW_USYMBOL(vswscanf)
+#define FWD __MINGW_USYMBOL(__ms_vswscanf)
+
+ .file "vswscanf2.S"
+#include "scanf2-template.S"
libc/mingw/stdio/vwscanf.c
@@ -0,0 +1,16 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+// By aaronwl 2003-01-28 for mingw-msvcrt.
+// Public domain: all copyrights disclaimed, absolutely no warranties.
+
+#include <stdarg.h>
+#include <wchar.h>
+#include <stdio.h>
+
+int __ms_vwscanf (const wchar_t * __restrict__ format, va_list arg)
+{
+ return __ms_vfwscanf(stdin, format, arg);
+}
libc/mingw/stdio/vwscanf2.S
@@ -0,0 +1,12 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#include <_mingw_mac.h>
+
+#define FCT __MINGW_USYMBOL(vwscanf)
+#define FWD __MINGW_USYMBOL(__ms_vwscanf)
+
+ .file "vwscanf2.S"
+#include "scanf2-template.S"
libc/mingw/stdio/wtoll.c
@@ -0,0 +1,10 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+#define __CRT__NO_INLINE
+#include <stdlib.h>
+
+long long wtoll(const wchar_t * _w)
+ { return _wtoi64 (_w); }
src/link.cpp
@@ -13,6 +13,543 @@
#include "install_files.h"
#include "glibc.hpp"
+static const char *msvcrt_common_src[] = {
+ "misc" OS_SEP "onexit_table.c",
+ "misc" OS_SEP "register_tls_atexit.c",
+ "stdio" OS_SEP "acrt_iob_func.c",
+ "misc" OS_SEP "_configthreadlocale.c",
+ "misc" OS_SEP "_get_current_locale.c",
+ "misc" OS_SEP "invalid_parameter_handler.c",
+ "misc" OS_SEP "output_format.c",
+ "misc" OS_SEP "purecall.c",
+ "secapi" OS_SEP "_access_s.c",
+ "secapi" OS_SEP "_cgets_s.c",
+ "secapi" OS_SEP "_cgetws_s.c",
+ "secapi" OS_SEP "_chsize_s.c",
+ "secapi" OS_SEP "_controlfp_s.c",
+ "secapi" OS_SEP "_cprintf_s.c",
+ "secapi" OS_SEP "_cprintf_s_l.c",
+ "secapi" OS_SEP "_ctime32_s.c",
+ "secapi" OS_SEP "_ctime64_s.c",
+ "secapi" OS_SEP "_cwprintf_s.c",
+ "secapi" OS_SEP "_cwprintf_s_l.c",
+ "secapi" OS_SEP "_gmtime32_s.c",
+ "secapi" OS_SEP "_gmtime64_s.c",
+ "secapi" OS_SEP "_localtime32_s.c",
+ "secapi" OS_SEP "_localtime64_s.c",
+ "secapi" OS_SEP "_mktemp_s.c",
+ "secapi" OS_SEP "_sopen_s.c",
+ "secapi" OS_SEP "_strdate_s.c",
+ "secapi" OS_SEP "_strtime_s.c",
+ "secapi" OS_SEP "_umask_s.c",
+ "secapi" OS_SEP "_vcprintf_s.c",
+ "secapi" OS_SEP "_vcprintf_s_l.c",
+ "secapi" OS_SEP "_vcwprintf_s.c",
+ "secapi" OS_SEP "_vcwprintf_s_l.c",
+ "secapi" OS_SEP "_vscprintf_p.c",
+ "secapi" OS_SEP "_vscwprintf_p.c",
+ "secapi" OS_SEP "_vswprintf_p.c",
+ "secapi" OS_SEP "_waccess_s.c",
+ "secapi" OS_SEP "_wasctime_s.c",
+ "secapi" OS_SEP "_wctime32_s.c",
+ "secapi" OS_SEP "_wctime64_s.c",
+ "secapi" OS_SEP "_wstrtime_s.c",
+ "secapi" OS_SEP "_wmktemp_s.c",
+ "secapi" OS_SEP "_wstrdate_s.c",
+ "secapi" OS_SEP "asctime_s.c",
+ "secapi" OS_SEP "memcpy_s.c",
+ "secapi" OS_SEP "memmove_s.c",
+ "secapi" OS_SEP "rand_s.c",
+ "secapi" OS_SEP "sprintf_s.c",
+ "secapi" OS_SEP "strerror_s.c",
+ "secapi" OS_SEP "vsprintf_s.c",
+ "secapi" OS_SEP "wmemcpy_s.c",
+ "secapi" OS_SEP "wmemmove_s.c",
+ "stdio" OS_SEP "mingw_lock.c",
+};
+
+static const char *msvcrt_i386_src[] = {
+ "misc" OS_SEP "lc_locale_func.c",
+
+};
+
+static const char *msvcrt_other_src[] = {
+ "misc" OS_SEP "__p___argv.c",
+ "misc" OS_SEP "__p__acmdln.c",
+ "misc" OS_SEP "__p__fmode.c",
+ "misc" OS_SEP "__p__wcmdln.c",
+};
+
+static const char *mingwex_generic_src[] = {
+ "complex" OS_SEP "_cabs.c",
+ "complex" OS_SEP "cabs.c",
+ "complex" OS_SEP "cabsf.c",
+ "complex" OS_SEP "cabsl.c",
+ "complex" OS_SEP "cacos.c",
+ "complex" OS_SEP "cacosf.c",
+ "complex" OS_SEP "cacosl.c",
+ "complex" OS_SEP "carg.c",
+ "complex" OS_SEP "cargf.c",
+ "complex" OS_SEP "cargl.c",
+ "complex" OS_SEP "casin.c",
+ "complex" OS_SEP "casinf.c",
+ "complex" OS_SEP "casinl.c",
+ "complex" OS_SEP "catan.c",
+ "complex" OS_SEP "catanf.c",
+ "complex" OS_SEP "catanl.c",
+ "complex" OS_SEP "ccos.c",
+ "complex" OS_SEP "ccosf.c",
+ "complex" OS_SEP "ccosl.c",
+ "complex" OS_SEP "cexp.c",
+ "complex" OS_SEP "cexpf.c",
+ "complex" OS_SEP "cexpl.c",
+ "complex" OS_SEP "cimag.c",
+ "complex" OS_SEP "cimagf.c",
+ "complex" OS_SEP "cimagl.c",
+ "complex" OS_SEP "clog.c",
+ "complex" OS_SEP "clog10.c",
+ "complex" OS_SEP "clog10f.c",
+ "complex" OS_SEP "clog10l.c",
+ "complex" OS_SEP "clogf.c",
+ "complex" OS_SEP "clogl.c",
+ "complex" OS_SEP "conj.c",
+ "complex" OS_SEP "conjf.c",
+ "complex" OS_SEP "conjl.c",
+ "complex" OS_SEP "cpow.c",
+ "complex" OS_SEP "cpowf.c",
+ "complex" OS_SEP "cpowl.c",
+ "complex" OS_SEP "cproj.c",
+ "complex" OS_SEP "cprojf.c",
+ "complex" OS_SEP "cprojl.c",
+ "complex" OS_SEP "creal.c",
+ "complex" OS_SEP "crealf.c",
+ "complex" OS_SEP "creall.c",
+ "complex" OS_SEP "csin.c",
+ "complex" OS_SEP "csinf.c",
+ "complex" OS_SEP "csinl.c",
+ "complex" OS_SEP "csqrt.c",
+ "complex" OS_SEP "csqrtf.c",
+ "complex" OS_SEP "csqrtl.c",
+ "complex" OS_SEP "ctan.c",
+ "complex" OS_SEP "ctanf.c",
+ "complex" OS_SEP "ctanl.c",
+ "crt" OS_SEP "dllentry.c",
+ "crt" OS_SEP "dllmain.c",
+ "gdtoa" OS_SEP "arithchk.c",
+ "gdtoa" OS_SEP "dmisc.c",
+ "gdtoa" OS_SEP "dtoa.c",
+ "gdtoa" OS_SEP "g__fmt.c",
+ "gdtoa" OS_SEP "g_dfmt.c",
+ "gdtoa" OS_SEP "g_ffmt.c",
+ "gdtoa" OS_SEP "g_xfmt.c",
+ "gdtoa" OS_SEP "gdtoa.c",
+ "gdtoa" OS_SEP "gethex.c",
+ "gdtoa" OS_SEP "gmisc.c",
+ "gdtoa" OS_SEP "hd_init.c",
+ "gdtoa" OS_SEP "hexnan.c",
+ "gdtoa" OS_SEP "misc.c",
+ "gdtoa" OS_SEP "qnan.c",
+ "gdtoa" OS_SEP "smisc.c",
+ "gdtoa" OS_SEP "strtodg.c",
+ "gdtoa" OS_SEP "strtodnrp.c",
+ "gdtoa" OS_SEP "strtof.c",
+ "gdtoa" OS_SEP "strtopx.c",
+ "gdtoa" OS_SEP "sum.c",
+ "gdtoa" OS_SEP "ulp.c",
+ "math" OS_SEP "abs64.c",
+ "math" OS_SEP "cbrt.c",
+ "math" OS_SEP "cbrtf.c",
+ "math" OS_SEP "cbrtl.c",
+ "math" OS_SEP "cephes_emath.c",
+ "math" OS_SEP "copysign.c",
+ "math" OS_SEP "copysignf.c",
+ "math" OS_SEP "coshf.c",
+ "math" OS_SEP "coshl.c",
+ "math" OS_SEP "erfl.c",
+ "math" OS_SEP "expf.c",
+ "math" OS_SEP "fabs.c",
+ "math" OS_SEP "fabsf.c",
+ "math" OS_SEP "fabsl.c",
+ "math" OS_SEP "fdim.c",
+ "math" OS_SEP "fdimf.c",
+ "math" OS_SEP "fdiml.c",
+ "math" OS_SEP "fma.c",
+ "math" OS_SEP "fmaf.c",
+ "math" OS_SEP "fmal.c",
+ "math" OS_SEP "fmax.c",
+ "math" OS_SEP "fmaxf.c",
+ "math" OS_SEP "fmaxl.c",
+ "math" OS_SEP "fmin.c",
+ "math" OS_SEP "fminf.c",
+ "math" OS_SEP "fminl.c",
+ "math" OS_SEP "fp_consts.c",
+ "math" OS_SEP "fp_constsf.c",
+ "math" OS_SEP "fp_constsl.c",
+ "math" OS_SEP "fpclassify.c",
+ "math" OS_SEP "fpclassifyf.c",
+ "math" OS_SEP "fpclassifyl.c",
+ "math" OS_SEP "frexpf.c",
+ "math" OS_SEP "hypot.c",
+ "math" OS_SEP "hypotf.c",
+ "math" OS_SEP "hypotl.c",
+ "math" OS_SEP "isnan.c",
+ "math" OS_SEP "isnanf.c",
+ "math" OS_SEP "isnanl.c",
+ "math" OS_SEP "ldexpf.c",
+ "math" OS_SEP "lgamma.c",
+ "math" OS_SEP "lgammaf.c",
+ "math" OS_SEP "lgammal.c",
+ "math" OS_SEP "llrint.c",
+ "math" OS_SEP "llrintf.c",
+ "math" OS_SEP "llrintl.c",
+ "math" OS_SEP "llround.c",
+ "math" OS_SEP "llroundf.c",
+ "math" OS_SEP "llroundl.c",
+ "math" OS_SEP "log10f.c",
+ "math" OS_SEP "logf.c",
+ "math" OS_SEP "lrint.c",
+ "math" OS_SEP "lrintf.c",
+ "math" OS_SEP "lrintl.c",
+ "math" OS_SEP "lround.c",
+ "math" OS_SEP "lroundf.c",
+ "math" OS_SEP "lroundl.c",
+ "math" OS_SEP "modf.c",
+ "math" OS_SEP "modff.c",
+ "math" OS_SEP "modfl.c",
+ "math" OS_SEP "nextafterf.c",
+ "math" OS_SEP "nextafterl.c",
+ "math" OS_SEP "nexttoward.c",
+ "math" OS_SEP "nexttowardf.c",
+ "math" OS_SEP "powf.c",
+ "math" OS_SEP "powi.c",
+ "math" OS_SEP "powif.c",
+ "math" OS_SEP "powil.c",
+ "math" OS_SEP "rint.c",
+ "math" OS_SEP "rintf.c",
+ "math" OS_SEP "rintl.c",
+ "math" OS_SEP "round.c",
+ "math" OS_SEP "roundf.c",
+ "math" OS_SEP "roundl.c",
+ "math" OS_SEP "s_erf.c",
+ "math" OS_SEP "sf_erf.c",
+ "math" OS_SEP "signbit.c",
+ "math" OS_SEP "signbitf.c",
+ "math" OS_SEP "signbitl.c",
+ "math" OS_SEP "signgam.c",
+ "math" OS_SEP "sinhf.c",
+ "math" OS_SEP "sinhl.c",
+ "math" OS_SEP "sqrt.c",
+ "math" OS_SEP "sqrtf.c",
+ "math" OS_SEP "sqrtl.c",
+ "math" OS_SEP "tanhf.c",
+ "math" OS_SEP "tanhl.c",
+ "math" OS_SEP "tgamma.c",
+ "math" OS_SEP "tgammaf.c",
+ "math" OS_SEP "tgammal.c",
+ "math" OS_SEP "truncl.c",
+ "misc" OS_SEP "alarm.c",
+ "misc" OS_SEP "assert.c",
+ "misc" OS_SEP "basename.c",
+ "misc" OS_SEP "btowc.c",
+ "misc" OS_SEP "delay-f.c",
+ "misc" OS_SEP "delay-n.c",
+ "misc" OS_SEP "delayimp.c",
+ "misc" OS_SEP "difftime.c",
+ "misc" OS_SEP "difftime32.c",
+ "misc" OS_SEP "difftime64.c",
+ "misc" OS_SEP "dirent.c",
+ "misc" OS_SEP "dirname.c",
+ "misc" OS_SEP "execv.c",
+ "misc" OS_SEP "execve.c",
+ "misc" OS_SEP "execvp.c",
+ "misc" OS_SEP "execvpe.c",
+ "misc" OS_SEP "feclearexcept.c",
+ "misc" OS_SEP "fegetenv.c",
+ "misc" OS_SEP "fegetexceptflag.c",
+ "misc" OS_SEP "fegetround.c",
+ "misc" OS_SEP "feholdexcept.c",
+ "misc" OS_SEP "feraiseexcept.c",
+ "misc" OS_SEP "fesetenv.c",
+ "misc" OS_SEP "fesetexceptflag.c",
+ "misc" OS_SEP "fesetround.c",
+ "misc" OS_SEP "fetestexcept.c",
+ "misc" OS_SEP "feupdateenv.c",
+ "misc" OS_SEP "ftruncate.c",
+ "misc" OS_SEP "ftw.c",
+ "misc" OS_SEP "ftw64.c",
+ "misc" OS_SEP "fwide.c",
+ "misc" OS_SEP "getlogin.c",
+ "misc" OS_SEP "getopt.c",
+ "misc" OS_SEP "gettimeofday.c",
+ "misc" OS_SEP "imaxabs.c",
+ "misc" OS_SEP "imaxdiv.c",
+ "misc" OS_SEP "isblank.c",
+ "misc" OS_SEP "iswblank.c",
+ "misc" OS_SEP "mbrtowc.c",
+ "misc" OS_SEP "mbsinit.c",
+ "misc" OS_SEP "mempcpy.c",
+ "misc" OS_SEP "mingw-aligned-malloc.c",
+ "misc" OS_SEP "mingw-fseek.c",
+ "misc" OS_SEP "mingw_getsp.S",
+ "misc" OS_SEP "mingw_matherr.c",
+ "misc" OS_SEP "mingw_mbwc_convert.c",
+ "misc" OS_SEP "mingw_usleep.c",
+ "misc" OS_SEP "mingw_wcstod.c",
+ "misc" OS_SEP "mingw_wcstof.c",
+ "misc" OS_SEP "mingw_wcstold.c",
+ "misc" OS_SEP "mkstemp.c",
+ "misc" OS_SEP "seterrno.c",
+ "misc" OS_SEP "sleep.c",
+ "misc" OS_SEP "spawnv.c",
+ "misc" OS_SEP "spawnve.c",
+ "misc" OS_SEP "spawnvp.c",
+ "misc" OS_SEP "spawnvpe.c",
+ "misc" OS_SEP "strnlen.c",
+ "misc" OS_SEP "strsafe.c",
+ "misc" OS_SEP "strtoimax.c",
+ "misc" OS_SEP "strtold.c",
+ "misc" OS_SEP "strtoumax.c",
+ "misc" OS_SEP "tdelete.c",
+ "misc" OS_SEP "tfind.c",
+ "misc" OS_SEP "tsearch.c",
+ "misc" OS_SEP "twalk.c",
+ "misc" OS_SEP "uchar_c16rtomb.c",
+ "misc" OS_SEP "uchar_c32rtomb.c",
+ "misc" OS_SEP "uchar_mbrtoc16.c",
+ "misc" OS_SEP "uchar_mbrtoc32.c",
+ "misc" OS_SEP "wassert.c",
+ "misc" OS_SEP "wcrtomb.c",
+ "misc" OS_SEP "wcsnlen.c",
+ "misc" OS_SEP "wcstof.c",
+ "misc" OS_SEP "wcstoimax.c",
+ "misc" OS_SEP "wcstold.c",
+ "misc" OS_SEP "wcstoumax.c",
+ "misc" OS_SEP "wctob.c",
+ "misc" OS_SEP "wctrans.c",
+ "misc" OS_SEP "wctype.c",
+ "misc" OS_SEP "wdirent.c",
+ "misc" OS_SEP "winbs_uint64.c",
+ "misc" OS_SEP "winbs_ulong.c",
+ "misc" OS_SEP "winbs_ushort.c",
+ "misc" OS_SEP "wmemchr.c",
+ "misc" OS_SEP "wmemcmp.c",
+ "misc" OS_SEP "wmemcpy.c",
+ "misc" OS_SEP "wmemmove.c",
+ "misc" OS_SEP "wmempcpy.c",
+ "misc" OS_SEP "wmemset.c",
+ "stdio" OS_SEP "_Exit.c",
+ "stdio" OS_SEP "_findfirst64i32.c",
+ "stdio" OS_SEP "_findnext64i32.c",
+ "stdio" OS_SEP "_fstat.c",
+ "stdio" OS_SEP "_fstat64i32.c",
+ "stdio" OS_SEP "_ftime.c",
+ "stdio" OS_SEP "_getc_nolock.c",
+ "stdio" OS_SEP "_getwc_nolock.c",
+ "stdio" OS_SEP "_putc_nolock.c",
+ "stdio" OS_SEP "_putwc_nolock.c",
+ "stdio" OS_SEP "_stat.c",
+ "stdio" OS_SEP "_stat64i32.c",
+ "stdio" OS_SEP "_wfindfirst64i32.c",
+ "stdio" OS_SEP "_wfindnext64i32.c",
+ "stdio" OS_SEP "_wstat.c",
+ "stdio" OS_SEP "_wstat64i32.c",
+ "stdio" OS_SEP "asprintf.c",
+ "stdio" OS_SEP "atoll.c",
+ "stdio" OS_SEP "fgetpos64.c",
+ "stdio" OS_SEP "fopen64.c",
+ "stdio" OS_SEP "fseeko32.c",
+ "stdio" OS_SEP "fseeko64.c",
+ "stdio" OS_SEP "fsetpos64.c",
+ "stdio" OS_SEP "ftello.c",
+ "stdio" OS_SEP "ftello64.c",
+ "stdio" OS_SEP "ftruncate64.c",
+ "stdio" OS_SEP "lltoa.c",
+ "stdio" OS_SEP "lltow.c",
+ "stdio" OS_SEP "lseek64.c",
+ "stdio" OS_SEP "mingw_asprintf.c",
+ "stdio" OS_SEP "mingw_fprintf.c",
+ "stdio" OS_SEP "mingw_fprintfw.c",
+ "stdio" OS_SEP "mingw_fscanf.c",
+ "stdio" OS_SEP "mingw_fwscanf.c",
+ "stdio" OS_SEP "mingw_pformat.c",
+ "stdio" OS_SEP "mingw_pformatw.c",
+ "stdio" OS_SEP "mingw_printf.c",
+ "stdio" OS_SEP "mingw_printfw.c",
+ "stdio" OS_SEP "mingw_scanf.c",
+ "stdio" OS_SEP "mingw_snprintf.c",
+ "stdio" OS_SEP "mingw_snprintfw.c",
+ "stdio" OS_SEP "mingw_sprintf.c",
+ "stdio" OS_SEP "mingw_sprintfw.c",
+ "stdio" OS_SEP "mingw_sscanf.c",
+ "stdio" OS_SEP "mingw_swscanf.c",
+ "stdio" OS_SEP "mingw_vasprintf.c",
+ "stdio" OS_SEP "mingw_vfprintf.c",
+ "stdio" OS_SEP "mingw_vfprintfw.c",
+ "stdio" OS_SEP "mingw_vfscanf.c",
+ "stdio" OS_SEP "mingw_vprintf.c",
+ "stdio" OS_SEP "mingw_vprintfw.c",
+ "stdio" OS_SEP "mingw_vsnprintf.c",
+ "stdio" OS_SEP "mingw_vsnprintfw.c",
+ "stdio" OS_SEP "mingw_vsprintf.c",
+ "stdio" OS_SEP "mingw_vsprintfw.c",
+ "stdio" OS_SEP "mingw_wscanf.c",
+ "stdio" OS_SEP "mingw_wvfscanf.c",
+ "stdio" OS_SEP "scanf.S",
+ "stdio" OS_SEP "snprintf.c",
+ "stdio" OS_SEP "snwprintf.c",
+ "stdio" OS_SEP "strtof.c",
+ "stdio" OS_SEP "strtok_r.c",
+ "stdio" OS_SEP "truncate.c",
+ "stdio" OS_SEP "ulltoa.c",
+ "stdio" OS_SEP "ulltow.c",
+ "stdio" OS_SEP "vasprintf.c",
+ "stdio" OS_SEP "vfscanf.c",
+ "stdio" OS_SEP "vfscanf2.S",
+ "stdio" OS_SEP "vfwscanf.c",
+ "stdio" OS_SEP "vfwscanf2.S",
+ "stdio" OS_SEP "vscanf.c",
+ "stdio" OS_SEP "vscanf2.S",
+ "stdio" OS_SEP "vsnprintf.c",
+ "stdio" OS_SEP "vsnwprintf.c",
+ "stdio" OS_SEP "vsscanf.c",
+ "stdio" OS_SEP "vsscanf2.S",
+ "stdio" OS_SEP "vswscanf.c",
+ "stdio" OS_SEP "vswscanf2.S",
+ "stdio" OS_SEP "vwscanf.c",
+ "stdio" OS_SEP "vwscanf2.S",
+ "stdio" OS_SEP "wtoll.c",
+};
+
+static const char *mingwex_x86_src[] = {
+ "math" OS_SEP "x86" OS_SEP "acosf.c",
+ "math" OS_SEP "x86" OS_SEP "acosh.c",
+ "math" OS_SEP "x86" OS_SEP "acoshf.c",
+ "math" OS_SEP "x86" OS_SEP "acoshl.c",
+ "math" OS_SEP "x86" OS_SEP "acosl.c",
+ "math" OS_SEP "x86" OS_SEP "asinf.c",
+ "math" OS_SEP "x86" OS_SEP "asinh.c",
+ "math" OS_SEP "x86" OS_SEP "asinhf.c",
+ "math" OS_SEP "x86" OS_SEP "asinhl.c",
+ "math" OS_SEP "x86" OS_SEP "asinl.c",
+ "math" OS_SEP "x86" OS_SEP "atan2.c",
+ "math" OS_SEP "x86" OS_SEP "atan2f.c",
+ "math" OS_SEP "x86" OS_SEP "atan2l.c",
+ "math" OS_SEP "x86" OS_SEP "atanf.c",
+ "math" OS_SEP "x86" OS_SEP "atanh.c",
+ "math" OS_SEP "x86" OS_SEP "atanhf.c",
+ "math" OS_SEP "x86" OS_SEP "atanhl.c",
+ "math" OS_SEP "x86" OS_SEP "atanl.c",
+ "math" OS_SEP "x86" OS_SEP "ceilf.S",
+ "math" OS_SEP "x86" OS_SEP "ceill.S",
+ "math" OS_SEP "x86" OS_SEP "ceil.S",
+ "math" OS_SEP "x86" OS_SEP "_chgsignl.S",
+ "math" OS_SEP "x86" OS_SEP "copysignl.S",
+ "math" OS_SEP "x86" OS_SEP "cos.c",
+ "math" OS_SEP "x86" OS_SEP "cosf.c",
+ "math" OS_SEP "x86" OS_SEP "cosl.c",
+ "math" OS_SEP "x86" OS_SEP "cosl_internal.S",
+ "math" OS_SEP "x86" OS_SEP "cossin.c",
+ "math" OS_SEP "x86" OS_SEP "exp2f.S",
+ "math" OS_SEP "x86" OS_SEP "exp2l.S",
+ "math" OS_SEP "x86" OS_SEP "exp2.S",
+ "math" OS_SEP "x86" OS_SEP "exp.c",
+ "math" OS_SEP "x86" OS_SEP "expl.c",
+ "math" OS_SEP "x86" OS_SEP "expm1.c",
+ "math" OS_SEP "x86" OS_SEP "expm1f.c",
+ "math" OS_SEP "x86" OS_SEP "expm1l.c",
+ "math" OS_SEP "x86" OS_SEP "floorf.S",
+ "math" OS_SEP "x86" OS_SEP "floorl.S",
+ "math" OS_SEP "x86" OS_SEP "floor.S",
+ "math" OS_SEP "x86" OS_SEP "fmod.c",
+ "math" OS_SEP "x86" OS_SEP "fmodf.c",
+ "math" OS_SEP "x86" OS_SEP "fmodl.c",
+ "math" OS_SEP "x86" OS_SEP "frexpl.S",
+ "math" OS_SEP "x86" OS_SEP "fucom.c",
+ "math" OS_SEP "x86" OS_SEP "ilogbf.S",
+ "math" OS_SEP "x86" OS_SEP "ilogbl.S",
+ "math" OS_SEP "x86" OS_SEP "ilogb.S",
+ "math" OS_SEP "x86" OS_SEP "internal_logl.S",
+ "math" OS_SEP "x86" OS_SEP "ldexp.c",
+ "math" OS_SEP "x86" OS_SEP "ldexpl.c",
+ "math" OS_SEP "x86" OS_SEP "log10l.S",
+ "math" OS_SEP "x86" OS_SEP "log1pf.S",
+ "math" OS_SEP "x86" OS_SEP "log1pl.S",
+ "math" OS_SEP "x86" OS_SEP "log1p.S",
+ "math" OS_SEP "x86" OS_SEP "log2f.S",
+ "math" OS_SEP "x86" OS_SEP "log2l.S",
+ "math" OS_SEP "x86" OS_SEP "log2.S",
+ "math" OS_SEP "x86" OS_SEP "logb.c",
+ "math" OS_SEP "x86" OS_SEP "logbf.c",
+ "math" OS_SEP "x86" OS_SEP "logbl.c",
+ "math" OS_SEP "x86" OS_SEP "log.c",
+ "math" OS_SEP "x86" OS_SEP "logl.c",
+ "math" OS_SEP "x86" OS_SEP "nearbyintf.S",
+ "math" OS_SEP "x86" OS_SEP "nearbyintl.S",
+ "math" OS_SEP "x86" OS_SEP "nearbyint.S",
+ "math" OS_SEP "x86" OS_SEP "pow.c",
+ "math" OS_SEP "x86" OS_SEP "powl.c",
+ "math" OS_SEP "x86" OS_SEP "remainderf.S",
+ "math" OS_SEP "x86" OS_SEP "remainderl.S",
+ "math" OS_SEP "x86" OS_SEP "remainder.S",
+ "math" OS_SEP "x86" OS_SEP "remquof.S",
+ "math" OS_SEP "x86" OS_SEP "remquol.S",
+ "math" OS_SEP "x86" OS_SEP "remquo.S",
+ "math" OS_SEP "x86" OS_SEP "scalbnf.S",
+ "math" OS_SEP "x86" OS_SEP "scalbnl.S",
+ "math" OS_SEP "x86" OS_SEP "scalbn.S",
+ "math" OS_SEP "x86" OS_SEP "sin.c",
+ "math" OS_SEP "x86" OS_SEP "sinf.c",
+ "math" OS_SEP "x86" OS_SEP "sinl.c",
+ "math" OS_SEP "x86" OS_SEP "sinl_internal.S",
+ "math" OS_SEP "x86" OS_SEP "tanf.c",
+ "math" OS_SEP "x86" OS_SEP "tanl.S",
+ "math" OS_SEP "x86" OS_SEP "truncf.S",
+ "math" OS_SEP "x86" OS_SEP "trunc.S",
+};
+
+static const char *mingwex_arm32_src[] = {
+ "math" OS_SEP "arm" OS_SEP "_chgsignl.S",
+ "math" OS_SEP "arm" OS_SEP "ceil.S",
+ "math" OS_SEP "arm" OS_SEP "ceilf.S",
+ "math" OS_SEP "arm" OS_SEP "ceill.S",
+ "math" OS_SEP "arm" OS_SEP "copysignl.c",
+ "math" OS_SEP "arm" OS_SEP "exp2.c",
+ "math" OS_SEP "arm" OS_SEP "floor.S",
+ "math" OS_SEP "arm" OS_SEP "floorf.S",
+ "math" OS_SEP "arm" OS_SEP "floorl.S",
+ "math" OS_SEP "arm" OS_SEP "ldexpl.c",
+ "math" OS_SEP "arm" OS_SEP "log2.c",
+ "math" OS_SEP "arm" OS_SEP "nearbyint.S",
+ "math" OS_SEP "arm" OS_SEP "nearbyintf.S",
+ "math" OS_SEP "arm" OS_SEP "nearbyintl.S",
+ "math" OS_SEP "arm" OS_SEP "scalbn.c",
+ "math" OS_SEP "arm" OS_SEP "sincos.c",
+ "math" OS_SEP "arm" OS_SEP "trunc.S",
+ "math" OS_SEP "arm" OS_SEP "truncf.S",
+};
+
+static const char *mingwex_arm64_src[] = {
+ "math" OS_SEP "arm64" OS_SEP "ceilf.S",
+ "math" OS_SEP "arm64" OS_SEP "ceill.S",
+ "math" OS_SEP "arm64" OS_SEP "ceil.S",
+ "math" OS_SEP "arm64" OS_SEP "_chgsignl.S",
+ "math" OS_SEP "arm64" OS_SEP "copysignl.c",
+ "math" OS_SEP "arm64" OS_SEP "exp2f.S",
+ "math" OS_SEP "arm64" OS_SEP "exp2.S",
+ "math" OS_SEP "arm64" OS_SEP "floorf.S",
+ "math" OS_SEP "arm64" OS_SEP "floorl.S",
+ "math" OS_SEP "arm64" OS_SEP "floor.S",
+ "math" OS_SEP "arm64" OS_SEP "ldexpl.c",
+ "math" OS_SEP "arm64" OS_SEP "log2.c",
+ "math" OS_SEP "arm64" OS_SEP "nearbyintf.S",
+ "math" OS_SEP "arm64" OS_SEP "nearbyintl.S",
+ "math" OS_SEP "arm64" OS_SEP "nearbyint.S",
+ "math" OS_SEP "arm64" OS_SEP "scalbn.c",
+ "math" OS_SEP "arm64" OS_SEP "sincos.c",
+ "math" OS_SEP "arm64" OS_SEP "truncf.S",
+ "math" OS_SEP "arm64" OS_SEP "trunc.S",
+};
+
struct LinkJob {
CodeGen *codegen;
ZigList<const char *> args;
@@ -570,73 +1107,6 @@ static const char *build_musl(CodeGen *parent) {
return buf_ptr(&child_gen->output_file_path);
}
-static const char *msvcrt_common_src[] = {
- "misc" OS_SEP "onexit_table.c",
- "misc" OS_SEP "register_tls_atexit.c",
- "stdio" OS_SEP "acrt_iob_func.c",
- "misc" OS_SEP "_configthreadlocale.c",
- "misc" OS_SEP "_get_current_locale.c",
- "misc" OS_SEP "invalid_parameter_handler.c",
- "misc" OS_SEP "output_format.c",
- "misc" OS_SEP "purecall.c",
- "secapi" OS_SEP "_access_s.c",
- "secapi" OS_SEP "_cgets_s.c",
- "secapi" OS_SEP "_cgetws_s.c",
- "secapi" OS_SEP "_chsize_s.c",
- "secapi" OS_SEP "_controlfp_s.c",
- "secapi" OS_SEP "_cprintf_s.c",
- "secapi" OS_SEP "_cprintf_s_l.c",
- "secapi" OS_SEP "_ctime32_s.c",
- "secapi" OS_SEP "_ctime64_s.c",
- "secapi" OS_SEP "_cwprintf_s.c",
- "secapi" OS_SEP "_cwprintf_s_l.c",
- "secapi" OS_SEP "_gmtime32_s.c",
- "secapi" OS_SEP "_gmtime64_s.c",
- "secapi" OS_SEP "_localtime32_s.c",
- "secapi" OS_SEP "_localtime64_s.c",
- "secapi" OS_SEP "_mktemp_s.c",
- "secapi" OS_SEP "_sopen_s.c",
- "secapi" OS_SEP "_strdate_s.c",
- "secapi" OS_SEP "_strtime_s.c",
- "secapi" OS_SEP "_umask_s.c",
- "secapi" OS_SEP "_vcprintf_s.c",
- "secapi" OS_SEP "_vcprintf_s_l.c",
- "secapi" OS_SEP "_vcwprintf_s.c",
- "secapi" OS_SEP "_vcwprintf_s_l.c",
- "secapi" OS_SEP "_vscprintf_p.c",
- "secapi" OS_SEP "_vscwprintf_p.c",
- "secapi" OS_SEP "_vswprintf_p.c",
- "secapi" OS_SEP "_waccess_s.c",
- "secapi" OS_SEP "_wasctime_s.c",
- "secapi" OS_SEP "_wctime32_s.c",
- "secapi" OS_SEP "_wctime64_s.c",
- "secapi" OS_SEP "_wstrtime_s.c",
- "secapi" OS_SEP "_wmktemp_s.c",
- "secapi" OS_SEP "_wstrdate_s.c",
- "secapi" OS_SEP "asctime_s.c",
- "secapi" OS_SEP "memcpy_s.c",
- "secapi" OS_SEP "memmove_s.c",
- "secapi" OS_SEP "rand_s.c",
- "secapi" OS_SEP "sprintf_s.c",
- "secapi" OS_SEP "strerror_s.c",
- "secapi" OS_SEP "vsprintf_s.c",
- "secapi" OS_SEP "wmemcpy_s.c",
- "secapi" OS_SEP "wmemmove_s.c",
- "stdio" OS_SEP "mingw_lock.c",
-};
-
-static const char *msvcrt_i386_src[] = {
- "misc" OS_SEP "lc_locale_func.c",
-
-};
-
-static const char *msvcrt_other_src[] = {
- "misc" OS_SEP "__p___argv.c",
- "misc" OS_SEP "__p__acmdln.c",
- "misc" OS_SEP "__p__fmode.c",
- "misc" OS_SEP "__p__wcmdln.c",
-};
-
static void add_msvcrt_os_dep(CodeGen *parent, CodeGen *child_gen, const char *src_path) {
CFile *c_file = allocate<CFile>(1);
c_file->source_path = buf_ptr(buf_sprintf("%s" OS_SEP "libc" OS_SEP "mingw" OS_SEP "%s",
@@ -645,7 +1115,7 @@ static void add_msvcrt_os_dep(CodeGen *parent, CodeGen *child_gen, const char *s
c_file->args.append("-D__LIBMSVCRT__");
c_file->args.append("-I");
- c_file->args.append(path_from_libc(parent, "mingw" OS_SEP "include" OS_SEP));
+ c_file->args.append(path_from_libc(parent, "mingw" OS_SEP "include"));
c_file->args.append("-std=gnu99");
c_file->args.append("-D_CRTBLD");
@@ -661,6 +1131,31 @@ static void add_msvcrt_os_dep(CodeGen *parent, CodeGen *child_gen, const char *s
child_gen->c_source_files.append(c_file);
}
+static void add_mingwex_os_dep(CodeGen *parent, CodeGen *child_gen, const char *src_path) {
+ CFile *c_file = allocate<CFile>(1);
+ c_file->source_path = buf_ptr(buf_sprintf("%s" OS_SEP "libc" OS_SEP "mingw" OS_SEP "%s",
+ buf_ptr(parent->zig_lib_dir), src_path));
+ c_file->args.append("-DHAVE_CONFIG_H");
+
+ c_file->args.append("-I");
+ c_file->args.append(path_from_libc(parent, "mingw"));
+
+ c_file->args.append("-I");
+ c_file->args.append(path_from_libc(parent, "mingw" OS_SEP "include"));
+
+ c_file->args.append("-std=gnu99");
+ c_file->args.append("-D_CRTBLD");
+ c_file->args.append("-D_WIN32_WINNT=0x0f00");
+ c_file->args.append("-D__MSVCRT_VERSION__=0x700");
+ c_file->args.append("-g");
+ c_file->args.append("-O2");
+
+ c_file->args.append("-isystem");
+ c_file->args.append(path_from_libc(parent, "include" OS_SEP "any-windows-any"));
+
+ child_gen->c_source_files.append(c_file);
+}
+
static const char *get_libc_crt_file(CodeGen *parent, const char *file) {
if (parent->libc == nullptr && parent->zig_target->os == OsWindows) {
if (strcmp(file, "crt2.obj") == 0) {
@@ -759,6 +1254,32 @@ static const char *get_libc_crt_file(CodeGen *parent, const char *file) {
}
codegen_build_and_link(child_gen);
return buf_ptr(&child_gen->output_file_path);
+ } else if (strcmp(file, "mingwex.lib") == 0) {
+ CodeGen *child_gen = create_child_codegen(parent, nullptr, OutTypeLib, nullptr);
+ codegen_set_out_name(child_gen, buf_create_from_str("mingwex"));
+
+ for (size_t i = 0; i < array_length(mingwex_generic_src); i += 1) {
+ add_mingwex_os_dep(parent, child_gen, mingwex_generic_src[i]);
+ }
+ if (parent->zig_target->arch == ZigLLVM_x86 || parent->zig_target->arch == ZigLLVM_x86_64) {
+ for (size_t i = 0; i < array_length(mingwex_x86_src); i += 1) {
+ add_mingwex_os_dep(parent, child_gen, mingwex_x86_src[i]);
+ }
+ } else if (target_is_arm(parent->zig_target)) {
+ if (target_arch_pointer_bit_width(parent->zig_target->arch) == 32) {
+ for (size_t i = 0; i < array_length(mingwex_arm32_src); i += 1) {
+ add_mingwex_os_dep(parent, child_gen, mingwex_arm32_src[i]);
+ }
+ } else {
+ for (size_t i = 0; i < array_length(mingwex_arm64_src); i += 1) {
+ add_mingwex_os_dep(parent, child_gen, mingwex_arm64_src[i]);
+ }
+ }
+ } else {
+ zig_unreachable();
+ }
+ codegen_build_and_link(child_gen);
+ return buf_ptr(&child_gen->output_file_path);
} else {
zig_unreachable();
}
@@ -1555,6 +2076,7 @@ static void add_mingw_link_args(LinkJob *lj, bool is_library) {
}
lj->args.append(get_libc_crt_file(g, "mingw32.lib"));
+ lj->args.append(get_libc_crt_file(g, "mingwex.lib"));
lj->args.append(get_libc_crt_file(g, "msvcrt-os.lib"));
lj->args.append(get_def_lib(g, "msvcrt", "mingw" OS_SEP "lib-common" OS_SEP "msvcrt.def.in"));
lj->args.append(get_def_lib(g, "kernel32", "mingw" OS_SEP "lib-common" OS_SEP "kernel32.def.in"));
@@ -2089,3 +2611,4 @@ void codegen_link(CodeGen *g) {
exit(1);
}
}
+
CMakeLists.txt
@@ -7583,6 +7583,82 @@ set(ZIG_LIBC_FILES
"include/x86_64-linux-musl/bits/user.h"
"include/wasm32-freestanding-musl/bits/alltypes.h"
"include/wasm32-freestanding-musl/errno.h"
+ "mingw/complex/_cabs.c"
+ "mingw/complex/cabs.c"
+ "mingw/complex/cabs.def.h"
+ "mingw/complex/cabsf.c"
+ "mingw/complex/cabsl.c"
+ "mingw/complex/cacos.c"
+ "mingw/complex/cacos.def.h"
+ "mingw/complex/cacosf.c"
+ "mingw/complex/cacosh.def.h"
+ "mingw/complex/cacosl.c"
+ "mingw/complex/carg.c"
+ "mingw/complex/carg.def.h"
+ "mingw/complex/cargf.c"
+ "mingw/complex/cargl.c"
+ "mingw/complex/casin.c"
+ "mingw/complex/casin.def.h"
+ "mingw/complex/casinf.c"
+ "mingw/complex/casinh.def.h"
+ "mingw/complex/casinl.c"
+ "mingw/complex/catan.c"
+ "mingw/complex/catan.def.h"
+ "mingw/complex/catanf.c"
+ "mingw/complex/catanh.def.h"
+ "mingw/complex/catanl.c"
+ "mingw/complex/ccos.c"
+ "mingw/complex/ccos.def.h"
+ "mingw/complex/ccosf.c"
+ "mingw/complex/ccosh.def.h"
+ "mingw/complex/ccosl.c"
+ "mingw/complex/cexp.c"
+ "mingw/complex/cexp.def.h"
+ "mingw/complex/cexpf.c"
+ "mingw/complex/cexpl.c"
+ "mingw/complex/cimag.c"
+ "mingw/complex/cimag.def.h"
+ "mingw/complex/cimagf.c"
+ "mingw/complex/cimagl.c"
+ "mingw/complex/clog.c"
+ "mingw/complex/clog.def.h"
+ "mingw/complex/clog10.c"
+ "mingw/complex/clog10.def.h"
+ "mingw/complex/clog10f.c"
+ "mingw/complex/clog10l.c"
+ "mingw/complex/clogf.c"
+ "mingw/complex/clogl.c"
+ "mingw/complex/complex_internal.h"
+ "mingw/complex/conj.c"
+ "mingw/complex/conj.def.h"
+ "mingw/complex/conjf.c"
+ "mingw/complex/conjl.c"
+ "mingw/complex/cpow.c"
+ "mingw/complex/cpow.def.h"
+ "mingw/complex/cpowf.c"
+ "mingw/complex/cpowl.c"
+ "mingw/complex/cproj.c"
+ "mingw/complex/cproj.def.h"
+ "mingw/complex/cprojf.c"
+ "mingw/complex/cprojl.c"
+ "mingw/complex/creal.c"
+ "mingw/complex/creal.def.h"
+ "mingw/complex/crealf.c"
+ "mingw/complex/creall.c"
+ "mingw/complex/csin.c"
+ "mingw/complex/csin.def.h"
+ "mingw/complex/csinf.c"
+ "mingw/complex/csinh.def.h"
+ "mingw/complex/csinl.c"
+ "mingw/complex/csqrt.c"
+ "mingw/complex/csqrt.def.h"
+ "mingw/complex/csqrtf.c"
+ "mingw/complex/csqrtl.c"
+ "mingw/complex/ctan.c"
+ "mingw/complex/ctan.def.h"
+ "mingw/complex/ctanf.c"
+ "mingw/complex/ctanh.def.h"
+ "mingw/complex/ctanl.c"
"mingw/crt/CRT_fp10.c"
"mingw/crt/_newmode.c"
"mingw/crt/charmax.c"
@@ -7595,6 +7671,8 @@ set(ZIG_LIBC_FILES
"mingw/crt/cxa_atexit.c"
"mingw/crt/dll_argv.c"
"mingw/crt/dllargv.c"
+ "mingw/crt/dllentry.c"
+ "mingw/crt/dllmain.c"
"mingw/crt/gccmain.c"
"mingw/crt/gs_support.c"
"mingw/crt/merr.c"
@@ -7615,6 +7693,31 @@ set(ZIG_LIBC_FILES
"mingw/crt/xtxtmode.c"
"mingw/def-include/func.def.in"
"mingw/def-include/msvcrt-common.def.in"
+ "mingw/gdtoa/arithchk.c"
+ "mingw/gdtoa/dmisc.c"
+ "mingw/gdtoa/dtoa.c"
+ "mingw/gdtoa/g__fmt.c"
+ "mingw/gdtoa/g_dfmt.c"
+ "mingw/gdtoa/g_ffmt.c"
+ "mingw/gdtoa/g_xfmt.c"
+ "mingw/gdtoa/gd_arith.h"
+ "mingw/gdtoa/gd_qnan.h"
+ "mingw/gdtoa/gdtoa.c"
+ "mingw/gdtoa/gdtoa.h"
+ "mingw/gdtoa/gdtoaimp.h"
+ "mingw/gdtoa/gethex.c"
+ "mingw/gdtoa/gmisc.c"
+ "mingw/gdtoa/hd_init.c"
+ "mingw/gdtoa/hexnan.c"
+ "mingw/gdtoa/misc.c"
+ "mingw/gdtoa/qnan.c"
+ "mingw/gdtoa/smisc.c"
+ "mingw/gdtoa/strtodg.c"
+ "mingw/gdtoa/strtodnrp.c"
+ "mingw/gdtoa/strtof.c"
+ "mingw/gdtoa/strtopx.c"
+ "mingw/gdtoa/sum.c"
+ "mingw/gdtoa/ulp.c"
"mingw/include/config.h"
"mingw/include/internal.h"
"mingw/include/msvcrt.h"
@@ -7622,18 +7725,334 @@ set(ZIG_LIBC_FILES
"mingw/include/sect_attribs.h"
"mingw/lib-common/kernel32.def.in"
"mingw/lib-common/msvcrt.def.in"
+ "mingw/math/abs64.c"
+ "mingw/math/arm/_chgsignl.S"
+ "mingw/math/arm/ceil.S"
+ "mingw/math/arm/ceilf.S"
+ "mingw/math/arm/ceill.S"
+ "mingw/math/arm/copysignl.c"
+ "mingw/math/arm/exp2.c"
+ "mingw/math/arm/floor.S"
+ "mingw/math/arm/floorf.S"
+ "mingw/math/arm/floorl.S"
+ "mingw/math/arm/ldexpl.c"
+ "mingw/math/arm/log2.c"
+ "mingw/math/arm/nearbyint.S"
+ "mingw/math/arm/nearbyintf.S"
+ "mingw/math/arm/nearbyintl.S"
+ "mingw/math/arm/scalbn.c"
+ "mingw/math/arm/sincos.c"
+ "mingw/math/arm/trunc.S"
+ "mingw/math/arm/truncf.S"
+ "mingw/math/arm64/_chgsignl.S"
+ "mingw/math/arm64/ceil.S"
+ "mingw/math/arm64/ceilf.S"
+ "mingw/math/arm64/ceill.S"
+ "mingw/math/arm64/copysignl.c"
+ "mingw/math/arm64/exp2.S"
+ "mingw/math/arm64/exp2f.S"
+ "mingw/math/arm64/floor.S"
+ "mingw/math/arm64/floorf.S"
+ "mingw/math/arm64/floorl.S"
+ "mingw/math/arm64/ldexpl.c"
+ "mingw/math/arm64/log2.c"
+ "mingw/math/arm64/nearbyint.S"
+ "mingw/math/arm64/nearbyintf.S"
+ "mingw/math/arm64/nearbyintl.S"
+ "mingw/math/arm64/scalbn.c"
+ "mingw/math/arm64/sincos.c"
+ "mingw/math/arm64/trunc.S"
+ "mingw/math/arm64/truncf.S"
+ "mingw/math/cbrt.c"
+ "mingw/math/cbrtf.c"
+ "mingw/math/cbrtl.c"
+ "mingw/math/cephes_emath.c"
+ "mingw/math/cephes_emath.h"
+ "mingw/math/cephes_mconf.h"
+ "mingw/math/copysign.c"
+ "mingw/math/copysignf.c"
+ "mingw/math/coshf.c"
+ "mingw/math/coshl.c"
+ "mingw/math/erfl.c"
+ "mingw/math/expf.c"
+ "mingw/math/fabs.c"
+ "mingw/math/fabsf.c"
+ "mingw/math/fabsl.c"
+ "mingw/math/fdim.c"
+ "mingw/math/fdimf.c"
+ "mingw/math/fdiml.c"
+ "mingw/math/fma.c"
+ "mingw/math/fmaf.c"
+ "mingw/math/fmal.c"
+ "mingw/math/fmax.c"
+ "mingw/math/fmaxf.c"
+ "mingw/math/fmaxl.c"
+ "mingw/math/fmin.c"
+ "mingw/math/fminf.c"
+ "mingw/math/fminl.c"
+ "mingw/math/fp_consts.c"
+ "mingw/math/fp_consts.h"
+ "mingw/math/fp_constsf.c"
+ "mingw/math/fp_constsl.c"
+ "mingw/math/fpclassify.c"
+ "mingw/math/fpclassifyf.c"
+ "mingw/math/fpclassifyl.c"
+ "mingw/math/frexpf.c"
+ "mingw/math/hypot.c"
+ "mingw/math/hypotf.c"
+ "mingw/math/hypotl.c"
+ "mingw/math/isnan.c"
+ "mingw/math/isnanf.c"
+ "mingw/math/isnanl.c"
+ "mingw/math/ldexpf.c"
+ "mingw/math/lgamma.c"
+ "mingw/math/lgammaf.c"
+ "mingw/math/lgammal.c"
+ "mingw/math/llrint.c"
+ "mingw/math/llrintf.c"
+ "mingw/math/llrintl.c"
+ "mingw/math/llround.c"
+ "mingw/math/llroundf.c"
+ "mingw/math/llroundl.c"
+ "mingw/math/log10f.c"
+ "mingw/math/logf.c"
+ "mingw/math/lrint.c"
+ "mingw/math/lrintf.c"
+ "mingw/math/lrintl.c"
+ "mingw/math/lround.c"
+ "mingw/math/lroundf.c"
+ "mingw/math/lroundl.c"
+ "mingw/math/modf.c"
+ "mingw/math/modff.c"
+ "mingw/math/modfl.c"
+ "mingw/math/nextafterf.c"
+ "mingw/math/nextafterl.c"
+ "mingw/math/nexttoward.c"
+ "mingw/math/nexttowardf.c"
+ "mingw/math/powf.c"
+ "mingw/math/powi.c"
+ "mingw/math/powi.def.h"
+ "mingw/math/powif.c"
+ "mingw/math/powil.c"
+ "mingw/math/rint.c"
+ "mingw/math/rintf.c"
+ "mingw/math/rintl.c"
+ "mingw/math/round.c"
+ "mingw/math/roundf.c"
+ "mingw/math/roundl.c"
+ "mingw/math/s_erf.c"
+ "mingw/math/sf_erf.c"
+ "mingw/math/signbit.c"
+ "mingw/math/signbitf.c"
+ "mingw/math/signbitl.c"
+ "mingw/math/signgam.c"
+ "mingw/math/sinhf.c"
+ "mingw/math/sinhl.c"
+ "mingw/math/sqrt.c"
+ "mingw/math/sqrt.def.h"
+ "mingw/math/sqrtf.c"
+ "mingw/math/sqrtl.c"
+ "mingw/math/tanhf.c"
+ "mingw/math/tanhl.c"
+ "mingw/math/tgamma.c"
+ "mingw/math/tgammaf.c"
+ "mingw/math/tgammal.c"
+ "mingw/math/truncl.c"
+ "mingw/math/x86/_chgsignl.S"
+ "mingw/math/x86/acosf.c"
+ "mingw/math/x86/acosh.c"
+ "mingw/math/x86/acosh.def.h"
+ "mingw/math/x86/acoshf.c"
+ "mingw/math/x86/acoshl.c"
+ "mingw/math/x86/acosl.c"
+ "mingw/math/x86/asinf.c"
+ "mingw/math/x86/asinh.c"
+ "mingw/math/x86/asinhf.c"
+ "mingw/math/x86/asinhl.c"
+ "mingw/math/x86/asinl.c"
+ "mingw/math/x86/atan2.c"
+ "mingw/math/x86/atan2f.c"
+ "mingw/math/x86/atan2l.c"
+ "mingw/math/x86/atanf.c"
+ "mingw/math/x86/atanh.c"
+ "mingw/math/x86/atanhf.c"
+ "mingw/math/x86/atanhl.c"
+ "mingw/math/x86/atanl.c"
+ "mingw/math/x86/ceil.S"
+ "mingw/math/x86/ceilf.S"
+ "mingw/math/x86/ceill.S"
+ "mingw/math/x86/copysignl.S"
+ "mingw/math/x86/cos.c"
+ "mingw/math/x86/cos.def.h"
+ "mingw/math/x86/cosf.c"
+ "mingw/math/x86/cosl.c"
+ "mingw/math/x86/cosl_internal.S"
+ "mingw/math/x86/cossin.c"
+ "mingw/math/x86/exp.c"
+ "mingw/math/x86/exp.def.h"
+ "mingw/math/x86/exp2.S"
+ "mingw/math/x86/exp2f.S"
+ "mingw/math/x86/exp2l.S"
+ "mingw/math/x86/expl.c"
+ "mingw/math/x86/expm1.c"
+ "mingw/math/x86/expm1.def.h"
+ "mingw/math/x86/expm1f.c"
+ "mingw/math/x86/expm1l.c"
+ "mingw/math/x86/fastmath.h"
+ "mingw/math/x86/floor.S"
+ "mingw/math/x86/floorf.S"
+ "mingw/math/x86/floorl.S"
+ "mingw/math/x86/fmod.c"
+ "mingw/math/x86/fmodf.c"
+ "mingw/math/x86/fmodl.c"
+ "mingw/math/x86/frexpl.S"
+ "mingw/math/x86/fucom.c"
+ "mingw/math/x86/ilogb.S"
+ "mingw/math/x86/ilogbf.S"
+ "mingw/math/x86/ilogbl.S"
+ "mingw/math/x86/internal_logl.S"
+ "mingw/math/x86/ldexp.c"
+ "mingw/math/x86/ldexpl.c"
+ "mingw/math/x86/log.c"
+ "mingw/math/x86/log.def.h"
+ "mingw/math/x86/log10l.S"
+ "mingw/math/x86/log1p.S"
+ "mingw/math/x86/log1pf.S"
+ "mingw/math/x86/log1pl.S"
+ "mingw/math/x86/log2.S"
+ "mingw/math/x86/log2f.S"
+ "mingw/math/x86/log2l.S"
+ "mingw/math/x86/logb.c"
+ "mingw/math/x86/logbf.c"
+ "mingw/math/x86/logbl.c"
+ "mingw/math/x86/logl.c"
+ "mingw/math/x86/nearbyint.S"
+ "mingw/math/x86/nearbyintf.S"
+ "mingw/math/x86/nearbyintl.S"
+ "mingw/math/x86/pow.c"
+ "mingw/math/x86/pow.def.h"
+ "mingw/math/x86/powl.c"
+ "mingw/math/x86/remainder.S"
+ "mingw/math/x86/remainderf.S"
+ "mingw/math/x86/remainderl.S"
+ "mingw/math/x86/remquo.S"
+ "mingw/math/x86/remquof.S"
+ "mingw/math/x86/remquol.S"
+ "mingw/math/x86/scalbn.S"
+ "mingw/math/x86/scalbnf.S"
+ "mingw/math/x86/scalbnl.S"
+ "mingw/math/x86/sin.c"
+ "mingw/math/x86/sin.def.h"
+ "mingw/math/x86/sinf.c"
+ "mingw/math/x86/sinl.c"
+ "mingw/math/x86/sinl_internal.S"
+ "mingw/math/x86/tanf.c"
+ "mingw/math/x86/tanl.S"
+ "mingw/math/x86/trunc.S"
+ "mingw/math/x86/truncf.S"
"mingw/misc/__p___argv.c"
"mingw/misc/__p__acmdln.c"
"mingw/misc/__p__fmode.c"
"mingw/misc/__p__wcmdln.c"
"mingw/misc/_configthreadlocale.c"
"mingw/misc/_get_current_locale.c"
+ "mingw/misc/alarm.c"
+ "mingw/misc/assert.c"
+ "mingw/misc/basename.c"
+ "mingw/misc/btowc.c"
+ "mingw/misc/delay-f.c"
+ "mingw/misc/delay-n.c"
+ "mingw/misc/delayimp.c"
+ "mingw/misc/difftime.c"
+ "mingw/misc/difftime32.c"
+ "mingw/misc/difftime64.c"
+ "mingw/misc/dirent.c"
+ "mingw/misc/dirname.c"
+ "mingw/misc/execv.c"
+ "mingw/misc/execve.c"
+ "mingw/misc/execvp.c"
+ "mingw/misc/execvpe.c"
+ "mingw/misc/feclearexcept.c"
+ "mingw/misc/fegetenv.c"
+ "mingw/misc/fegetexceptflag.c"
+ "mingw/misc/fegetround.c"
+ "mingw/misc/feholdexcept.c"
+ "mingw/misc/feraiseexcept.c"
+ "mingw/misc/fesetenv.c"
+ "mingw/misc/fesetexceptflag.c"
+ "mingw/misc/fesetround.c"
+ "mingw/misc/fetestexcept.c"
+ "mingw/misc/feupdateenv.c"
+ "mingw/misc/ftruncate.c"
+ "mingw/misc/ftw.c"
+ "mingw/misc/ftw64.c"
+ "mingw/misc/fwide.c"
+ "mingw/misc/getlogin.c"
+ "mingw/misc/getopt.c"
+ "mingw/misc/gettimeofday.c"
+ "mingw/misc/imaxabs.c"
+ "mingw/misc/imaxdiv.c"
"mingw/misc/invalid_parameter_handler.c"
+ "mingw/misc/isblank.c"
+ "mingw/misc/iswblank.c"
"mingw/misc/lc_locale_func.c"
+ "mingw/misc/mb_wc_common.h"
+ "mingw/misc/mbrtowc.c"
+ "mingw/misc/mbsinit.c"
+ "mingw/misc/mempcpy.c"
+ "mingw/misc/mingw-aligned-malloc.c"
+ "mingw/misc/mingw-fseek.c"
+ "mingw/misc/mingw_getsp.S"
+ "mingw/misc/mingw_matherr.c"
+ "mingw/misc/mingw_mbwc_convert.c"
+ "mingw/misc/mingw_usleep.c"
+ "mingw/misc/mingw_wcstod.c"
+ "mingw/misc/mingw_wcstof.c"
+ "mingw/misc/mingw_wcstold.c"
+ "mingw/misc/mkstemp.c"
"mingw/misc/onexit_table.c"
"mingw/misc/output_format.c"
"mingw/misc/purecall.c"
"mingw/misc/register_tls_atexit.c"
+ "mingw/misc/seterrno.c"
+ "mingw/misc/sleep.c"
+ "mingw/misc/spawnv.c"
+ "mingw/misc/spawnve.c"
+ "mingw/misc/spawnvp.c"
+ "mingw/misc/spawnvpe.c"
+ "mingw/misc/strnlen.c"
+ "mingw/misc/strsafe.c"
+ "mingw/misc/strtoimax.c"
+ "mingw/misc/strtold.c"
+ "mingw/misc/strtoumax.c"
+ "mingw/misc/tdelete.c"
+ "mingw/misc/tfind.c"
+ "mingw/misc/tsearch.c"
+ "mingw/misc/twalk.c"
+ "mingw/misc/uchar_c16rtomb.c"
+ "mingw/misc/uchar_c32rtomb.c"
+ "mingw/misc/uchar_mbrtoc16.c"
+ "mingw/misc/uchar_mbrtoc32.c"
+ "mingw/misc/wassert.c"
+ "mingw/misc/wcrtomb.c"
+ "mingw/misc/wcsnlen.c"
+ "mingw/misc/wcstof.c"
+ "mingw/misc/wcstoimax.c"
+ "mingw/misc/wcstold.c"
+ "mingw/misc/wcstoumax.c"
+ "mingw/misc/wctob.c"
+ "mingw/misc/wctrans.c"
+ "mingw/misc/wctype.c"
+ "mingw/misc/wdirent.c"
+ "mingw/misc/winbs_uint64.c"
+ "mingw/misc/winbs_ulong.c"
+ "mingw/misc/winbs_ushort.c"
+ "mingw/misc/wmemchr.c"
+ "mingw/misc/wmemcmp.c"
+ "mingw/misc/wmemcpy.c"
+ "mingw/misc/wmemmove.c"
+ "mingw/misc/wmempcpy.c"
+ "mingw/misc/wmemset.c"
"mingw/secapi/_access_s.c"
"mingw/secapi/_cgets_s.c"
"mingw/secapi/_cgetws_s.c"
@@ -7677,8 +8096,91 @@ set(ZIG_LIBC_FILES
"mingw/secapi/vsprintf_s.c"
"mingw/secapi/wmemcpy_s.c"
"mingw/secapi/wmemmove_s.c"
+ "mingw/stdio/_Exit.c"
+ "mingw/stdio/_findfirst64i32.c"
+ "mingw/stdio/_findnext64i32.c"
+ "mingw/stdio/_fstat.c"
+ "mingw/stdio/_fstat64i32.c"
+ "mingw/stdio/_ftime.c"
+ "mingw/stdio/_getc_nolock.c"
+ "mingw/stdio/_getwc_nolock.c"
+ "mingw/stdio/_putc_nolock.c"
+ "mingw/stdio/_putwc_nolock.c"
+ "mingw/stdio/_stat.c"
+ "mingw/stdio/_stat64i32.c"
+ "mingw/stdio/_wfindfirst64i32.c"
+ "mingw/stdio/_wfindnext64i32.c"
+ "mingw/stdio/_wstat.c"
+ "mingw/stdio/_wstat64i32.c"
"mingw/stdio/acrt_iob_func.c"
+ "mingw/stdio/asprintf.c"
+ "mingw/stdio/atoll.c"
+ "mingw/stdio/fgetpos64.c"
+ "mingw/stdio/fopen64.c"
+ "mingw/stdio/fseeko32.c"
+ "mingw/stdio/fseeko64.c"
+ "mingw/stdio/fsetpos64.c"
+ "mingw/stdio/ftello.c"
+ "mingw/stdio/ftello64.c"
+ "mingw/stdio/ftruncate64.c"
+ "mingw/stdio/lltoa.c"
+ "mingw/stdio/lltow.c"
+ "mingw/stdio/lseek64.c"
+ "mingw/stdio/mingw_asprintf.c"
+ "mingw/stdio/mingw_fprintf.c"
+ "mingw/stdio/mingw_fprintfw.c"
+ "mingw/stdio/mingw_fscanf.c"
+ "mingw/stdio/mingw_fwscanf.c"
"mingw/stdio/mingw_lock.c"
+ "mingw/stdio/mingw_pformat.c"
+ "mingw/stdio/mingw_pformat.h"
+ "mingw/stdio/mingw_pformatw.c"
+ "mingw/stdio/mingw_printf.c"
+ "mingw/stdio/mingw_printfw.c"
+ "mingw/stdio/mingw_scanf.c"
+ "mingw/stdio/mingw_snprintf.c"
+ "mingw/stdio/mingw_snprintfw.c"
+ "mingw/stdio/mingw_sprintf.c"
+ "mingw/stdio/mingw_sprintfw.c"
+ "mingw/stdio/mingw_sscanf.c"
+ "mingw/stdio/mingw_swscanf.c"
+ "mingw/stdio/mingw_vasprintf.c"
+ "mingw/stdio/mingw_vfprintf.c"
+ "mingw/stdio/mingw_vfprintfw.c"
+ "mingw/stdio/mingw_vfscanf.c"
+ "mingw/stdio/mingw_vprintf.c"
+ "mingw/stdio/mingw_vprintfw.c"
+ "mingw/stdio/mingw_vsnprintf.c"
+ "mingw/stdio/mingw_vsnprintfw.c"
+ "mingw/stdio/mingw_vsprintf.c"
+ "mingw/stdio/mingw_vsprintfw.c"
+ "mingw/stdio/mingw_wscanf.c"
+ "mingw/stdio/mingw_wvfscanf.c"
+ "mingw/stdio/scanf.S"
+ "mingw/stdio/scanf2-template.S"
+ "mingw/stdio/snprintf.c"
+ "mingw/stdio/snwprintf.c"
+ "mingw/stdio/strtof.c"
+ "mingw/stdio/strtok_r.c"
+ "mingw/stdio/truncate.c"
+ "mingw/stdio/ulltoa.c"
+ "mingw/stdio/ulltow.c"
+ "mingw/stdio/vasprintf.c"
+ "mingw/stdio/vfscanf.c"
+ "mingw/stdio/vfscanf2.S"
+ "mingw/stdio/vfwscanf.c"
+ "mingw/stdio/vfwscanf2.S"
+ "mingw/stdio/vscanf.c"
+ "mingw/stdio/vscanf2.S"
+ "mingw/stdio/vsnprintf.c"
+ "mingw/stdio/vsnwprintf.c"
+ "mingw/stdio/vsscanf.c"
+ "mingw/stdio/vsscanf2.S"
+ "mingw/stdio/vswscanf.c"
+ "mingw/stdio/vswscanf2.S"
+ "mingw/stdio/vwscanf.c"
+ "mingw/stdio/vwscanf2.S"
+ "mingw/stdio/wtoll.c"
"musl/arch/aarch64/atomic_arch.h"
"musl/arch/aarch64/bits/alltypes.h.in"
"musl/arch/aarch64/bits/endian.h"