|  | /* Copyright (C) 1997-2016 Free Software Foundation, Inc. | 
|  | This file is part of the GNU C Library. | 
|  |  | 
|  | The GNU C Library is free software; you can redistribute it and/or | 
|  | modify it under the terms of the GNU Lesser General Public | 
|  | License as published by the Free Software Foundation; either | 
|  | version 2.1 of the License, or (at your option) any later version. | 
|  |  | 
|  | The GNU C Library is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|  | Lesser General Public License for more details. | 
|  |  | 
|  | You should have received a copy of the GNU Lesser General Public | 
|  | License along with the GNU C Library; if not, see | 
|  | <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  | /* | 
|  | *	ISO C99:  7.3 Complex arithmetic	<complex.h> | 
|  | */ | 
|  |  | 
|  | #ifndef _COMPLEX_H | 
|  | #define _COMPLEX_H	1 | 
|  |  | 
|  | #include <features.h> | 
|  |  | 
|  | /* Get general and ISO C99 specific information.  */ | 
|  | #include <bits/mathdef.h> | 
|  |  | 
|  | __BEGIN_DECLS | 
|  |  | 
|  | /* We might need to add support for more compilers here.  But since ISO | 
|  | C99 is out hopefully all maintained compilers will soon provide the data | 
|  | types `float complex' and `double complex'.  */ | 
|  | #if __GNUC_PREREQ (2, 7) && !__GNUC_PREREQ (2, 97) | 
|  | # define _Complex __complex__ | 
|  | #endif | 
|  |  | 
|  | #define complex		_Complex | 
|  |  | 
|  | /* Narrowest imaginary unit.  This depends on the floating-point | 
|  | evaluation method. | 
|  | XXX This probably has to go into a gcc related file.  */ | 
|  | #define _Complex_I	(__extension__ 1.0iF) | 
|  |  | 
|  | /* Another more descriptive name is `I'. | 
|  | XXX Once we have the imaginary support switch this to _Imaginary_I.  */ | 
|  | #undef I | 
|  | #define I _Complex_I | 
|  |  | 
|  | #if defined __USE_ISOC11 && __GNUC_PREREQ (4, 7) | 
|  | /* Macros to expand into expression of specified complex type.  */ | 
|  | # define CMPLX(x, y) __builtin_complex ((double) (x), (double) (y)) | 
|  | # define CMPLXF(x, y) __builtin_complex ((float) (x), (float) (y)) | 
|  | # define CMPLXL(x, y) __builtin_complex ((long double) (x), (long double) (y)) | 
|  | #endif | 
|  |  | 
|  | /* The file <bits/cmathcalls.h> contains the prototypes for all the | 
|  | actual math functions.  These macros are used for those prototypes, | 
|  | so we can easily declare each function as both `name' and `__name', | 
|  | and can declare the float versions `namef' and `__namef'.  */ | 
|  |  | 
|  | #define __MATHCALL(function, args)	\ | 
|  | __MATHDECL (_Mdouble_complex_,function, args) | 
|  | #define __MATHDECL(type, function, args) \ | 
|  | __MATHDECL_1(type, function, args); \ | 
|  | __MATHDECL_1(type, __CONCAT(__,function), args) | 
|  | #define __MATHDECL_1(type, function, args) \ | 
|  | extern type __MATH_PRECNAME(function) args __THROW | 
|  |  | 
|  | #define _Mdouble_ 		double | 
|  | #define __MATH_PRECNAME(name)	name | 
|  | #include <bits/cmathcalls.h> | 
|  | #undef	_Mdouble_ | 
|  | #undef	__MATH_PRECNAME | 
|  |  | 
|  | /* Now the float versions.  */ | 
|  | #ifndef _Mfloat_ | 
|  | # define _Mfloat_		float | 
|  | #endif | 
|  | #define _Mdouble_ 		_Mfloat_ | 
|  | #define __MATH_PRECNAME(name)	name##f | 
|  | #include <bits/cmathcalls.h> | 
|  | #undef	_Mdouble_ | 
|  | #undef	__MATH_PRECNAME | 
|  |  | 
|  | /* And the long double versions.  It is non-critical to define them | 
|  | here unconditionally since `long double' is required in ISO C99.  */ | 
|  | #if !(defined __NO_LONG_DOUBLE_MATH && defined _LIBC)	\ | 
|  | || defined __LDBL_COMPAT | 
|  | # ifdef __LDBL_COMPAT | 
|  | #  undef __MATHDECL_1 | 
|  | #  define __MATHDECL_1(type, function, args) \ | 
|  | extern type __REDIRECT_NTH(__MATH_PRECNAME(function), args, function) | 
|  | # endif | 
|  |  | 
|  | # ifndef _Mlong_double_ | 
|  | #  define _Mlong_double_	long double | 
|  | # endif | 
|  | # define _Mdouble_ 		_Mlong_double_ | 
|  | # define __MATH_PRECNAME(name)	name##l | 
|  | # include <bits/cmathcalls.h> | 
|  | #endif | 
|  | #undef	_Mdouble_ | 
|  | #undef	__MATH_PRECNAME | 
|  | #undef	__MATHDECL_1 | 
|  | #undef	__MATHDECL | 
|  | #undef	__MATHCALL | 
|  |  | 
|  | __END_DECLS | 
|  |  | 
|  | #endif /* complex.h */ |