/* Decimal context header module for the decNumber C Library.
   Copyright (C) 2005, 2007, 2009 Free Software Foundation, Inc.
   Contributed by IBM Corporation.  Author Mike Cowlishaw.

   This file is part of GCC.

   GCC is free software; you can redistribute it and/or modify it under
   the terms of the GNU General Public License as published by the Free
   Software Foundation; either version 3, or (at your option) any later
   version.

   GCC 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 General Public License
   for more details.

Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.

You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
<http://www.gnu.org/licenses/>.  */

/* ------------------------------------------------------------------ */
/* Decimal Context module header				      */
/* ------------------------------------------------------------------ */
/*								      */
/* Context variables must always have valid values:		      */
/*								      */
/*  status   -- [any bits may be cleared, but not set, by user]       */
/*  round    -- must be one of the enumerated rounding modes	      */
/*								      */
/* The following variables are implied for fixed size formats (i.e.,  */
/* they are ignored) but should still be set correctly in case used   */
/* with decNumber functions:					      */
/*								      */
/*  clamp    -- must be either 0 or 1				      */
/*  digits   -- must be in the range 1 through 999999999	      */
/*  emax     -- must be in the range 0 through 999999999	      */
/*  emin     -- must be in the range 0 through -999999999	      */
/*  extended -- must be either 0 or 1 [present only if DECSUBSET]     */
/*  traps    -- only defined bits may be set			      */
/*								      */
/* ------------------------------------------------------------------ */

#if !defined(DECCONTEXT)
  #define DECCONTEXT
  #define DECCNAME     "decContext"			/* Short name */
  #define DECCFULLNAME "Decimal Context Descriptor"   /* Verbose name */
  #define DECCAUTHOR   "Mike Cowlishaw" 	      /* Who to blame */

  #include "gstdint.h"		   /* C99 standard integers	      */
  #include <stdio.h>		   /* for printf, etc.		      */
  #include <signal.h>		   /* for traps 		      */

  /* Extended flags setting -- set this to 0 to use only IEEE flags   */
  #if !defined(DECEXTFLAG)
  #define DECEXTFLAG 1		   /* 1=enable extended flags	      */
  #endif

  /* Conditional code flag -- set this to 0 for best performance      */
  #if !defined(DECSUBSET)
  #define DECSUBSET  0		   /* 1=enable subset arithmetic      */
  #endif

  /* Context for operations, with associated constants		      */
  enum rounding {
    DEC_ROUND_CEILING,		   /* round towards +infinity	      */
    DEC_ROUND_UP,		   /* round away from 0 	      */
    DEC_ROUND_HALF_UP,		   /* 0.5 rounds up		      */
    DEC_ROUND_HALF_EVEN,	   /* 0.5 rounds to nearest even      */
    DEC_ROUND_HALF_DOWN,	   /* 0.5 rounds down		      */
    DEC_ROUND_DOWN,		   /* round towards 0 (truncate)      */
    DEC_ROUND_FLOOR,		   /* round towards -infinity	      */
    DEC_ROUND_05UP,		   /* round for reround 	      */
    DEC_ROUND_MAX		   /* enum must be less than this     */
    };
  #define DEC_ROUND_DEFAULT DEC_ROUND_HALF_EVEN;

  typedef struct {
    int32_t  digits;		   /* working precision 	      */
    int32_t  emax;		   /* maximum positive exponent       */
    int32_t  emin;		   /* minimum negative exponent       */
    enum     rounding round;	   /* rounding mode		      */
    uint32_t traps;		   /* trap-enabler flags	      */
    uint32_t status;		   /* status flags		      */
    uint8_t  clamp;		   /* flag: apply IEEE exponent clamp */
    #if DECSUBSET
    uint8_t  extended;		   /* flag: special-values allowed    */
    #endif
    } decContext;

  /* Maxima and Minima for context settings			      */
  #define DEC_MAX_DIGITS 999999999
  #define DEC_MIN_DIGITS	 1
  #define DEC_MAX_EMAX	 999999999
  #define DEC_MIN_EMAX		 0
  #define DEC_MAX_EMIN		 0
  #define DEC_MIN_EMIN	-999999999
  #define DEC_MAX_MATH	    999999 /* max emax, etc., for math funcs. */

  /* Classifications for decimal numbers, aligned with 754 (note that */
  /* 'normal' and 'subnormal' are meaningful only with a decContext   */
  /* or a fixed size format).					      */
  enum decClass {
    DEC_CLASS_SNAN,
    DEC_CLASS_QNAN,
    DEC_CLASS_NEG_INF,
    DEC_CLASS_NEG_NORMAL,
    DEC_CLASS_NEG_SUBNORMAL,
    DEC_CLASS_NEG_ZERO,
    DEC_CLASS_POS_ZERO,
    DEC_CLASS_POS_SUBNORMAL,
    DEC_CLASS_POS_NORMAL,
    DEC_CLASS_POS_INF
    };
  /* Strings for the decClasses */
  #define DEC_ClassString_SN  "sNaN"
  #define DEC_ClassString_QN  "NaN"
  #define DEC_ClassString_NI  "-Infinity"
  #define DEC_ClassString_NN  "-Normal"
  #define DEC_ClassString_NS  "-Subnormal"
  #define DEC_ClassString_NZ  "-Zero"
  #define DEC_ClassString_PZ  "+Zero"
  #define DEC_ClassString_PS  "+Subnormal"
  #define DEC_ClassString_PN  "+Normal"
  #define DEC_ClassString_PI  "+Infinity"
  #define DEC_ClassString_UN  "Invalid"

  /* Trap-enabler and Status flags (exceptional conditions), and      */
  /* their names.  The top byte is reserved for internal use	      */
  #if DECEXTFLAG
    /* Extended flags */
    #define DEC_Conversion_syntax    0x00000001
    #define DEC_Division_by_zero     0x00000002
    #define DEC_Division_impossible  0x00000004
    #define DEC_Division_undefined   0x00000008
    #define DEC_Insufficient_storage 0x00000010 /* [when malloc fails]	*/
    #define DEC_Inexact 	     0x00000020
    #define DEC_Invalid_context      0x00000040
    #define DEC_Invalid_operation    0x00000080
    #if DECSUBSET
    #define DEC_Lost_digits	     0x00000100
    #endif
    #define DEC_Overflow	     0x00000200
    #define DEC_Clamped 	     0x00000400
    #define DEC_Rounded 	     0x00000800
    #define DEC_Subnormal	     0x00001000
    #define DEC_Underflow	     0x00002000
  #else
    /* IEEE flags only */
    #define DEC_Conversion_syntax    0x00000010
    #define DEC_Division_by_zero     0x00000002
    #define DEC_Division_impossible  0x00000010
    #define DEC_Division_undefined   0x00000010
    #define DEC_Insufficient_storage 0x00000010 /* [when malloc fails]	*/
    #define DEC_Inexact 	     0x00000001
    #define DEC_Invalid_context      0x00000010
    #define DEC_Invalid_operation    0x00000010
    #if DECSUBSET
    #define DEC_Lost_digits	     0x00000000
    #endif
    #define DEC_Overflow	     0x00000008
    #define DEC_Clamped 	     0x00000000
    #define DEC_Rounded 	     0x00000000
    #define DEC_Subnormal	     0x00000000
    #define DEC_Underflow	     0x00000004
  #endif

  /* IEEE 754 groupings for the flags				      */
  /* [DEC_Clamped, DEC_Lost_digits, DEC_Rounded, and DEC_Subnormal    */
  /* are not in IEEE 754]					      */
  #define DEC_IEEE_754_Division_by_zero  (DEC_Division_by_zero)
  #if DECSUBSET
  #define DEC_IEEE_754_Inexact		 (DEC_Inexact | DEC_Lost_digits)
  #else
  #define DEC_IEEE_754_Inexact		 (DEC_Inexact)
  #endif
  #define DEC_IEEE_754_Invalid_operation (DEC_Conversion_syntax |     \
					  DEC_Division_impossible |   \
					  DEC_Division_undefined |    \
					  DEC_Insufficient_storage |  \
					  DEC_Invalid_context |       \
					  DEC_Invalid_operation)
  #define DEC_IEEE_754_Overflow 	 (DEC_Overflow)
  #define DEC_IEEE_754_Underflow	 (DEC_Underflow)

  /* flags which are normally errors (result is qNaN, infinite, or 0) */
  #define DEC_Errors (DEC_IEEE_754_Division_by_zero |		      \
		      DEC_IEEE_754_Invalid_operation |		      \
		      DEC_IEEE_754_Overflow | DEC_IEEE_754_Underflow)
  /* flags which cause a result to become qNaN			      */
  #define DEC_NaNs    DEC_IEEE_754_Invalid_operation

  /* flags which are normally for information only (finite results)   */
  #if DECSUBSET
  #define DEC_Information (DEC_Clamped | DEC_Rounded | DEC_Inexact    \
			  | DEC_Lost_digits)
  #else
  #define DEC_Information (DEC_Clamped | DEC_Rounded | DEC_Inexact)
  #endif

  /* IEEE 854 names (for compatibility with older decNumber versions) */
  #define DEC_IEEE_854_Division_by_zero  DEC_IEEE_754_Division_by_zero
  #define DEC_IEEE_854_Inexact		 DEC_IEEE_754_Inexact
  #define DEC_IEEE_854_Invalid_operation DEC_IEEE_754_Invalid_operation
  #define DEC_IEEE_854_Overflow 	 DEC_IEEE_754_Overflow
  #define DEC_IEEE_854_Underflow	 DEC_IEEE_754_Underflow

  /* Name strings for the exceptional conditions		      */
  #define DEC_Condition_CS "Conversion syntax"
  #define DEC_Condition_DZ "Division by zero"
  #define DEC_Condition_DI "Division impossible"
  #define DEC_Condition_DU "Division undefined"
  #define DEC_Condition_IE "Inexact"
  #define DEC_Condition_IS "Insufficient storage"
  #define DEC_Condition_IC "Invalid context"
  #define DEC_Condition_IO "Invalid operation"
  #if DECSUBSET
  #define DEC_Condition_LD "Lost digits"
  #endif
  #define DEC_Condition_OV "Overflow"
  #define DEC_Condition_PA "Clamped"
  #define DEC_Condition_RO "Rounded"
  #define DEC_Condition_SU "Subnormal"
  #define DEC_Condition_UN "Underflow"
  #define DEC_Condition_ZE "No status"
  #define DEC_Condition_MU "Multiple status"
  #define DEC_Condition_Length 21  /* length of the longest string,   */
				   /* including terminator	      */

  /* Initialization descriptors, used by decContextDefault	      */
  #define DEC_INIT_BASE 	0
  #define DEC_INIT_DECIMAL32   32
  #define DEC_INIT_DECIMAL64   64
  #define DEC_INIT_DECIMAL128 128
  /* Synonyms */
  #define DEC_INIT_DECSINGLE  DEC_INIT_DECIMAL32
  #define DEC_INIT_DECDOUBLE  DEC_INIT_DECIMAL64
  #define DEC_INIT_DECQUAD    DEC_INIT_DECIMAL128

  /* decContext routines					      */

  #include "decContextSymbols.h"

  #ifdef __cplusplus
  extern "C" {
  #endif

  extern decContext  * decContextClearStatus(decContext *, uint32_t);
  extern decContext  * decContextDefault(decContext *, int32_t);
  extern enum rounding decContextGetRounding(decContext *);
  extern uint32_t      decContextGetStatus(decContext *);
  extern decContext  * decContextRestoreStatus(decContext *, uint32_t, uint32_t);
  extern uint32_t      decContextSaveStatus(decContext *, uint32_t);
  extern decContext  * decContextSetRounding(decContext *, enum rounding);
  extern decContext  * decContextSetStatus(decContext *, uint32_t);
  extern decContext  * decContextSetStatusFromString(decContext *, const char *);
  extern decContext  * decContextSetStatusFromStringQuiet(decContext *, const char *);
  extern decContext  * decContextSetStatusQuiet(decContext *, uint32_t);
  extern const char  * decContextStatusToString(const decContext *);
  extern int32_t       decContextTestEndian(uint8_t);
  extern uint32_t      decContextTestSavedStatus(uint32_t, uint32_t);
  extern uint32_t      decContextTestStatus(decContext *, uint32_t);
  extern decContext  * decContextZeroStatus(decContext *);

  #ifdef __cplusplus
  }
  #endif

#endif
