Coverage Report

Created: 2026-05-16 07:03

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/mupdf/thirdparty/mujs/jsdtoa.c
Line
Count
Source
1
/* Locale-independent implementations of string <-> double conversions. */
2
3
#include "jsi.h"
4
5
#if defined(_MSC_VER) && (_MSC_VER < 1700) /* VS2012 has stdint.h */
6
typedef unsigned int uint32_t;
7
typedef unsigned __int64 uint64_t;
8
#else
9
#include <stdint.h>
10
#endif
11
12
#include <errno.h>
13
#include <assert.h>
14
15
#ifndef TRUE
16
0
#define TRUE 1
17
0
#define FALSE 0
18
#endif
19
20
/*
21
 * format exponent like sprintf(p, "e%+d", e)
22
 */
23
void
24
js_fmtexp(char *p, int e)
25
0
{
26
0
  char se[9];
27
0
  int i;
28
29
0
  *p++ = 'e';
30
0
  if(e < 0) {
31
0
    *p++ = '-';
32
0
    e = -e;
33
0
  } else
34
0
    *p++ = '+';
35
0
  i = 0;
36
0
  while(e) {
37
0
    se[i++] = e % 10 + '0';
38
0
    e /= 10;
39
0
  }
40
0
  while(i < 1)
41
0
    se[i++] = '0';
42
0
  while(i > 0)
43
0
    *p++ = se[--i];
44
0
  *p++ = '\0';
45
0
}
46
47
/*
48
 * grisu2_59_56.c
49
 *
50
 * Grisu prints the optimal decimal representation of floating-point numbers.
51
 *
52
 * Copyright (c) 2009 Florian Loitsch
53
 *
54
 * Permission is hereby granted, free of charge, to any person obtaining a copy
55
 * of this software and associated documentation files (the "Software"), to
56
 * deal in the Software without restriction, including without limitation the
57
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
58
 * sell copies of the Software, and to permit persons to whom the Software is
59
 * furnished to do so, subject to the following conditions:
60
 *
61
 * The above copyright notice and this permission notice shall be included in
62
 * all copies or substantial portions of the Software.
63
 *
64
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
65
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
66
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
67
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
68
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
69
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
70
 * IN THE SOFTWARE.
71
 */
72
73
typedef struct diy_fp_t {
74
  uint64_t f;
75
  int e;
76
} diy_fp_t;
77
78
0
#define DIY_SIGNIFICAND_SIZE 64
79
0
#define D_1_LOG2_10 0.30102999566398114 /* 1 / lg(10) */
80
81
static const uint64_t powers_ten[] = {
82
  0xbf29dcaba82fdeae, 0xeef453d6923bd65a, 0x9558b4661b6565f8,
83
  0xbaaee17fa23ebf76, 0xe95a99df8ace6f54, 0x91d8a02bb6c10594,
84
  0xb64ec836a47146fa, 0xe3e27a444d8d98b8, 0x8e6d8c6ab0787f73,
85
  0xb208ef855c969f50, 0xde8b2b66b3bc4724, 0x8b16fb203055ac76,
86
  0xaddcb9e83c6b1794, 0xd953e8624b85dd79, 0x87d4713d6f33aa6c,
87
  0xa9c98d8ccb009506, 0xd43bf0effdc0ba48, 0x84a57695fe98746d,
88
  0xa5ced43b7e3e9188, 0xcf42894a5dce35ea, 0x818995ce7aa0e1b2,
89
  0xa1ebfb4219491a1f, 0xca66fa129f9b60a7, 0xfd00b897478238d1,
90
  0x9e20735e8cb16382, 0xc5a890362fddbc63, 0xf712b443bbd52b7c,
91
  0x9a6bb0aa55653b2d, 0xc1069cd4eabe89f9, 0xf148440a256e2c77,
92
  0x96cd2a865764dbca, 0xbc807527ed3e12bd, 0xeba09271e88d976c,
93
  0x93445b8731587ea3, 0xb8157268fdae9e4c, 0xe61acf033d1a45df,
94
  0x8fd0c16206306bac, 0xb3c4f1ba87bc8697, 0xe0b62e2929aba83c,
95
  0x8c71dcd9ba0b4926, 0xaf8e5410288e1b6f, 0xdb71e91432b1a24b,
96
  0x892731ac9faf056f, 0xab70fe17c79ac6ca, 0xd64d3d9db981787d,
97
  0x85f0468293f0eb4e, 0xa76c582338ed2622, 0xd1476e2c07286faa,
98
  0x82cca4db847945ca, 0xa37fce126597973d, 0xcc5fc196fefd7d0c,
99
  0xff77b1fcbebcdc4f, 0x9faacf3df73609b1, 0xc795830d75038c1e,
100
  0xf97ae3d0d2446f25, 0x9becce62836ac577, 0xc2e801fb244576d5,
101
  0xf3a20279ed56d48a, 0x9845418c345644d7, 0xbe5691ef416bd60c,
102
  0xedec366b11c6cb8f, 0x94b3a202eb1c3f39, 0xb9e08a83a5e34f08,
103
  0xe858ad248f5c22ca, 0x91376c36d99995be, 0xb58547448ffffb2e,
104
  0xe2e69915b3fff9f9, 0x8dd01fad907ffc3c, 0xb1442798f49ffb4b,
105
  0xdd95317f31c7fa1d, 0x8a7d3eef7f1cfc52, 0xad1c8eab5ee43b67,
106
  0xd863b256369d4a41, 0x873e4f75e2224e68, 0xa90de3535aaae202,
107
  0xd3515c2831559a83, 0x8412d9991ed58092, 0xa5178fff668ae0b6,
108
  0xce5d73ff402d98e4, 0x80fa687f881c7f8e, 0xa139029f6a239f72,
109
  0xc987434744ac874f, 0xfbe9141915d7a922, 0x9d71ac8fada6c9b5,
110
  0xc4ce17b399107c23, 0xf6019da07f549b2b, 0x99c102844f94e0fb,
111
  0xc0314325637a193a, 0xf03d93eebc589f88, 0x96267c7535b763b5,
112
  0xbbb01b9283253ca3, 0xea9c227723ee8bcb, 0x92a1958a7675175f,
113
  0xb749faed14125d37, 0xe51c79a85916f485, 0x8f31cc0937ae58d3,
114
  0xb2fe3f0b8599ef08, 0xdfbdcece67006ac9, 0x8bd6a141006042be,
115
  0xaecc49914078536d, 0xda7f5bf590966849, 0x888f99797a5e012d,
116
  0xaab37fd7d8f58179, 0xd5605fcdcf32e1d7, 0x855c3be0a17fcd26,
117
  0xa6b34ad8c9dfc070, 0xd0601d8efc57b08c, 0x823c12795db6ce57,
118
  0xa2cb1717b52481ed, 0xcb7ddcdda26da269, 0xfe5d54150b090b03,
119
  0x9efa548d26e5a6e2, 0xc6b8e9b0709f109a, 0xf867241c8cc6d4c1,
120
  0x9b407691d7fc44f8, 0xc21094364dfb5637, 0xf294b943e17a2bc4,
121
  0x979cf3ca6cec5b5b, 0xbd8430bd08277231, 0xece53cec4a314ebe,
122
  0x940f4613ae5ed137, 0xb913179899f68584, 0xe757dd7ec07426e5,
123
  0x9096ea6f3848984f, 0xb4bca50b065abe63, 0xe1ebce4dc7f16dfc,
124
  0x8d3360f09cf6e4bd, 0xb080392cc4349ded, 0xdca04777f541c568,
125
  0x89e42caaf9491b61, 0xac5d37d5b79b6239, 0xd77485cb25823ac7,
126
  0x86a8d39ef77164bd, 0xa8530886b54dbdec, 0xd267caa862a12d67,
127
  0x8380dea93da4bc60, 0xa46116538d0deb78, 0xcd795be870516656,
128
  0x806bd9714632dff6, 0xa086cfcd97bf97f4, 0xc8a883c0fdaf7df0,
129
  0xfad2a4b13d1b5d6c, 0x9cc3a6eec6311a64, 0xc3f490aa77bd60fd,
130
  0xf4f1b4d515acb93c, 0x991711052d8bf3c5, 0xbf5cd54678eef0b7,
131
  0xef340a98172aace5, 0x9580869f0e7aac0f, 0xbae0a846d2195713,
132
  0xe998d258869facd7, 0x91ff83775423cc06, 0xb67f6455292cbf08,
133
  0xe41f3d6a7377eeca, 0x8e938662882af53e, 0xb23867fb2a35b28e,
134
  0xdec681f9f4c31f31, 0x8b3c113c38f9f37f, 0xae0b158b4738705f,
135
  0xd98ddaee19068c76, 0x87f8a8d4cfa417ca, 0xa9f6d30a038d1dbc,
136
  0xd47487cc8470652b, 0x84c8d4dfd2c63f3b, 0xa5fb0a17c777cf0a,
137
  0xcf79cc9db955c2cc, 0x81ac1fe293d599c0, 0xa21727db38cb0030,
138
  0xca9cf1d206fdc03c, 0xfd442e4688bd304b, 0x9e4a9cec15763e2f,
139
  0xc5dd44271ad3cdba, 0xf7549530e188c129, 0x9a94dd3e8cf578ba,
140
  0xc13a148e3032d6e8, 0xf18899b1bc3f8ca2, 0x96f5600f15a7b7e5,
141
  0xbcb2b812db11a5de, 0xebdf661791d60f56, 0x936b9fcebb25c996,
142
  0xb84687c269ef3bfb, 0xe65829b3046b0afa, 0x8ff71a0fe2c2e6dc,
143
  0xb3f4e093db73a093, 0xe0f218b8d25088b8, 0x8c974f7383725573,
144
  0xafbd2350644eead0, 0xdbac6c247d62a584, 0x894bc396ce5da772,
145
  0xab9eb47c81f5114f, 0xd686619ba27255a3, 0x8613fd0145877586,
146
  0xa798fc4196e952e7, 0xd17f3b51fca3a7a1, 0x82ef85133de648c5,
147
  0xa3ab66580d5fdaf6, 0xcc963fee10b7d1b3, 0xffbbcfe994e5c620,
148
  0x9fd561f1fd0f9bd4, 0xc7caba6e7c5382c9, 0xf9bd690a1b68637b,
149
  0x9c1661a651213e2d, 0xc31bfa0fe5698db8, 0xf3e2f893dec3f126,
150
  0x986ddb5c6b3a76b8, 0xbe89523386091466, 0xee2ba6c0678b597f,
151
  0x94db483840b717f0, 0xba121a4650e4ddec, 0xe896a0d7e51e1566,
152
  0x915e2486ef32cd60, 0xb5b5ada8aaff80b8, 0xe3231912d5bf60e6,
153
  0x8df5efabc5979c90, 0xb1736b96b6fd83b4, 0xddd0467c64bce4a1,
154
  0x8aa22c0dbef60ee4, 0xad4ab7112eb3929e, 0xd89d64d57a607745,
155
  0x87625f056c7c4a8b, 0xa93af6c6c79b5d2e, 0xd389b47879823479,
156
  0x843610cb4bf160cc, 0xa54394fe1eedb8ff, 0xce947a3da6a9273e,
157
  0x811ccc668829b887, 0xa163ff802a3426a9, 0xc9bcff6034c13053,
158
  0xfc2c3f3841f17c68, 0x9d9ba7832936edc1, 0xc5029163f384a931,
159
  0xf64335bcf065d37d, 0x99ea0196163fa42e, 0xc06481fb9bcf8d3a,
160
  0xf07da27a82c37088, 0x964e858c91ba2655, 0xbbe226efb628afeb,
161
  0xeadab0aba3b2dbe5, 0x92c8ae6b464fc96f, 0xb77ada0617e3bbcb,
162
  0xe55990879ddcaabe, 0x8f57fa54c2a9eab7, 0xb32df8e9f3546564,
163
  0xdff9772470297ebd, 0x8bfbea76c619ef36, 0xaefae51477a06b04,
164
  0xdab99e59958885c5, 0x88b402f7fd75539b, 0xaae103b5fcd2a882,
165
  0xd59944a37c0752a2, 0x857fcae62d8493a5, 0xa6dfbd9fb8e5b88f,
166
  0xd097ad07a71f26b2, 0x825ecc24c8737830, 0xa2f67f2dfa90563b,
167
  0xcbb41ef979346bca, 0xfea126b7d78186bd, 0x9f24b832e6b0f436,
168
  0xc6ede63fa05d3144, 0xf8a95fcf88747d94, 0x9b69dbe1b548ce7d,
169
  0xc24452da229b021c, 0xf2d56790ab41c2a3, 0x97c560ba6b0919a6,
170
  0xbdb6b8e905cb600f, 0xed246723473e3813, 0x9436c0760c86e30c,
171
  0xb94470938fa89bcf, 0xe7958cb87392c2c3, 0x90bd77f3483bb9ba,
172
  0xb4ecd5f01a4aa828, 0xe2280b6c20dd5232, 0x8d590723948a535f,
173
  0xb0af48ec79ace837, 0xdcdb1b2798182245, 0x8a08f0f8bf0f156b,
174
  0xac8b2d36eed2dac6, 0xd7adf884aa879177, 0x86ccbb52ea94baeb,
175
  0xa87fea27a539e9a5, 0xd29fe4b18e88640f, 0x83a3eeeef9153e89,
176
  0xa48ceaaab75a8e2b, 0xcdb02555653131b6, 0x808e17555f3ebf12,
177
  0xa0b19d2ab70e6ed6, 0xc8de047564d20a8c, 0xfb158592be068d2f,
178
  0x9ced737bb6c4183d, 0xc428d05aa4751e4d, 0xf53304714d9265e0,
179
  0x993fe2c6d07b7fac, 0xbf8fdb78849a5f97, 0xef73d256a5c0f77d,
180
  0x95a8637627989aae, 0xbb127c53b17ec159, 0xe9d71b689dde71b0,
181
  0x9226712162ab070e, 0xb6b00d69bb55c8d1, 0xe45c10c42a2b3b06,
182
  0x8eb98a7a9a5b04e3, 0xb267ed1940f1c61c, 0xdf01e85f912e37a3,
183
  0x8b61313bbabce2c6, 0xae397d8aa96c1b78, 0xd9c7dced53c72256,
184
  0x881cea14545c7575, 0xaa242499697392d3, 0xd4ad2dbfc3d07788,
185
  0x84ec3c97da624ab5, 0xa6274bbdd0fadd62, 0xcfb11ead453994ba,
186
  0x81ceb32c4b43fcf5, 0xa2425ff75e14fc32, 0xcad2f7f5359a3b3e,
187
  0xfd87b5f28300ca0e, 0x9e74d1b791e07e48, 0xc612062576589ddb,
188
  0xf79687aed3eec551, 0x9abe14cd44753b53, 0xc16d9a0095928a27,
189
  0xf1c90080baf72cb1, 0x971da05074da7bef, 0xbce5086492111aeb,
190
  0xec1e4a7db69561a5, 0x9392ee8e921d5d07, 0xb877aa3236a4b449,
191
  0xe69594bec44de15b, 0x901d7cf73ab0acd9, 0xb424dc35095cd80f,
192
  0xe12e13424bb40e13, 0x8cbccc096f5088cc, 0xafebff0bcb24aaff,
193
  0xdbe6fecebdedd5bf, 0x89705f4136b4a597, 0xabcc77118461cefd,
194
  0xd6bf94d5e57a42bc, 0x8637bd05af6c69b6, 0xa7c5ac471b478423,
195
  0xd1b71758e219652c, 0x83126e978d4fdf3b, 0xa3d70a3d70a3d70a,
196
  0xcccccccccccccccd, 0x8000000000000000, 0xa000000000000000,
197
  0xc800000000000000, 0xfa00000000000000, 0x9c40000000000000,
198
  0xc350000000000000, 0xf424000000000000, 0x9896800000000000,
199
  0xbebc200000000000, 0xee6b280000000000, 0x9502f90000000000,
200
  0xba43b74000000000, 0xe8d4a51000000000, 0x9184e72a00000000,
201
  0xb5e620f480000000, 0xe35fa931a0000000, 0x8e1bc9bf04000000,
202
  0xb1a2bc2ec5000000, 0xde0b6b3a76400000, 0x8ac7230489e80000,
203
  0xad78ebc5ac620000, 0xd8d726b7177a8000, 0x878678326eac9000,
204
  0xa968163f0a57b400, 0xd3c21bcecceda100, 0x84595161401484a0,
205
  0xa56fa5b99019a5c8, 0xcecb8f27f4200f3a, 0x813f3978f8940984,
206
  0xa18f07d736b90be5, 0xc9f2c9cd04674edf, 0xfc6f7c4045812296,
207
  0x9dc5ada82b70b59e, 0xc5371912364ce305, 0xf684df56c3e01bc7,
208
  0x9a130b963a6c115c, 0xc097ce7bc90715b3, 0xf0bdc21abb48db20,
209
  0x96769950b50d88f4, 0xbc143fa4e250eb31, 0xeb194f8e1ae525fd,
210
  0x92efd1b8d0cf37be, 0xb7abc627050305ae, 0xe596b7b0c643c719,
211
  0x8f7e32ce7bea5c70, 0xb35dbf821ae4f38c, 0xe0352f62a19e306f,
212
  0x8c213d9da502de45, 0xaf298d050e4395d7, 0xdaf3f04651d47b4c,
213
  0x88d8762bf324cd10, 0xab0e93b6efee0054, 0xd5d238a4abe98068,
214
  0x85a36366eb71f041, 0xa70c3c40a64e6c52, 0xd0cf4b50cfe20766,
215
  0x82818f1281ed44a0, 0xa321f2d7226895c8, 0xcbea6f8ceb02bb3a,
216
  0xfee50b7025c36a08, 0x9f4f2726179a2245, 0xc722f0ef9d80aad6,
217
  0xf8ebad2b84e0d58c, 0x9b934c3b330c8577, 0xc2781f49ffcfa6d5,
218
  0xf316271c7fc3908b, 0x97edd871cfda3a57, 0xbde94e8e43d0c8ec,
219
  0xed63a231d4c4fb27, 0x945e455f24fb1cf9, 0xb975d6b6ee39e437,
220
  0xe7d34c64a9c85d44, 0x90e40fbeea1d3a4b, 0xb51d13aea4a488dd,
221
  0xe264589a4dcdab15, 0x8d7eb76070a08aed, 0xb0de65388cc8ada8,
222
  0xdd15fe86affad912, 0x8a2dbf142dfcc7ab, 0xacb92ed9397bf996,
223
  0xd7e77a8f87daf7fc, 0x86f0ac99b4e8dafd, 0xa8acd7c0222311bd,
224
  0xd2d80db02aabd62c, 0x83c7088e1aab65db, 0xa4b8cab1a1563f52,
225
  0xcde6fd5e09abcf27, 0x80b05e5ac60b6178, 0xa0dc75f1778e39d6,
226
  0xc913936dd571c84c, 0xfb5878494ace3a5f, 0x9d174b2dcec0e47b,
227
  0xc45d1df942711d9a, 0xf5746577930d6501, 0x9968bf6abbe85f20,
228
  0xbfc2ef456ae276e9, 0xefb3ab16c59b14a3, 0x95d04aee3b80ece6,
229
  0xbb445da9ca61281f, 0xea1575143cf97227, 0x924d692ca61be758,
230
  0xb6e0c377cfa2e12e, 0xe498f455c38b997a, 0x8edf98b59a373fec,
231
  0xb2977ee300c50fe7, 0xdf3d5e9bc0f653e1, 0x8b865b215899f46d,
232
  0xae67f1e9aec07188, 0xda01ee641a708dea, 0x884134fe908658b2,
233
  0xaa51823e34a7eedf, 0xd4e5e2cdc1d1ea96, 0x850fadc09923329e,
234
  0xa6539930bf6bff46, 0xcfe87f7cef46ff17, 0x81f14fae158c5f6e,
235
  0xa26da3999aef774a, 0xcb090c8001ab551c, 0xfdcb4fa002162a63,
236
  0x9e9f11c4014dda7e, 0xc646d63501a1511e, 0xf7d88bc24209a565,
237
  0x9ae757596946075f, 0xc1a12d2fc3978937, 0xf209787bb47d6b85,
238
  0x9745eb4d50ce6333, 0xbd176620a501fc00, 0xec5d3fa8ce427b00,
239
  0x93ba47c980e98ce0, 0xb8a8d9bbe123f018, 0xe6d3102ad96cec1e,
240
  0x9043ea1ac7e41393, 0xb454e4a179dd1877, 0xe16a1dc9d8545e95,
241
  0x8ce2529e2734bb1d, 0xb01ae745b101e9e4, 0xdc21a1171d42645d,
242
  0x899504ae72497eba, 0xabfa45da0edbde69, 0xd6f8d7509292d603,
243
  0x865b86925b9bc5c2, 0xa7f26836f282b733, 0xd1ef0244af2364ff,
244
  0x8335616aed761f1f, 0xa402b9c5a8d3a6e7, 0xcd036837130890a1,
245
  0x802221226be55a65, 0xa02aa96b06deb0fe, 0xc83553c5c8965d3d,
246
  0xfa42a8b73abbf48d, 0x9c69a97284b578d8, 0xc38413cf25e2d70e,
247
  0xf46518c2ef5b8cd1, 0x98bf2f79d5993803, 0xbeeefb584aff8604,
248
  0xeeaaba2e5dbf6785, 0x952ab45cfa97a0b3, 0xba756174393d88e0,
249
  0xe912b9d1478ceb17, 0x91abb422ccb812ef, 0xb616a12b7fe617aa,
250
  0xe39c49765fdf9d95, 0x8e41ade9fbebc27d, 0xb1d219647ae6b31c,
251
  0xde469fbd99a05fe3, 0x8aec23d680043bee, 0xada72ccc20054aea,
252
  0xd910f7ff28069da4, 0x87aa9aff79042287, 0xa99541bf57452b28,
253
  0xd3fa922f2d1675f2, 0x847c9b5d7c2e09b7, 0xa59bc234db398c25,
254
  0xcf02b2c21207ef2f, 0x8161afb94b44f57d, 0xa1ba1ba79e1632dc,
255
  0xca28a291859bbf93, 0xfcb2cb35e702af78, 0x9defbf01b061adab,
256
  0xc56baec21c7a1916, 0xf6c69a72a3989f5c, 0x9a3c2087a63f6399,
257
  0xc0cb28a98fcf3c80, 0xf0fdf2d3f3c30b9f, 0x969eb7c47859e744,
258
  0xbc4665b596706115, 0xeb57ff22fc0c795a, 0x9316ff75dd87cbd8,
259
  0xb7dcbf5354e9bece, 0xe5d3ef282a242e82, 0x8fa475791a569d11,
260
  0xb38d92d760ec4455, 0xe070f78d3927556b, 0x8c469ab843b89563,
261
  0xaf58416654a6babb, 0xdb2e51bfe9d0696a, 0x88fcf317f22241e2,
262
  0xab3c2fddeeaad25b, 0xd60b3bd56a5586f2, 0x85c7056562757457,
263
  0xa738c6bebb12d16d, 0xd106f86e69d785c8, 0x82a45b450226b39d,
264
  0xa34d721642b06084, 0xcc20ce9bd35c78a5, 0xff290242c83396ce,
265
  0x9f79a169bd203e41, 0xc75809c42c684dd1, 0xf92e0c3537826146,
266
  0x9bbcc7a142b17ccc, 0xc2abf989935ddbfe, 0xf356f7ebf83552fe,
267
  0x98165af37b2153df, 0xbe1bf1b059e9a8d6, 0xeda2ee1c7064130c,
268
  0x9485d4d1c63e8be8, 0xb9a74a0637ce2ee1, 0xe8111c87c5c1ba9a,
269
  0x910ab1d4db9914a0, 0xb54d5e4a127f59c8, 0xe2a0b5dc971f303a,
270
  0x8da471a9de737e24, 0xb10d8e1456105dad, 0xdd50f1996b947519,
271
  0x8a5296ffe33cc930, 0xace73cbfdc0bfb7b, 0xd8210befd30efa5a,
272
  0x8714a775e3e95c78, 0xa8d9d1535ce3b396, 0xd31045a8341ca07c,
273
  0x83ea2b892091e44e, 0xa4e4b66b68b65d61, 0xce1de40642e3f4b9,
274
  0x80d2ae83e9ce78f4, 0xa1075a24e4421731, 0xc94930ae1d529cfd,
275
  0xfb9b7cd9a4a7443c, 0x9d412e0806e88aa6, 0xc491798a08a2ad4f,
276
  0xf5b5d7ec8acb58a3, 0x9991a6f3d6bf1766, 0xbff610b0cc6edd3f,
277
  0xeff394dcff8a948f, 0x95f83d0a1fb69cd9, 0xbb764c4ca7a44410,
278
  0xea53df5fd18d5514, 0x92746b9be2f8552c, 0xb7118682dbb66a77,
279
  0xe4d5e82392a40515, 0x8f05b1163ba6832d, 0xb2c71d5bca9023f8,
280
  0xdf78e4b2bd342cf7, 0x8bab8eefb6409c1a, 0xae9672aba3d0c321,
281
  0xda3c0f568cc4f3e9, 0x8865899617fb1871, 0xaa7eebfb9df9de8e,
282
  0xd51ea6fa85785631, 0x8533285c936b35df, 0xa67ff273b8460357,
283
  0xd01fef10a657842c, 0x8213f56a67f6b29c, 0xa298f2c501f45f43,
284
  0xcb3f2f7642717713, 0xfe0efb53d30dd4d8, 0x9ec95d1463e8a507,
285
  0xc67bb4597ce2ce49, 0xf81aa16fdc1b81db, 0x9b10a4e5e9913129,
286
  0xc1d4ce1f63f57d73, 0xf24a01a73cf2dcd0, 0x976e41088617ca02,
287
  0xbd49d14aa79dbc82, 0xec9c459d51852ba3, 0x93e1ab8252f33b46,
288
  0xb8da1662e7b00a17, 0xe7109bfba19c0c9d, 0x906a617d450187e2,
289
  0xb484f9dc9641e9db, 0xe1a63853bbd26451, 0x8d07e33455637eb3,
290
  0xb049dc016abc5e60, 0xdc5c5301c56b75f7, 0x89b9b3e11b6329bb,
291
  0xac2820d9623bf429, 0xd732290fbacaf134, 0x867f59a9d4bed6c0,
292
  0xa81f301449ee8c70, 0xd226fc195c6a2f8c, 0x83585d8fd9c25db8,
293
  0xa42e74f3d032f526, 0xcd3a1230c43fb26f, 0x80444b5e7aa7cf85,
294
  0xa0555e361951c367, 0xc86ab5c39fa63441, 0xfa856334878fc151,
295
  0x9c935e00d4b9d8d2, 0xc3b8358109e84f07, 0xf4a642e14c6262c9,
296
  0x98e7e9cccfbd7dbe, 0xbf21e44003acdd2d, 0xeeea5d5004981478,
297
  0x95527a5202df0ccb, 0xbaa718e68396cffe, 0xe950df20247c83fd,
298
  0x91d28b7416cdd27e, 0xb6472e511c81471e, 0xe3d8f9e563a198e5,
299
  0x8e679c2f5e44ff8f, 0xb201833b35d63f73, 0xde81e40a034bcf50,
300
  0x8b112e86420f6192, 0xadd57a27d29339f6, 0xd94ad8b1c7380874,
301
  0x87cec76f1c830549, 0xa9c2794ae3a3c69b, 0xd433179d9c8cb841,
302
  0x849feec281d7f329, 0xa5c7ea73224deff3, 0xcf39e50feae16bf0,
303
  0x81842f29f2cce376, 0xa1e53af46f801c53, 0xca5e89b18b602368,
304
  0xfcf62c1dee382c42, 0x9e19db92b4e31ba9, 0xc5a05277621be294,
305
  0xf70867153aa2db39, 0x9a65406d44a5c903, 0xc0fe908895cf3b44,
306
  0xf13e34aabb430a15, 0x96c6e0eab509e64d, 0xbc789925624c5fe1,
307
  0xeb96bf6ebadf77d9, 0x933e37a534cbaae8, 0xb80dc58e81fe95a1,
308
  0xe61136f2227e3b0a, 0x8fcac257558ee4e6, 0xb3bd72ed2af29e20,
309
  0xe0accfa875af45a8, 0x8c6c01c9498d8b89, 0xaf87023b9bf0ee6b,
310
  0xdb68c2ca82ed2a06, 0x892179be91d43a44, 0xab69d82e364948d4
311
};
312
313
static const int powers_ten_e[] = {
314
  -1203, -1200, -1196, -1193, -1190, -1186, -1183, -1180, -1176, -1173,
315
  -1170, -1166, -1163, -1160, -1156, -1153, -1150, -1146, -1143, -1140,
316
  -1136, -1133, -1130, -1127, -1123, -1120, -1117, -1113, -1110, -1107,
317
  -1103, -1100, -1097, -1093, -1090, -1087, -1083, -1080, -1077, -1073,
318
  -1070, -1067, -1063, -1060, -1057, -1053, -1050, -1047, -1043, -1040,
319
  -1037, -1034, -1030, -1027, -1024, -1020, -1017, -1014, -1010, -1007,
320
  -1004, -1000, -997, -994, -990, -987, -984, -980, -977, -974, -970,
321
  -967, -964, -960, -957, -954, -950, -947, -944, -940, -937, -934, -931,
322
  -927, -924, -921, -917, -914, -911, -907, -904, -901, -897, -894, -891,
323
  -887, -884, -881, -877, -874, -871, -867, -864, -861, -857, -854, -851,
324
  -847, -844, -841, -838, -834, -831, -828, -824, -821, -818, -814, -811,
325
  -808, -804, -801, -798, -794, -791, -788, -784, -781, -778, -774, -771,
326
  -768, -764, -761, -758, -754, -751, -748, -744, -741, -738, -735, -731,
327
  -728, -725, -721, -718, -715, -711, -708, -705, -701, -698, -695, -691,
328
  -688, -685, -681, -678, -675, -671, -668, -665, -661, -658, -655, -651,
329
  -648, -645, -642, -638, -635, -632, -628, -625, -622, -618, -615, -612,
330
  -608, -605, -602, -598, -595, -592, -588, -585, -582, -578, -575, -572,
331
  -568, -565, -562, -558, -555, -552, -549, -545, -542, -539, -535, -532,
332
  -529, -525, -522, -519, -515, -512, -509, -505, -502, -499, -495, -492,
333
  -489, -485, -482, -479, -475, -472, -469, -465, -462, -459, -455, -452,
334
  -449, -446, -442, -439, -436, -432, -429, -426, -422, -419, -416, -412,
335
  -409, -406, -402, -399, -396, -392, -389, -386, -382, -379, -376, -372,
336
  -369, -366, -362, -359, -356, -353, -349, -346, -343, -339, -336, -333,
337
  -329, -326, -323, -319, -316, -313, -309, -306, -303, -299, -296, -293,
338
  -289, -286, -283, -279, -276, -273, -269, -266, -263, -259, -256, -253,
339
  -250, -246, -243, -240, -236, -233, -230, -226, -223, -220, -216, -213,
340
  -210, -206, -203, -200, -196, -193, -190, -186, -183, -180, -176, -173,
341
  -170, -166, -163, -160, -157, -153, -150, -147, -143, -140, -137, -133,
342
  -130, -127, -123, -120, -117, -113, -110, -107, -103, -100, -97, -93,
343
  -90, -87, -83, -80, -77, -73, -70, -67, -63, -60, -57, -54, -50, -47,
344
  -44, -40, -37, -34, -30, -27, -24, -20, -17, -14, -10, -7, -4, 0, 3, 6,
345
  10, 13, 16, 20, 23, 26, 30, 33, 36, 39, 43, 46, 49, 53, 56, 59, 63, 66,
346
  69, 73, 76, 79, 83, 86, 89, 93, 96, 99, 103, 106, 109, 113, 116, 119,
347
  123, 126, 129, 132, 136, 139, 142, 146, 149, 152, 156, 159, 162, 166,
348
  169, 172, 176, 179, 182, 186, 189, 192, 196, 199, 202, 206, 209, 212,
349
  216, 219, 222, 226, 229, 232, 235, 239, 242, 245, 249, 252, 255, 259,
350
  262, 265, 269, 272, 275, 279, 282, 285, 289, 292, 295, 299, 302, 305,
351
  309, 312, 315, 319, 322, 325, 328, 332, 335, 338, 342, 345, 348, 352,
352
  355, 358, 362, 365, 368, 372, 375, 378, 382, 385, 388, 392, 395, 398,
353
  402, 405, 408, 412, 415, 418, 422, 425, 428, 431, 435, 438, 441, 445,
354
  448, 451, 455, 458, 461, 465, 468, 471, 475, 478, 481, 485, 488, 491,
355
  495, 498, 501, 505, 508, 511, 515, 518, 521, 524, 528, 531, 534, 538,
356
  541, 544, 548, 551, 554, 558, 561, 564, 568, 571, 574, 578, 581, 584,
357
  588, 591, 594, 598, 601, 604, 608, 611, 614, 617, 621, 624, 627, 631,
358
  634, 637, 641, 644, 647, 651, 654, 657, 661, 664, 667, 671, 674, 677,
359
  681, 684, 687, 691, 694, 697, 701, 704, 707, 711, 714, 717, 720, 724,
360
  727, 730, 734, 737, 740, 744, 747, 750, 754, 757, 760, 764, 767, 770,
361
  774, 777, 780, 784, 787, 790, 794, 797, 800, 804, 807, 810, 813, 817,
362
  820, 823, 827, 830, 833, 837, 840, 843, 847, 850, 853, 857, 860, 863,
363
  867, 870, 873, 877, 880, 883, 887, 890, 893, 897, 900, 903, 907, 910,
364
  913, 916, 920, 923, 926, 930, 933, 936, 940, 943, 946, 950, 953, 956,
365
  960, 963, 966, 970, 973, 976, 980, 983, 986, 990, 993, 996, 1000, 1003,
366
  1006, 1009, 1013, 1016, 1019, 1023, 1026, 1029, 1033, 1036, 1039, 1043,
367
  1046, 1049, 1053, 1056, 1059, 1063, 1066, 1069, 1073, 1076
368
};
369
370
static diy_fp_t cached_power(int k)
371
0
{
372
0
  diy_fp_t res;
373
0
  int index = 343 + k;
374
0
  res.f = powers_ten[index];
375
0
  res.e = powers_ten_e[index];
376
0
  return res;
377
0
}
378
379
0
static int k_comp(int e, int alpha, int gamma) {
380
0
  return ceil((alpha-e+63) * D_1_LOG2_10);
381
0
}
382
383
static diy_fp_t minus(diy_fp_t x, diy_fp_t y)
384
0
{
385
0
  diy_fp_t r;
386
0
  assert(x.e == y.e);
387
0
  assert(x.f >= y.f);
388
0
  r.f = x.f - y.f;
389
0
  r.e = x.e;
390
0
  return r;
391
0
}
392
393
static diy_fp_t multiply(diy_fp_t x, diy_fp_t y)
394
0
{
395
0
  uint64_t a,b,c,d,ac,bc,ad,bd,tmp;
396
0
  diy_fp_t r;
397
0
  uint64_t M32 = 0xFFFFFFFF;
398
0
  a = x.f >> 32; b = x.f & M32;
399
0
  c = y.f >> 32; d = y.f & M32;
400
0
  ac = a*c; bc = b*c; ad = a*d; bd = b*d;
401
0
  tmp = (bd>>32) + (ad&M32) + (bc&M32);
402
0
  tmp += 1U << 31;
403
0
  r.f = ac+(ad>>32)+(bc>>32)+(tmp >>32);
404
0
  r.e = x.e + y.e + 64;
405
0
  return r;
406
0
}
407
408
static uint64_t double_to_uint64(double d)
409
0
{
410
0
  uint64_t n;
411
0
  memcpy(&n, &d, 8);
412
0
  return n;
413
0
}
414
415
0
#define DP_SIGNIFICAND_SIZE 52
416
0
#define DP_EXPONENT_BIAS (0x3FF + DP_SIGNIFICAND_SIZE)
417
0
#define DP_MIN_EXPONENT (-DP_EXPONENT_BIAS)
418
0
#define DP_EXPONENT_MASK 0x7FF0000000000000
419
0
#define DP_SIGNIFICAND_MASK 0x000FFFFFFFFFFFFF
420
0
#define DP_HIDDEN_BIT 0x0010000000000000
421
422
static diy_fp_t double2diy_fp(double d)
423
0
{
424
0
  uint64_t d64 = double_to_uint64(d);
425
0
  int biased_e = (d64 & DP_EXPONENT_MASK) >> DP_SIGNIFICAND_SIZE;
426
0
  uint64_t significand = (d64 & DP_SIGNIFICAND_MASK);
427
0
  diy_fp_t res;
428
0
  if (biased_e != 0) {
429
0
    res.f = significand + DP_HIDDEN_BIT;
430
0
    res.e = biased_e - DP_EXPONENT_BIAS;
431
0
  } else {
432
0
    res.f = significand;
433
0
    res.e = DP_MIN_EXPONENT + 1;
434
0
  }
435
0
  return res;
436
0
}
437
438
static diy_fp_t normalize_boundary(diy_fp_t in)
439
0
{
440
0
  diy_fp_t res = in;
441
  /* Normalize now */
442
  /* the original number could have been a denormal. */
443
0
  while (! (res.f & (DP_HIDDEN_BIT << 1))) {
444
0
    res.f <<= 1;
445
0
    res.e--;
446
0
  }
447
  /* do the final shifts in one go. Don't forget the hidden bit (the '-1') */
448
0
  res.f <<= (DIY_SIGNIFICAND_SIZE - DP_SIGNIFICAND_SIZE - 2);
449
0
  res.e = res.e - (DIY_SIGNIFICAND_SIZE - DP_SIGNIFICAND_SIZE - 2);
450
0
  return res;
451
0
}
452
453
static void normalized_boundaries(double d, diy_fp_t* out_m_minus, diy_fp_t* out_m_plus)
454
0
{
455
0
  diy_fp_t v = double2diy_fp(d);
456
0
  diy_fp_t pl, mi;
457
0
  int significand_is_zero = v.f == DP_HIDDEN_BIT;
458
0
  pl.f = (v.f << 1) + 1; pl.e = v.e - 1;
459
0
  pl = normalize_boundary(pl);
460
0
  if (significand_is_zero) {
461
0
    mi.f = (v.f << 2) - 1;
462
0
    mi.e = v.e - 2;
463
0
  } else {
464
0
    mi.f = (v.f << 1) - 1;
465
0
    mi.e = v.e - 1;
466
0
  }
467
0
  mi.f <<= mi.e - pl.e;
468
0
  mi.e = pl.e;
469
0
  *out_m_plus = pl;
470
0
  *out_m_minus = mi;
471
0
}
472
473
0
#define TEN2 100
474
static void digit_gen(diy_fp_t Mp, diy_fp_t delta, char* buffer, int* len, int* K)
475
0
{
476
0
  uint32_t div, p1;
477
0
  uint64_t p2;
478
0
  int d,kappa;
479
0
  diy_fp_t one;
480
0
  one.f = ((uint64_t) 1) << -Mp.e; one.e = Mp.e;
481
0
  p1 = Mp.f >> -one.e;
482
0
  p2 = Mp.f & (one.f - 1);
483
0
  *len = 0; kappa = 3; div = TEN2;
484
0
  while (kappa > 0) {
485
0
    d = p1 / div;
486
0
    if (d || *len) buffer[(*len)++] = '0' + d;
487
0
    p1 %= div; kappa--; div /= 10;
488
0
    if ((((uint64_t)p1)<<-one.e)+p2 <= delta.f) {
489
0
      *K += kappa; return;
490
0
    }
491
0
  }
492
0
  do {
493
0
    p2 *= 10;
494
0
    d = p2 >> -one.e;
495
0
    if (d || *len) buffer[(*len)++] = '0' + d;
496
0
    p2 &= one.f - 1; kappa--; delta.f *= 10;
497
0
  } while (p2 > delta.f);
498
0
  *K += kappa;
499
0
}
500
501
int
502
js_grisu2(double v, char *buffer, int *K)
503
0
{
504
0
  int length, mk;
505
0
  diy_fp_t w_m, w_p, c_mk, Wp, Wm, delta;
506
0
  int q = 64, alpha = -59, gamma = -56;
507
0
  normalized_boundaries(v, &w_m, &w_p);
508
0
  mk = k_comp(w_p.e + q, alpha, gamma);
509
0
  c_mk = cached_power(mk);
510
0
  Wp = multiply(w_p, c_mk);
511
0
  Wm = multiply(w_m, c_mk);
512
0
  Wm.f++; Wp.f--;
513
0
  delta = minus(Wp, Wm);
514
0
  *K = -mk;
515
0
  digit_gen(Wp, delta, buffer, &length, K);
516
0
  return length;
517
0
}
518
519
/*
520
 * strtod.c
521
 *
522
 * Copyright (c) 1988-1993 The Regents of the University of California.
523
 * Copyright (c) 1994 Sun Microsystems, Inc.
524
 *
525
 * Permission to use, copy, modify, and distribute this software and its
526
 * documentation for any purpose and without fee is hereby granted, provided
527
 * that the above copyright notice appear in all copies. The University of
528
 * California makes no representations about the suitability of this software
529
 * for any purpose. It is provided "as is" without express or implied warranty.
530
 */
531
532
/* Largest possible base 10 exponent. Any exponent larger than this will
533
 * already produce underflow or overflow, so there's no need to worry about
534
 * additional digits.
535
 */
536
static int maxExponent = 511;
537
538
/* Table giving binary powers of 10. Entry
539
 * is 10^2^i. Used to convert decimal
540
 * exponents into floating-point numbers.
541
 */
542
static double powersOf10[] = {
543
  10.,
544
  100.,
545
  1.0e4,
546
  1.0e8,
547
  1.0e16,
548
  1.0e32,
549
  1.0e64,
550
  1.0e128,
551
  1.0e256
552
};
553
554
/* Parse a decimal ASCII floating-point number, optionally preceded by white
555
 * space. Must have form "-I.FE-X", where I is the integer part of the
556
 * mantissa, F is the fractional part of the mantissa, and X is the exponent.
557
 * Either of the signs may be "+", "-", or omitted. Either I or F may be
558
 * omitted, or both. The decimal point isn't necessary unless F is present.
559
 * The "E" may actually be an "e". E and X may both be omitted (but not just
560
 * one).
561
 */
562
double
563
js_strtod(const char *string, char **endPtr)
564
0
{
565
0
  int sign, expSign = FALSE;
566
0
  double fraction, dblExp, *d;
567
0
  register const char *p;
568
0
  register int c;
569
570
  /* Exponent read from "EX" field. */
571
0
  int exp = 0;
572
573
  /* Exponent that derives from the fractional part. Under normal
574
   * circumstances, it is the negative of the number of digits in F.
575
   * However, if I is very long, the last digits of I get dropped
576
   * (otherwise a long I with a large negative exponent could cause an
577
   * unnecessary overflow on I alone). In this case, fracExp is
578
   * incremented one for each dropped digit.
579
   */
580
0
  int fracExp = 0;
581
582
  /* Number of digits in mantissa. */
583
0
  int mantSize;
584
585
  /* Number of mantissa digits BEFORE decimal point. */
586
0
  int decPt;
587
588
  /* Temporarily holds location of exponent in string. */
589
0
  const char *pExp;
590
591
  /*
592
   * Strip off leading blanks and check for a sign.
593
   */
594
595
0
  p = string;
596
0
  while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') {
597
0
    p += 1;
598
0
  }
599
0
  if (*p == '-') {
600
0
    sign = TRUE;
601
0
    p += 1;
602
0
  } else {
603
0
    if (*p == '+') {
604
0
      p += 1;
605
0
    }
606
0
    sign = FALSE;
607
0
  }
608
609
  /*
610
   * Count the number of digits in the mantissa (including the decimal
611
   * point), and also locate the decimal point.
612
   */
613
614
0
  decPt = -1;
615
0
  for (mantSize = 0; ; mantSize += 1)
616
0
  {
617
0
    c = *p;
618
0
    if (!(c>='0'&&c<='9')) {
619
0
      if ((c != '.') || (decPt >= 0)) {
620
0
        break;
621
0
      }
622
0
      decPt = mantSize;
623
0
    }
624
0
    p += 1;
625
0
  }
626
627
  /*
628
   * Now suck up the digits in the mantissa. Use two integers to
629
   * collect 9 digits each (this is faster than using floating-point).
630
   * If the mantissa has more than 18 digits, ignore the extras, since
631
   * they can't affect the value anyway.
632
   */
633
634
0
  pExp = p;
635
0
  p -= mantSize;
636
0
  if (decPt < 0) {
637
0
    decPt = mantSize;
638
0
  } else {
639
0
    mantSize -= 1;      /* One of the digits was the point. */
640
0
  }
641
0
  if (mantSize > 18) {
642
0
    fracExp = decPt - 18;
643
0
    mantSize = 18;
644
0
  } else {
645
0
    fracExp = decPt - mantSize;
646
0
  }
647
0
  if (mantSize == 0) {
648
0
    fraction = 0.0;
649
0
    p = string;
650
0
    goto done;
651
0
  } else {
652
0
    int frac1, frac2;
653
0
    frac1 = 0;
654
0
    for ( ; mantSize > 9; mantSize -= 1)
655
0
    {
656
0
      c = *p;
657
0
      p += 1;
658
0
      if (c == '.') {
659
0
        c = *p;
660
0
        p += 1;
661
0
      }
662
0
      frac1 = 10*frac1 + (c - '0');
663
0
    }
664
0
    frac2 = 0;
665
0
    for (; mantSize > 0; mantSize -= 1)
666
0
    {
667
0
      c = *p;
668
0
      p += 1;
669
0
      if (c == '.') {
670
0
        c = *p;
671
0
        p += 1;
672
0
      }
673
0
      frac2 = 10*frac2 + (c - '0');
674
0
    }
675
0
    fraction = (1.0e9 * frac1) + frac2;
676
0
  }
677
678
  /*
679
   * Skim off the exponent.
680
   */
681
682
0
  p = pExp;
683
0
  if ((*p == 'E') || (*p == 'e')) {
684
0
    p += 1;
685
0
    if (*p == '-') {
686
0
      expSign = TRUE;
687
0
      p += 1;
688
0
    } else {
689
0
      if (*p == '+') {
690
0
        p += 1;
691
0
      }
692
0
      expSign = FALSE;
693
0
    }
694
0
    while ((*p >= '0') && (*p <= '9') && exp < INT_MAX/100) {
695
0
      exp = exp * 10 + (*p - '0');
696
0
      p += 1;
697
0
    }
698
0
    while ((*p >= '0') && (*p <= '9'))
699
0
      p += 1;
700
0
  }
701
0
  if (expSign) {
702
0
    exp = fracExp - exp;
703
0
  } else {
704
0
    exp = fracExp + exp;
705
0
  }
706
707
  /*
708
   * Generate a floating-point number that represents the exponent.
709
   * Do this by processing the exponent one bit at a time to combine
710
   * many powers of 2 of 10. Then combine the exponent with the
711
   * fraction.
712
   */
713
714
0
  if (exp < -maxExponent) {
715
0
    exp = maxExponent;
716
0
    expSign = TRUE;
717
0
    errno = ERANGE;
718
0
  } else if (exp > maxExponent) {
719
0
    exp = maxExponent;
720
0
    expSign = FALSE;
721
0
    errno = ERANGE;
722
0
  } else if (exp < 0) {
723
0
    expSign = TRUE;
724
0
    exp = -exp;
725
0
  } else {
726
0
    expSign = FALSE;
727
0
  }
728
0
  dblExp = 1.0;
729
0
  for (d = powersOf10; exp != 0; exp >>= 1, d += 1) {
730
0
    if (exp & 01) {
731
0
      dblExp *= *d;
732
0
    }
733
0
  }
734
0
  if (expSign) {
735
0
    fraction /= dblExp;
736
0
  } else {
737
0
    fraction *= dblExp;
738
0
  }
739
740
0
done:
741
0
  if (endPtr != NULL) {
742
0
    *endPtr = (char *) p;
743
0
  }
744
745
0
  if (sign) {
746
0
    return -fraction;
747
0
  }
748
0
  return fraction;
749
0
}