os/ossrv/genericopenlibs/openenvcore/libc/inc/gdtoaimp.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /****************************************************************
     2 
     3 The author of this software is David M. Gay.
     4 
     5 Copyright (C) 1998-2000 by Lucent Technologies
     6 All Rights Reserved
     7 
     8 Permission to use, copy, modify, and distribute this software and
     9 its documentation for any purpose and without fee is hereby
    10 granted, provided that the above copyright notice appear in all
    11 copies and that both that the copyright notice and this
    12 permission notice and warranty disclaimer appear in supporting
    13 documentation, and that the name of Lucent or any of its entities
    14 not be used in advertising or publicity pertaining to
    15 distribution of the software without specific, written prior
    16 permission.
    17 
    18 LUCENT DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
    19 INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
    20 IN NO EVENT SHALL LUCENT OR ANY OF ITS ENTITIES BE LIABLE FOR ANY
    21 SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    22 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
    23 IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
    24 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
    25 THIS SOFTWARE.
    26 
    27 ****************************************************************/
    28 
    29 /* $FreeBSD: src/contrib/gdtoa/gdtoaimp.h,v 1.7 2005/01/18 18:56:18 das Exp $ */
    30 
    31 /* This is a variation on dtoa.c that converts arbitary binary
    32    floating-point formats to and from decimal notation.  It uses
    33    double-precision arithmetic internally, so there are still
    34    various #ifdefs that adapt the calculations to the native
    35    double-precision arithmetic (any of IEEE, VAX D_floating,
    36    or IBM mainframe arithmetic).
    37 
    38    Please send bug reports to
    39 	David M. Gay
    40 	Bell Laboratories, Room 2C-463
    41 	600 Mountain Avenue
    42 	Murray Hill, NJ 07974-0636
    43 	U.S.A.
    44 	dmg@bell-labs.com
    45  */
    46 
    47 /* On a machine with IEEE extended-precision registers, it is
    48  * necessary to specify double-precision (53-bit) rounding precision
    49  * before invoking strtod or dtoa.  If the machine uses (the equivalent
    50  * of) Intel 80x87 arithmetic, the call
    51  *	_control87(PC_53, MCW_PC);
    52  * does this with many compilers.  Whether this or another call is
    53  * appropriate depends on the compiler; for this to work, it may be
    54  * necessary to #include "float.h" or another system-dependent header
    55  * file.
    56  */
    57 
    58 /* strtod for IEEE-, VAX-, and IBM-arithmetic machines.
    59  *
    60  * This strtod returns a nearest machine number to the input decimal
    61  * string (or sets errno to ERANGE).  With IEEE arithmetic, ties are
    62  * broken by the IEEE round-even rule.  Otherwise ties are broken by
    63  * biased rounding (add half and chop).
    64  *
    65  * Inspired loosely by William D. Clinger's paper "How to Read Floating
    66  * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
    67  *
    68  * Modifications:
    69  *
    70  *	1. We only require IEEE, IBM, or VAX double-precision
    71  *		arithmetic (not IEEE double-extended).
    72  *	2. We get by with floating-point arithmetic in a case that
    73  *		Clinger missed -- when we're computing d * 10^n
    74  *		for a small integer d and the integer n is not too
    75  *		much larger than 22 (the maximum integer k for which
    76  *		we can represent 10^k exactly), we may be able to
    77  *		compute (d*10^k) * 10^(e-k) with just one roundoff.
    78  *	3. Rather than a bit-at-a-time adjustment of the binary
    79  *		result in the hard case, we use floating-point
    80  *		arithmetic to determine the adjustment to within
    81  *		one bit; only in really hard cases do we need to
    82  *		compute a second residual.
    83  *	4. Because of 3., we don't need a large table of powers of 10
    84  *		for ten-to-e (just some small tables, e.g. of 10^k
    85  *		for 0 <= k <= 22).
    86  */
    87 
    88 /*
    89  * #define IEEE_8087 for IEEE-arithmetic machines where the least
    90  *	significant byte has the lowest address.
    91  * #define IEEE_MC68k for IEEE-arithmetic machines where the most
    92  *	significant byte has the lowest address.
    93  * #define Long int on machines with 32-bit ints and 64-bit longs.
    94  * #define Sudden_Underflow for IEEE-format machines without gradual
    95  *	underflow (i.e., that flush to zero on underflow).
    96  * #define IBM for IBM mainframe-style floating-point arithmetic.
    97  * #define VAX for VAX-style floating-point arithmetic (D_floating).
    98  * #define No_leftright to omit left-right logic in fast floating-point
    99  *	computation of dtoa.
   100  * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3.
   101  * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
   102  *	that use extended-precision instructions to compute rounded
   103  *	products and quotients) with IBM.
   104  * #define ROUND_BIASED for IEEE-format with biased rounding.
   105  * #define Inaccurate_Divide for IEEE-format with correctly rounded
   106  *	products but inaccurate quotients, e.g., for Intel i860.
   107  * #define NO_LONG_LONG on machines that do not have a "long long"
   108  *	integer type (of >= 64 bits).  On such machines, you can
   109  *	#define Just_16 to store 16 bits per 32-bit Long when doing
   110  *	high-precision integer arithmetic.  Whether this speeds things
   111  *	up or slows things down depends on the machine and the number
   112  *	being converted.  If long long is available and the name is
   113  *	something other than "long long", #define Llong to be the name,
   114  *	and if "unsigned Llong" does not work as an unsigned version of
   115  *	Llong, #define #ULLong to be the corresponding unsigned type.
   116  * #define KR_headers for old-style C function headers.
   117  * #define Bad_float_h if your system lacks a float.h or if it does not
   118  *	define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
   119  *	FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
   120  * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
   121  *	if memory is available and otherwise does something you deem
   122  *	appropriate.  If MALLOC is undefined, malloc will be invoked
   123  *	directly -- and assumed always to succeed.
   124  * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making
   125  *	memory allocations from a private pool of memory when possible.
   126  *	When used, the private pool is PRIVATE_MEM bytes long:  2304 bytes,
   127  *	unless #defined to be a different length.  This default length
   128  *	suffices to get rid of MALLOC calls except for unusual cases,
   129  *	such as decimal-to-binary conversion of a very long string of
   130  *	digits.  When converting IEEE double precision values, the
   131  *	longest string gdtoa can return is about 751 bytes long.  For
   132  *	conversions by strtod of strings of 800 digits and all gdtoa
   133  *	conversions of IEEE doubles in single-threaded executions with
   134  *	8-byte pointers, PRIVATE_MEM >= 7400 appears to suffice; with
   135  *	4-byte pointers, PRIVATE_MEM >= 7112 appears adequate.
   136  * #define INFNAN_CHECK on IEEE systems to cause strtod to check for
   137  *	Infinity and NaN (case insensitively).  On some systems (e.g.,
   138  *	some HP systems), it may be necessary to #define NAN_WORD0
   139  *	appropriately -- to the most significant word of a quiet NaN.
   140  *	(On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.)
   141  *	When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined,
   142  *	strtodg also accepts (case insensitively) strings of the form
   143  *	NaN(x), where x is a string of hexadecimal digits and spaces;
   144  *	if there is only one string of hexadecimal digits, it is taken
   145  *	for the fraction bits of the resulting NaN; if there are two or
   146  *	more strings of hexadecimal digits, each string is assigned
   147  *	to the next available sequence of 32-bit words of fractions
   148  *	bits (starting with the most significant), right-aligned in
   149  *	each sequence.
   150  * #define MULTIPLE_THREADS if the system offers preemptively scheduled
   151  *	multiple threads.  In this case, you must provide (or suitably
   152  *	#define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed
   153  *	by FREE_DTOA_LOCK(n) for n = 0 or 1.  (The second lock, accessed
   154  *	in pow5mult, ensures lazy evaluation of only one copy of high
   155  *	powers of 5; omitting this lock would introduce a small
   156  *	probability of wasting memory, but would otherwise be harmless.)
   157  *	You must also invoke freedtoa(s) to free the value s returned by
   158  *	dtoa.  You may do so whether or not MULTIPLE_THREADS is #defined.
   159  * #define IMPRECISE_INEXACT if you do not care about the setting of
   160  *	the STRTOG_Inexact bits in the special case of doing IEEE double
   161  *	precision conversions (which could also be done by the strtog in
   162  *	dtoa.c).
   163  * #define NO_HEX_FP to disable recognition of C9x's hexadecimal
   164  *	floating-point constants.
   165  * #define -DNO_ERRNO to suppress setting errno (in strtod.c and
   166  *	strtodg.c).
   167  * #define NO_STRING_H to use private versions of memcpy.
   168  *	On some K&R systems, it may also be necessary to
   169  *	#define DECLARE_SIZE_T in this case.
   170  * #define YES_ALIAS to permit aliasing certain double values with
   171  *	arrays of ULongs.  This leads to slightly better code with
   172  *	some compilers and was always used prior to 19990916, but it
   173  *	is not strictly legal and can cause trouble with aggressively
   174  *	optimizing compilers (e.g., gcc 2.95.1 under -O2).
   175  * #define USE_LOCALE to use the current locale's decimal_point value.
   176  */
   177 
   178 #ifndef GDTOAIMP_H_INCLUDED
   179 #define GDTOAIMP_H_INCLUDED
   180 #include "gdtoa.h"
   181 
   182 #ifdef DEBUG
   183 #include "stdio.h"
   184 #define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
   185 #endif
   186 
   187 #include "limits.h"
   188 #include "stdlib.h"
   189 #include "string.h"
   190 #include "libc_private.h"
   191 
   192 #include "namespace.h"
   193 #include <pthread.h>
   194 #include "un-namespace.h"
   195 
   196 #ifdef __SYMBIAN32__
   197 #ifdef __WINSCW__
   198 #pragma warn_unusedarg off
   199 #pragma warn_possunwant off
   200 #endif//__WINSCW__
   201 #endif//__SYMBIAN32__
   202 
   203 #ifdef KR_headers
   204 #define Char char
   205 #else
   206 #define Char void
   207 #endif
   208 
   209 #ifdef MALLOC
   210 extern Char *MALLOC ANSI((size_t));
   211 #else
   212 #define MALLOC malloc
   213 #endif
   214 
   215 #define INFNAN_CHECK
   216 #define USE_LOCALE
   217 #define Honor_FLT_ROUNDS
   218 
   219 #undef IEEE_Arith
   220 #undef Avoid_Underflow
   221 #ifdef IEEE_MC68k
   222 #define IEEE_Arith
   223 #endif
   224 #ifdef IEEE_8087
   225 #define IEEE_Arith
   226 #endif
   227 
   228 #include "errno.h"
   229 #ifdef Bad_float_h
   230 
   231 #ifdef IEEE_Arith
   232 #define DBL_DIG 15
   233 #define DBL_MAX_10_EXP 308
   234 #define DBL_MAX_EXP 1024
   235 #define FLT_RADIX 2
   236 #define DBL_MAX 1.7976931348623157e+308
   237 #endif
   238 
   239 #ifdef IBM
   240 #define DBL_DIG 16
   241 #define DBL_MAX_10_EXP 75
   242 #define DBL_MAX_EXP 63
   243 #define FLT_RADIX 16
   244 #define DBL_MAX 7.2370055773322621e+75
   245 #endif
   246 
   247 #ifdef VAX
   248 #define DBL_DIG 16
   249 #define DBL_MAX_10_EXP 38
   250 #define DBL_MAX_EXP 127
   251 #define FLT_RADIX 2
   252 #define DBL_MAX 1.7014118346046923e+38
   253 #define n_bigtens 2
   254 #endif
   255 
   256 #ifndef LONG_MAX
   257 #define LONG_MAX 2147483647
   258 #endif
   259 
   260 #else /* ifndef Bad_float_h */
   261 #include "float.h"
   262 #endif /* Bad_float_h */
   263 
   264 #ifdef IEEE_Arith
   265 #define Scale_Bit 0x10
   266 #define n_bigtens 5
   267 #endif
   268 
   269 #ifdef IBM
   270 #define n_bigtens 3
   271 #endif
   272 
   273 #ifdef VAX
   274 #define n_bigtens 2
   275 #endif
   276 
   277 #ifndef __MATH_H__
   278 #include "math.h"
   279 #endif
   280 
   281 #ifdef __cplusplus
   282 extern "C" {
   283 #endif
   284 
   285 #if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
   286 //Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
   287 #endif
   288 
   289 typedef union { double d; ULong L[2]; } U;
   290 
   291 #ifdef YES_ALIAS
   292 #define dval(x) x
   293 #ifdef IEEE_8087
   294 #define word0(x) ((ULong *)&x)[1]
   295 #define word1(x) ((ULong *)&x)[0]
   296 #else
   297 #define word0(x) ((ULong *)&x)[0]
   298 #define word1(x) ((ULong *)&x)[1]
   299 #endif
   300 #else /* !YES_ALIAS */
   301 #ifdef IEEE_8087
   302 #define word0(x) ((U*)&x)->L[1]
   303 #define word1(x) ((U*)&x)->L[0]
   304 #else
   305 #define word0(x) ((U*)&x)->L[0]
   306 #define word1(x) ((U*)&x)->L[1]
   307 #endif
   308 #define dval(x) ((U*)&x)->d
   309 #endif /* YES_ALIAS */
   310 
   311 /* The following definition of Storeinc is appropriate for MIPS processors.
   312  * An alternative that might be better on some machines is
   313  * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
   314  */
   315 #if defined(IEEE_8087) + defined(VAX)
   316 #define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
   317 ((unsigned short *)a)[0] = (unsigned short)c, a++)
   318 #else
   319 #define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
   320 ((unsigned short *)a)[1] = (unsigned short)c, a++)
   321 #endif
   322 
   323 /* #define P DBL_MANT_DIG */
   324 /* Ten_pmax = floor(P*log(2)/log(5)) */
   325 /* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
   326 /* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
   327 /* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
   328 
   329 #ifdef IEEE_Arith
   330 #define Exp_shift  20
   331 #define Exp_shift1 20
   332 #define Exp_msk1    0x100000
   333 #define Exp_msk11   0x100000
   334 #define Exp_mask  0x7ff00000
   335 #define P 53
   336 #define Bias 1023
   337 #define Emin (-1022)
   338 #define Exp_1  0x3ff00000
   339 #define Exp_11 0x3ff00000
   340 #define Ebits 11
   341 #define Frac_mask  0xfffff
   342 #define Frac_mask1 0xfffff
   343 #define Ten_pmax 22
   344 #define Bletch 0x10
   345 #define Bndry_mask  0xfffff
   346 #define Bndry_mask1 0xfffff
   347 #define LSB 1
   348 #define Sign_bit 0x80000000
   349 #define Log2P 1
   350 #define Tiny0 0
   351 #define Tiny1 1
   352 #define Quick_max 14
   353 #define Int_max 14
   354 
   355 #ifndef Flt_Rounds
   356 #ifdef FLT_ROUNDS
   357 #define Flt_Rounds FLT_ROUNDS
   358 #else
   359 #define Flt_Rounds 1
   360 #endif
   361 #endif /*Flt_Rounds*/
   362 
   363 #else /* ifndef IEEE_Arith */
   364 #undef  Sudden_Underflow
   365 #define Sudden_Underflow
   366 #ifdef IBM
   367 #undef Flt_Rounds
   368 #define Flt_Rounds 0
   369 #define Exp_shift  24
   370 #define Exp_shift1 24
   371 #define Exp_msk1   0x1000000
   372 #define Exp_msk11  0x1000000
   373 #define Exp_mask  0x7f000000
   374 #define P 14
   375 #define Bias 65
   376 #define Exp_1  0x41000000
   377 #define Exp_11 0x41000000
   378 #define Ebits 8	/* exponent has 7 bits, but 8 is the right value in b2d */
   379 #define Frac_mask  0xffffff
   380 #define Frac_mask1 0xffffff
   381 #define Bletch 4
   382 #define Ten_pmax 22
   383 #define Bndry_mask  0xefffff
   384 #define Bndry_mask1 0xffffff
   385 #define LSB 1
   386 #define Sign_bit 0x80000000
   387 #define Log2P 4
   388 #define Tiny0 0x100000
   389 #define Tiny1 0
   390 #define Quick_max 14
   391 #define Int_max 15
   392 #else /* VAX */
   393 #undef Flt_Rounds
   394 #define Flt_Rounds 1
   395 #define Exp_shift  23
   396 #define Exp_shift1 7
   397 #define Exp_msk1    0x80
   398 #define Exp_msk11   0x800000
   399 #define Exp_mask  0x7f80
   400 #define P 56
   401 #define Bias 129
   402 #define Exp_1  0x40800000
   403 #define Exp_11 0x4080
   404 #define Ebits 8
   405 #define Frac_mask  0x7fffff
   406 #define Frac_mask1 0xffff007f
   407 #define Ten_pmax 24
   408 #define Bletch 2
   409 #define Bndry_mask  0xffff007f
   410 #define Bndry_mask1 0xffff007f
   411 #define LSB 0x10000
   412 #define Sign_bit 0x8000
   413 #define Log2P 1
   414 #define Tiny0 0x80
   415 #define Tiny1 0
   416 #define Quick_max 15
   417 #define Int_max 15
   418 #endif /* IBM, VAX */
   419 #endif /* IEEE_Arith */
   420 
   421 #ifndef IEEE_Arith
   422 #define ROUND_BIASED
   423 #endif
   424 
   425 #ifdef RND_PRODQUOT
   426 #define rounded_product(a,b) a = rnd_prod(a, b)
   427 #define rounded_quotient(a,b) a = rnd_quot(a, b)
   428 #ifdef KR_headers
   429 extern double rnd_prod(), rnd_quot();
   430 #else
   431 extern double rnd_prod(double, double), rnd_quot(double, double);
   432 #endif
   433 #else
   434 #define rounded_product(a,b) a *= b
   435 #define rounded_quotient(a,b) a /= b
   436 #endif
   437 
   438 #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
   439 #define Big1 0xffffffff
   440 
   441 #undef  Pack_16
   442 #ifndef Pack_32
   443 #define Pack_32
   444 #endif
   445 
   446 #ifdef NO_LONG_LONG
   447 #undef ULLong
   448 #ifdef Just_16
   449 #undef Pack_32
   450 #define Pack_16
   451 /* When Pack_32 is not defined, we store 16 bits per 32-bit Long.
   452  * This makes some inner loops simpler and sometimes saves work
   453  * during multiplications, but it often seems to make things slightly
   454  * slower.  Hence the default is now to store 32 bits per Long.
   455  */
   456 #endif
   457 #else	/* long long available */
   458 #ifndef Llong
   459 #define Llong long long
   460 #endif
   461 #ifndef ULLong
   462 #define ULLong unsigned Llong
   463 #endif
   464 #endif /* NO_LONG_LONG */
   465 
   466 #ifdef Pack_32
   467 #define ULbits 32
   468 #define kshift 5
   469 #define kmask 31
   470 #define ALL_ON 0xffffffff
   471 #else
   472 #define ULbits 16
   473 #define kshift 4
   474 #define kmask 15
   475 #define ALL_ON 0xffff
   476 #endif
   477 
   478 #define MULTIPLE_THREADS
   479 
   480 #ifndef EMULATOR
   481 extern pthread_mutex_t __gdtoa_locks[2];
   482 #else
   483 #define __gdtoa_locks (RETURN_WSD_VAR(__gdtoa_locks, g))
   484 #endif
   485 
   486 #define ACQUIRE_DTOA_LOCK(n)	do {				\
   487 	if (__isthreaded)					\
   488 		_pthread_mutex_lock(&__gdtoa_locks[n]);		\
   489 }while(0)
   490 #define FREE_DTOA_LOCK(n)	do {				\
   491 	if (__isthreaded)					\
   492 		_pthread_mutex_unlock(&__gdtoa_locks[n]);	\
   493 } while(0)
   494 
   495 #ifndef __SYMBIAN32__
   496 #define Kmax 15
   497 
   498  struct
   499 Bigint {
   500 	struct Bigint *next;
   501 	int k, maxwds, sign, wds;
   502 	ULong x[1];
   503 	};
   504 
   505  typedef struct Bigint Bigint;
   506 
   507 #endif
   508 
   509 #include "gdtoatypes.h"
   510 
   511 #ifdef NO_STRING_H
   512 #ifdef DECLARE_SIZE_T
   513 typedef unsigned int size_t;
   514 #endif
   515 extern void memcpy_D2A ANSI((void*, const void*, size_t));
   516 #define Bcopy(x,y) memcpy_D2A(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int))
   517 #else /* !NO_STRING_H */
   518 #define Bcopy(x,y) memcpy(&x->sign,&y->sign,y->wds*sizeof(ULong) + 2*sizeof(int))
   519 #endif /* NO_STRING_H */
   520 
   521 /*
   522  * Paranoia: Protect exported symbols, including ones in files we don't
   523  * compile right now.  The standard strtof and strtod survive.
   524  */
   525 #define	dtoa		__dtoa
   526 #define	gdtoa		__gdtoa
   527 #define	freedtoa	__freedtoa
   528 #define	strtodg		__strtodg
   529 #define	g_ddfmt		__g_ddfmt
   530 #define	g_dfmt		__g_dfmt
   531 #define	g_ffmt		__g_ffmt
   532 #define	g_Qfmt		__g_Qfmt
   533 #define	g_xfmt		__g_xfmt
   534 #define	g_xLfmt		__g_xLfmt
   535 #define	strtoId		__strtoId
   536 #define	strtoIdd	__strtoIdd
   537 #define	strtoIf		__strtoIf
   538 #define	strtoIQ		__strtoIQ
   539 #define	strtoIx		__strtoIx
   540 #define	strtoIxL	__strtoIxL
   541 #define	strtord		__strtord
   542 #define	strtordd	__strtordd
   543 #define	strtorf		__strtorf
   544 #define	strtorQ		__strtorQ
   545 #define	strtorx		__strtorx
   546 #define	strtorxL	__strtorxL
   547 #define	strtodI		__strtodI
   548 #define	strtopd		__strtopd
   549 #define	strtopdd	__strtopdd
   550 #define	strtopf		__strtopf
   551 #define	strtopQ		__strtopQ
   552 #define	strtopx		__strtopx
   553 #define	strtopxL	__strtopxL
   554 
   555 /* Protect gdtoa-internal symbols */
   556 #define	Balloc		__Balloc_D2A
   557 #define	Bfree		__Bfree_D2A
   558 #define	ULtoQ		__ULtoQ_D2A
   559 #define	ULtof		__ULtof_D2A
   560 #define	ULtod		__ULtod_D2A
   561 #define	ULtodd		__ULtodd_D2A
   562 #define	ULtox		__ULtox_D2A
   563 #define	ULtoxL		__ULtoxL_D2A
   564 #define	any_on		__any_on_D2A
   565 #define	b2d		__b2d_D2A
   566 #define	bigtens		__bigtens_D2A
   567 #define	cmp		__cmp_D2A
   568 #define	copybits	__copybits_D2A
   569 #define	d2b		__d2b_D2A
   570 #define	decrement	__decrement_D2A
   571 #define	diff		__diff_D2A
   572 #define	dtoa_result	__dtoa_result_D2A
   573 #define	g__fmt		__g__fmt_D2A
   574 #define	gethex		__gethex_D2A
   575 #define	hexdig		__hexdig_D2A
   576 #define	hexdig_init_D2A	__hexdig_init_D2A
   577 #define	hexnan		__hexnan_D2A
   578 #define	hi0bits		__hi0bits_D2A
   579 #define	i2b		__i2b_D2A
   580 #define	increment	__increment_D2A
   581 #define	lo0bits		__lo0bits_D2A
   582 #define	lshift		__lshift_D2A
   583 #define	match		__match_D2A
   584 #define	mult		__mult_D2A
   585 #define	multadd		__multadd_D2A
   586 #define	nrv_alloc	__nrv_alloc_D2A
   587 #define	pow5mult	__pow5mult_D2A
   588 #define	quorem		__quorem_D2A
   589 #define	ratio		__ratio_D2A
   590 #define	rshift		__rshift_D2A
   591 #define	rv_alloc	__rv_alloc_D2A
   592 #define	s2b		__s2b_D2A
   593 #define	set_ones	__set_ones_D2A
   594 #define	strcp		__strcp_D2A
   595 #define	strcp_D2A      	__strcp_D2A
   596 #define	strtoIg		__strtoIg_D2A
   597 #define	sum		__sum_D2A
   598 #define	tens		__tens_D2A
   599 #define	tinytens	__tinytens_D2A
   600 #define	tinytens	__tinytens_D2A
   601 #define	trailz		__trailz_D2A
   602 #define	ulp		__ulp_D2A
   603 
   604  extern char *dtoa_result;
   605  extern CONST double bigtens[], tens[], tinytens[];
   606  
   607 #ifdef __SYMBIAN32__
   608  extern unsigned const char hexdig[];
   609 #endif
   610 
   611  extern Bigint *Balloc ANSI((int));
   612  extern void Bfree ANSI((Bigint*));
   613  extern void ULtof ANSI((ULong*, ULong*, Long, int));
   614  extern void ULtod ANSI((ULong*, ULong*, Long, int));
   615  extern void ULtodd ANSI((ULong*, ULong*, Long, int));
   616  extern void ULtoQ ANSI((ULong*, ULong*, Long, int));
   617  extern void ULtox ANSI((UShort*, ULong*, Long, int));
   618  extern void ULtoxL ANSI((ULong*, ULong*, Long, int));
   619  extern ULong any_on ANSI((Bigint*, int));
   620  extern double b2d ANSI((Bigint*, int*));
   621  extern int cmp ANSI((Bigint*, Bigint*));
   622  extern void copybits ANSI((ULong*, int, Bigint*));
   623  extern Bigint *d2b ANSI((double, int*, int*));
   624  extern int decrement ANSI((Bigint*));
   625  extern Bigint *diff ANSI((Bigint*, Bigint*));
   626  extern char *dtoa ANSI((double d, int mode, int ndigits,
   627 			int *decpt, int *sign, char **rve));
   628  extern void freedtoa ANSI((char*));
   629  extern char *gdtoa ANSI((FPI *fpi, int be, ULong *bits, int *kindp,
   630 			  int mode, int ndigits, int *decpt, char **rve));
   631  extern char *g__fmt ANSI((char*, char*, char*, int, ULong));
   632  extern int gethex ANSI((CONST char**, FPI*, Long*, Bigint**, int));
   633  extern void hexdig_init_D2A(Void);
   634  extern int hexnan ANSI((CONST char**, FPI*, ULong*));
   635  extern int hi0bits ANSI((ULong));
   636  extern Bigint *i2b ANSI((int));
   637  extern Bigint *increment ANSI((Bigint*));
   638  extern int lo0bits ANSI((ULong*));
   639  extern Bigint *lshift ANSI((Bigint*, int));
   640  extern int match ANSI((CONST char**, char*));
   641  extern Bigint *mult ANSI((Bigint*, Bigint*));
   642  extern Bigint *multadd ANSI((Bigint*, int, int));
   643  extern char *nrv_alloc ANSI((char*, char **, int));
   644  extern Bigint *pow5mult ANSI((Bigint*, int));
   645  extern int quorem ANSI((Bigint*, Bigint*));
   646  extern double ratio ANSI((Bigint*, Bigint*));
   647  extern void rshift ANSI((Bigint*, int));
   648  extern char *rv_alloc ANSI((int));
   649  extern Bigint *s2b ANSI((CONST char*, int, int, ULong));
   650  extern Bigint *set_ones ANSI((Bigint*, int));
   651  extern char *strcp ANSI((char*, const char*));
   652  extern int strtodg ANSI((CONST char*, char**, FPI*, Long*, ULong*));
   653 
   654  extern int strtoId ANSI((CONST char *, char **, double *, double *));
   655  extern int strtoIdd ANSI((CONST char *, char **, double *, double *));
   656  extern int strtoIf ANSI((CONST char *, char **, float *, float *));
   657  extern int strtoIg ANSI((CONST char*, char**, FPI*, Long*, Bigint**, int*));
   658  extern int strtoIQ ANSI((CONST char *, char **, void *, void *));
   659  extern int strtoIx ANSI((CONST char *, char **, void *, void *));
   660  extern int strtoIxL ANSI((CONST char *, char **, void *, void *));
   661  extern double strtod ANSI((const char *s00, char **se));
   662  extern int strtopQ ANSI((CONST char *, char **, Void *));
   663  extern int strtopf ANSI((CONST char *, char **, float *));
   664  extern int strtopd ANSI((CONST char *, char **, double *));
   665  extern int strtopdd ANSI((CONST char *, char **, double *));
   666  extern int strtopx ANSI((CONST char *, char **, Void *));
   667  extern int strtopxL ANSI((CONST char *, char **, Void *));
   668  extern int strtord ANSI((CONST char *, char **, int, double *));
   669  extern int strtordd ANSI((CONST char *, char **, int, double *));
   670  extern int strtorf ANSI((CONST char *, char **, int, float *));
   671  extern int strtorQ ANSI((CONST char *, char **, int, void *));
   672  extern int strtorx ANSI((CONST char *, char **, int, void *));
   673  extern int strtorxL ANSI((CONST char *, char **, int, void *));
   674  extern Bigint *sum ANSI((Bigint*, Bigint*));
   675  extern int trailz ANSI((Bigint*));
   676  extern double ulp ANSI((double));
   677 
   678 #ifdef __cplusplus
   679 }
   680 #endif
   681 
   682 
   683 #ifdef IEEE_Arith
   684 #ifdef IEEE_MC68k
   685 #define _0 0
   686 #define _1 1
   687 #else
   688 #define _0 1
   689 #define _1 0
   690 #endif
   691 #else
   692 #undef INFNAN_CHECK
   693 #endif
   694 
   695 #ifdef INFNAN_CHECK
   696 
   697 #ifndef NAN_WORD0
   698 #define NAN_WORD0 0x7ff80000
   699 #endif
   700 
   701 #ifndef NAN_WORD1
   702 #define NAN_WORD1 0
   703 #endif
   704 #endif	/* INFNAN_CHECK */
   705 
   706 #undef SI
   707 #ifdef Sudden_Underflow
   708 #define SI 1
   709 #else
   710 #define SI 0
   711 #endif
   712 
   713 #endif /* GDTOAIMP_H_INCLUDED */