diff lphobos/std/c/fenv.d @ 1:c53b6e3fe49a trunk

[svn r5] Initial commit. Most things are very rough.
author lindquist
date Sat, 01 Sep 2007 21:43:27 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lphobos/std/c/fenv.d	Sat Sep 01 21:43:27 2007 +0200
@@ -0,0 +1,112 @@
+
+/**
+ * C's <fenv.h>
+ * Authors: Walter Bright, Digital Mars, www.digitalmars.com
+ * License: Public Domain
+ * Macros:
+ *	WIKI=Phobos/StdCFenv
+ */
+
+module std.c.fenv;
+
+extern (C):
+
+/// Entire floating point environment
+
+struct fenv_t
+{
+    version (Windows)
+    {
+	ushort status;
+	ushort control;
+	ushort round;
+	ushort reserved[2];
+    }
+    else version (linux)
+    {
+	ushort __control_word;
+	ushort __unused1;
+	ushort __status_word;
+	ushort __unused2;
+	ushort __tags;
+	ushort __unused3;
+	uint __eip;
+	ushort __cs_selector;
+	ushort __opcode;
+	uint __data_offset;
+	ushort __data_selector;
+	ushort __unused5;
+    }
+    else
+    {
+	static assert(0);
+    }
+}
+
+alias int fexcept_t;	/// Floating point status flags
+
+/// The various floating point exceptions
+enum
+{
+    FE_INVALID		= 1,		///
+    FE_DENORMAL		= 2,		///
+    FE_DIVBYZERO	= 4,		///
+    FE_OVERFLOW		= 8,		///
+    FE_UNDERFLOW	= 0x10,		///
+    FE_INEXACT		= 0x20,		///
+    FE_ALL_EXCEPT	= 0x3F,		/// Mask of all the exceptions
+}
+
+/// Rounding modes
+enum
+{
+    FE_TONEAREST	= 0,		///
+    FE_UPWARD		= 0x800,	///
+    FE_DOWNWARD		= 0x400,	///
+    FE_TOWARDZERO	= 0xC00,	///
+}
+
+version (Windows)
+{
+    extern fenv_t _FE_DFL_ENV;
+
+    /// Default floating point environment
+    fenv_t* FE_DFL_ENV = &_FE_DFL_ENV;
+}
+else version (linux)
+{
+    /// Default floating point environment
+    fenv_t* FE_DFL_ENV = cast(fenv_t*)(-1);
+}
+else
+{
+    static assert(0);
+}
+
+/// Floating point precision
+enum
+{
+    FE_FLTPREC	= 0,			///
+    FE_DBLPREC	= 0x200,		///
+    FE_LDBLPREC	= 0x300,		///
+}
+
+int fetestexcept(int excepts);		///
+int feraiseexcept(int excepts);		///
+int feclearexcept(int excepts);		///
+//int fegetexcept(fexcept_t *flagp,int excepts);	///
+//int fesetexcept(fexcept_t *flagp,int excepts);	///
+int fegetround();			///
+int fesetround(int round);		///
+int fegetprec();			///
+int fesetprec(int prec);		///
+int fegetenv(fenv_t *envp);		///
+int fesetenv(fenv_t *envp);		///
+//void feprocentry(fenv_t *envp);	///
+//void feprocexit(const fenv_t *envp);	///
+
+int fegetexceptflag(fexcept_t *flagp,int excepts);	///
+int fesetexceptflag(fexcept_t *flagp,int excepts);	///
+int feholdexcept(fenv_t *envp);		///
+int feupdateenv(fenv_t *envp);		///
+