decNumber.h revision 302408
197521Sphk/* Decimal Number module header for the decNumber C Library
297521Sphk   Copyright (C) 2005 Free Software Foundation, Inc.
397521Sphk   Contributed by IBM Corporation.  Author Mike Cowlishaw.
4139815Simp
5139815Simp   This file is part of GCC.
6139815Simp
797521Sphk   GCC is free software; you can redistribute it and/or modify it under
897521Sphk   the terms of the GNU General Public License as published by the Free
997521Sphk   Software Foundation; either version 2, or (at your option) any later
1097521Sphk   version.
1197521Sphk
1297521Sphk   In addition to the permissions in the GNU General Public License,
1397521Sphk   the Free Software Foundation gives you unlimited permission to link
1497521Sphk   the compiled version of this file into combinations with other
1597521Sphk   programs, and to distribute those combinations without any
1697521Sphk   restriction coming from the use of this file.  (The General Public
1797521Sphk   License restrictions do apply in other respects; for example, they
1897521Sphk   cover modification of the file, and distribution when not linked
1997521Sphk   into a combine executable.)
2097521Sphk
2197521Sphk   GCC is distributed in the hope that it will be useful, but WITHOUT ANY
2297521Sphk   WARRANTY; without even the implied warranty of MERCHANTABILITY or
2397521Sphk   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
2497521Sphk   for more details.
2597521Sphk
2697521Sphk   You should have received a copy of the GNU General Public License
2797521Sphk   along with GCC; see the file COPYING.  If not, write to the Free
2897521Sphk   Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
2997521Sphk   02110-1301, USA.  */
3097521Sphk
3197521Sphk#if !defined(DECNUMBER)
3297521Sphk#define DECNUMBER
3397521Sphk#define DECNAME     "decNumber"	/* Short name */
3497521Sphk#define DECVERSION  "decNumber 3.24"	/* Version [16 max.] */
3597521Sphk#define DECFULLNAME "Decimal Number Module"	/* Verbose name */
3697521Sphk#define DECAUTHOR   "Mike Cowlishaw"	/* Who to blame */
3797521Sphk
3897521Sphk#if !defined(DECCONTEXT)
3997521Sphk#include "decContext.h"
4097521Sphk#endif
4197521Sphk
4297521Sphk
4397521Sphk  /* Bit settings for decNumber.bits */
4497521Sphk#define DECNEG    0x80		/* Sign; 1=negative, 0=positive or zero */
45116189Sobrien#define DECINF    0x40		/* 1=Infinity */
46116189Sobrien#define DECNAN    0x20		/* 1=NaN */
47116189Sobrien#define DECSNAN   0x10		/* 1=sNaN */
4897521Sphk  /* The remaining bits are reserved; they must be 0 */
4997521Sphk#define DECSPECIAL (DECINF|DECNAN|DECSNAN)	/* any special value */
5097521Sphk
51233517Smarius  /* DECNUMDIGITS is the default number of digits we can hold in the */
5297521Sphk  /* structure.  If undefined, 1 is assumed and it is assumed that the */
5397521Sphk  /* structure will be immediately followed by extra space (if */
5497521Sphk  /* required).  DECNUMDIGITS is always >0. */
5597521Sphk#if !defined(DECNUMDIGITS)
5697521Sphk#define DECNUMDIGITS 1
5797521Sphk#endif
5897521Sphk
5997521Sphk
6097521Sphk  /* Define the decNumber data structure.  The size and shape of the */
6197521Sphk  /* units array in the structure is determined by the following */
6297521Sphk  /* constant.  This must not be changed without recompiling the */
6397521Sphk  /* decNumber library modules. */
6497521Sphk#define DECDPUN 4		/* Decimal Digits Per UNit [must be in */
6597521Sphk				   /* range 1-9; power of 2 recommended]. */
6697521Sphk  /* The size (integer data type) of each unit is determined by the */
6797521Sphk  /* number of digits it will hold. */
6897521Sphk#if   DECDPUN<=2
6997521Sphk#define decNumberUnit uint8_t
7097521Sphk#elif DECDPUN<=4
7197521Sphk#define decNumberUnit uint16_t
7297521Sphk#else
7397521Sphk#define decNumberUnit uint32_t
7497521Sphk#endif
7597521Sphk  /* The number of decNumberUnits we need is ceiling of DECNUMDIGITS/DECDPUN */
7697521Sphk#define DECNUMUNITS ((DECNUMDIGITS+DECDPUN-1)/DECDPUN)
7797521Sphk
7897521Sphk  /* The data structure... */
7997521Sphktypedef struct
8097521Sphk{
8197521Sphk  int32_t digits;		/* Count of digits in the coefficient; >0 */
8297521Sphk  int32_t exponent;		/* Unadjusted exponent, unbiased, in */
8397521Sphk  /* range: -1999999997 through 999999999 */
8497521Sphk  uint8_t bits;			/* Indicator bits (see above) */
8597521Sphk  decNumberUnit lsu[DECNUMUNITS];	/* Coefficient, from least significant unit */
8697521Sphk} decNumber;
8797521Sphk
8897521Sphk  /* Notes: */
8997521Sphk  /* 1. If digits is > DECDPUN then there will be more than one */
9097521Sphk  /*    decNumberUnits immediately following the first element of lsu. */
9197521Sphk  /*    These contain the remaining (more significant) digits of the */
9297521Sphk  /*    number, and may be in the lsu array, or may be guaranteed by */
9397521Sphk  /*    some other mechanism (such as being contained in another */
9497521Sphk  /*    structure, or being overlaid on dynamically allocated storage). */
9597521Sphk  /* */
9697521Sphk  /*    Each integer of the coefficient (except the possibly the last) */
97145604Smarcel  /*    contains DECDPUN digits (e.g., a value in the range 0 through */
98145604Smarcel  /*    99999999 if DECDPUN is 8, or 0 through 9999 if DECDPUN is 4). */
99145604Smarcel  /* */
100145604Smarcel  /* 2. A decNumber converted to a string may need up to digits+14 */
101145611Smarcel  /*    characters.  The worst cases (non-exponential and exponential */
102145604Smarcel  /*    formats) are: -0.00000{9...}# */
103145604Smarcel  /*             and: -9.{9...}E+999999999#   (where # is '\0') */
104145604Smarcel
105145604Smarcel
106145604Smarcel  /* ------------------------------------------------------------------ */
107145604Smarcel  /* decNumber public functions and macros                              */
108145604Smarcel  /* ------------------------------------------------------------------ */
109145604Smarcel
110145604Smarcel#ifdef IN_LIBGCC2
111145604Smarcel#define decNumberFromString __decNumberFromString
112145604Smarcel#define decNumberToString __decNumberToString
113145604Smarcel#define decNumberToEngString __decNumberToEngString
114145604Smarcel#define decNumberAbs __decNumberAbs
115188605Srrs#define decNumberAdd __decNumberAdd
116188605Srrs#define decNumberCompare __decNumberCompare
117188605Srrs#define decNumberDivide __decNumberDivide
118188605Srrs#define decNumberDivideInteger __decNumberDivideInteger
119188605Srrs#define decNumberMax __decNumberMax
120188605Srrs#define decNumberMin __decNumberMin
121188605Srrs#define decNumberMinus __decNumberMinus
122188605Srrs#define decNumberMultiply __decNumberMultiply
123188605Srrs#define decNumberNormalize __decNumberNormalize
124188605Srrs#define decNumberPlus __decNumberPlus
125188605Srrs#define decNumberPower __decNumberPower
126188605Srrs#define decNumberQuantize __decNumberQuantize
127188605Srrs#define decNumberRemainder __decNumberRemainder
128188605Srrs#define decNumberRemainderNear __decNumberRemainderNear
129188605Srrs#define decNumberRescale __decNumberRescale
130188605Srrs#define decNumberSameQuantum __decNumberSameQuantum
131188605Srrs#define decNumberSquareRoot __decNumberSquareRoot
132188605Srrs#define decNumberSubtract __decNumberSubtract
133188605Srrs#define decNumberToIntegralValue __decNumberToIntegralValue
134188605Srrs#define decNumberCopy __decNumberCopy
135188605Srrs#define decNumberTrim __decNumberTrim
136188605Srrs#define decNumberVersion __decNumberVersion
137233517Smarius#define decNumberZero __decNumberZero
138188605Srrs#endif
139188605Srrs
140188605Srrs  /* Conversions */
141188605SrrsdecNumber *decNumberFromString (decNumber *, const char *, decContext *);
142188605Srrschar *decNumberToString (const decNumber *, char *);
143188605Srrschar *decNumberToEngString (const decNumber *, char *);
144188605Srrs
145188605Srrs  /* Operators */
146188605SrrsdecNumber *decNumberAbs (decNumber *, const decNumber *, decContext *);
147188605SrrsdecNumber *decNumberAdd (decNumber *, const decNumber *,
148188605Srrs			 const decNumber *, decContext *);
149188605SrrsdecNumber *decNumberCompare (decNumber *, const decNumber *,
150188605Srrs			     const decNumber *, decContext *);
151188605SrrsdecNumber *decNumberDivide (decNumber *, const decNumber *,
152188605Srrs			    const decNumber *, decContext *);
153188605SrrsdecNumber *decNumberDivideInteger (decNumber *, const decNumber *,
154188605Srrs				   const decNumber *, decContext *);
155188605SrrsdecNumber *decNumberMax (decNumber *, const decNumber *,
156188605Srrs			 const decNumber *, decContext *);
157188605SrrsdecNumber *decNumberMin (decNumber *, const decNumber *,
158188605Srrs			 const decNumber *, decContext *);
159188605SrrsdecNumber *decNumberMinus (decNumber *, const decNumber *, decContext *);
160188605SrrsdecNumber *decNumberMultiply (decNumber *, const decNumber *,
161188605Srrs			      const decNumber *, decContext *);
162188605SrrsdecNumber *decNumberNormalize (decNumber *, const decNumber *, decContext *);
163188605SrrsdecNumber *decNumberPlus (decNumber *, const decNumber *, decContext *);
164188605SrrsdecNumber *decNumberPower (decNumber *, const decNumber *,
165188605Srrs			   const decNumber *, decContext *);
166188605SrrsdecNumber *decNumberQuantize (decNumber *, const decNumber *,
167188605Srrs			      const decNumber *, decContext *);
168188605SrrsdecNumber *decNumberRemainder (decNumber *, const decNumber *,
169188605Srrs			       const decNumber *, decContext *);
170188605SrrsdecNumber *decNumberRemainderNear (decNumber *, const decNumber *,
171188605Srrs				   const decNumber *, decContext *);
172188605SrrsdecNumber *decNumberRescale (decNumber *, const decNumber *,
173188605Srrs			     const decNumber *, decContext *);
174188605SrrsdecNumber *decNumberSameQuantum (decNumber *, const decNumber *, const decNumber *);
175188605SrrsdecNumber *decNumberSquareRoot (decNumber *, const decNumber *, decContext *);
176188605SrrsdecNumber *decNumberSubtract (decNumber *, const decNumber *,
177188605Srrs			      const decNumber *, decContext *);
178188605SrrsdecNumber *decNumberToIntegralValue (decNumber *, const decNumber *, decContext *);
179188605Srrs
180188605Srrs  /* Utilities */
181188605SrrsdecNumber *decNumberCopy (decNumber *, const decNumber *);
182188605SrrsdecNumber *decNumberTrim (decNumber *);
183188605Srrsconst char *decNumberVersion (void);
184188605SrrsdecNumber *decNumberZero (decNumber *);
185188605Srrs
186188605Srrs  /* Macros */
187188605Srrs#define decNumberIsZero(dn)     (*(dn)->lsu==0 \
188188605Srrs                                   && (dn)->digits==1 \
189188605Srrs                                   && (((dn)->bits&DECSPECIAL)==0))
190188605Srrs#define decNumberIsNegative(dn) (((dn)->bits&DECNEG)!=0)
191188605Srrs#define decNumberIsNaN(dn)      (((dn)->bits&(DECNAN|DECSNAN))!=0)
192188605Srrs#define decNumberIsInfinite(dn) (((dn)->bits&DECINF)!=0)
193188605Srrs
194188605Srrs#endif
195188605Srrs