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