25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER START
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * The contents of this file are subject to the terms of the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Common Development and Distribution License (the "License").
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You may not use this file except in compliance with the License.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * or http://www.opensolaris.org/os/licensing.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * See the License for the specific language governing permissions
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * and limitations under the License.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * When distributing Covered Code, include this CDDL HEADER in each
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * If applicable, add the following below this CDDL HEADER, with the
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * fields enclosed by brackets "[]" replaced with your own identifying
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * information: Portions Copyright [yyyy] [name of copyright owner]
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis *
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * CDDL HEADER END
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Use is subject to license terms.
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifndef _FENV_H
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define _FENV_H
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <sys/feature_tests.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef __cplusplus
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern "C" {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifndef __P
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef __STDC__
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define __P(p) p
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define __P(p) ()
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif /* !defined(__P) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Rounding modes
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#if defined(__sparc)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_TONEAREST 0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_TOWARDZERO 1
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_UPWARD 2
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_DOWNWARD 3
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#elif defined(__i386) || defined(__amd64)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_TONEAREST 0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_DOWNWARD 1
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_UPWARD 2
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_TOWARDZERO 3
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int fegetround __P((void));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int fesetround __P((int));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#if (defined(__i386) || defined(__amd64)) && \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis (!defined(_STRICT_STDC) || defined(__EXTENSIONS__))
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_FLTPREC 0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_DBLPREC 2
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_LDBLPREC 3
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int fegetprec __P((void));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int fesetprec __P((int));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Exception flags
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#if defined(__sparc)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_INEXACT 0x01
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_DIVBYZERO 0x02
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_UNDERFLOW 0x04
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_OVERFLOW 0x08
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_INVALID 0x10
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_ALL_EXCEPT 0x1f
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#elif defined(__i386) || defined(__amd64)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_INVALID 0x01
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_DIVBYZERO 0x04
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_OVERFLOW 0x08
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_UNDERFLOW 0x10
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_INEXACT 0x20
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_ALL_EXCEPT 0x3d
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtistypedef int fexcept_t;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int feclearexcept __P((int));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int feraiseexcept __P((int));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int fetestexcept __P((int));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int fegetexceptflag __P((fexcept_t *, int));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int fesetexceptflag __P((const fexcept_t *, int));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#if !defined(_STRICT_STDC) || defined(__EXTENSIONS__)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Exception handling extensions
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_NOHANDLER -1
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_NONSTOP 0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_ABORT 1
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_SIGNAL 2
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_CUSTOM 3
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_INEXACT 0x001
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_DIVBYZERO 0x002
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_UNDERFLOW 0x004
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_OVERFLOW 0x008
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_INV_ZDZ 0x010
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_INV_IDI 0x020
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_INV_ISI 0x040
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_INV_ZMI 0x080
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_INV_SQRT 0x100
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_INV_SNAN 0x200
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_INV_INT 0x400
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_INV_CMP 0x800
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_INVALID 0xff0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_COMMON (FEX_INVALID | FEX_DIVBYZERO | FEX_OVERFLOW)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_ALL (FEX_COMMON | FEX_UNDERFLOW | FEX_INEXACT)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_NONE 0
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FEX_NUM_EXC 12
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* structure to hold a numeric value in any format used by the FPU */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtistypedef struct {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis enum fex_nt {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_nodata = 0,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_int = 1,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_llong = 2,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_float = 3,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_double = 4,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_ldouble = 5
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } type;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis union {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int i;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#if !defined(_STRICT_STDC) && !defined(_NO_LONGLONG) || defined(_STDC_C99) || \
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis defined(__C99FEATURES__)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis long long l;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis struct {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int l[2];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } l;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis float f;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis double d;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis long double q;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } val;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis} fex_numeric_t;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/* structure to supply information about an exception to a custom handler */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtistypedef struct {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis enum fex_op {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_add = 0,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_sub = 1,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_mul = 2,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_div = 3,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_sqrt = 4,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_cnvt = 5,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_cmp = 6,
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_other = 7
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis } op; /* operation that caused the exception */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int flags; /* flags to be set */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis fex_numeric_t op1, op2, res; /* operands and result */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis} fex_info_t;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtistypedef struct fex_handler_data {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int __mode;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis void (*__handler)();
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis} fex_handler_t[FEX_NUM_EXC];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int fex_get_handling __P((int));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int fex_set_handling __P((int, int, void (*)()));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void fex_getexcepthandler __P((fex_handler_t *, int));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void fex_setexcepthandler __P((const fex_handler_t *, int));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef __STDC__
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#include <stdio_tag.h>
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifndef _FILEDEFED
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define _FILEDEFED
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtistypedef __FILE FILE;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern FILE *fex_get_log __P((void));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int fex_set_log __P((FILE *));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int fex_get_log_depth __P((void));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int fex_set_log_depth __P((int));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void fex_log_entry __P((const char *));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define __fex_handler_t fex_handler_t
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtistypedef struct {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis int __mode;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis void (*__handler)();
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis} __fex_handler_t[12];
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif /* !defined(_STRICT_STDC) || defined(__EXTENSIONS__) */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis/*
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis * Environment as a whole
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis */
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtistypedef struct {
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis __fex_handler_t __handlers;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis unsigned long __fsr;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis} fenv_t;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef __STDC__
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern const fenv_t __fenv_dfl_env;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#else
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern fenv_t __fenv_dfl_env;
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#define FE_DFL_ENV (&__fenv_dfl_env)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int fegetenv __P((fenv_t *));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int fesetenv __P((const fenv_t *));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int feholdexcept __P((fenv_t *));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern int feupdateenv __P((const fenv_t *));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#if !defined(_STRICT_STDC) || defined(__EXTENSIONS__)
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtisextern void fex_merge_flags __P((const fenv_t *));
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#ifdef __cplusplus
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis}
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis
25c28e83beb90e7c80452a7c818c5e6f73a07dc8Piotr Jasiukajtis#endif /* _FENV_H */