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 #define TRUE 1
17 #define FALSE 0
18 #endif
19 
20 /*
21  * format exponent like sprintf(p, "e%+d", e)
22  */
23 void
js_fmtexp(char * p,int e)24 js_fmtexp(char *p, int e)
25 {
26 	char se[9];
27 	int i;
28 
29 	*p++ = 'e';
30 	if(e < 0) {
31 		*p++ = '-';
32 		e = -e;
33 	} else
34 		*p++ = '+';
35 	i = 0;
36 	while(e) {
37 		se[i++] = e % 10 + '0';
38 		e /= 10;
39 	}
40 	while(i < 1)
41 		se[i++] = '0';
42 	while(i > 0)
43 		*p++ = se[--i];
44 	*p++ = '\0';
45 }
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 #define DIY_SIGNIFICAND_SIZE 64
79 #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 
cached_power(int k)370 static diy_fp_t cached_power(int k)
371 {
372 	diy_fp_t res;
373 	int index = 343 + k;
374 	res.f = powers_ten[index];
375 	res.e = powers_ten_e[index];
376 	return res;
377 }
378 
k_comp(int e,int alpha,int gamma)379 static int k_comp(int e, int alpha, int gamma) {
380 	return ceil((alpha-e+63) * D_1_LOG2_10);
381 }
382 
minus(diy_fp_t x,diy_fp_t y)383 static diy_fp_t minus(diy_fp_t x, diy_fp_t y)
384 {
385 	diy_fp_t r;
386 	assert(x.e == y.e);
387 	assert(x.f >= y.f);
388 	r.f = x.f - y.f;
389 	r.e = x.e;
390 	return r;
391 }
392 
multiply(diy_fp_t x,diy_fp_t y)393 static diy_fp_t multiply(diy_fp_t x, diy_fp_t y)
394 {
395 	uint64_t a,b,c,d,ac,bc,ad,bd,tmp;
396 	diy_fp_t r;
397 	uint64_t M32 = 0xFFFFFFFF;
398 	a = x.f >> 32; b = x.f & M32;
399 	c = y.f >> 32; d = y.f & M32;
400 	ac = a*c; bc = b*c; ad = a*d; bd = b*d;
401 	tmp = (bd>>32) + (ad&M32) + (bc&M32);
402 	tmp += 1U << 31;
403 	r.f = ac+(ad>>32)+(bc>>32)+(tmp >>32);
404 	r.e = x.e + y.e + 64;
405 	return r;
406 }
407 
double_to_uint64(double d)408 static uint64_t double_to_uint64(double d)
409 {
410 	union { double d; uint64_t n; } tmp;
411 	tmp.d = d;
412 	return tmp.n;
413 }
414 
415 #define DP_SIGNIFICAND_SIZE 52
416 #define DP_EXPONENT_BIAS (0x3FF + DP_SIGNIFICAND_SIZE)
417 #define DP_MIN_EXPONENT (-DP_EXPONENT_BIAS)
418 #define DP_EXPONENT_MASK 0x7FF0000000000000
419 #define DP_SIGNIFICAND_MASK 0x000FFFFFFFFFFFFF
420 #define DP_HIDDEN_BIT 0x0010000000000000
421 
double2diy_fp(double d)422 static diy_fp_t double2diy_fp(double d)
423 {
424 	uint64_t d64 = double_to_uint64(d);
425 	int biased_e = (d64 & DP_EXPONENT_MASK) >> DP_SIGNIFICAND_SIZE;
426 	uint64_t significand = (d64 & DP_SIGNIFICAND_MASK);
427 	diy_fp_t res;
428 	if (biased_e != 0) {
429 		res.f = significand + DP_HIDDEN_BIT;
430 		res.e = biased_e - DP_EXPONENT_BIAS;
431 	} else {
432 		res.f = significand;
433 		res.e = DP_MIN_EXPONENT + 1;
434 	}
435 	return res;
436 }
437 
normalize_boundary(diy_fp_t in)438 static diy_fp_t normalize_boundary(diy_fp_t in)
439 {
440 	diy_fp_t res = in;
441 	/* Normalize now */
442 	/* the original number could have been a denormal. */
443 	while (! (res.f & (DP_HIDDEN_BIT << 1))) {
444 		res.f <<= 1;
445 		res.e--;
446 	}
447 	/* do the final shifts in one go. Don't forget the hidden bit (the '-1') */
448 	res.f <<= (DIY_SIGNIFICAND_SIZE - DP_SIGNIFICAND_SIZE - 2);
449 	res.e = res.e - (DIY_SIGNIFICAND_SIZE - DP_SIGNIFICAND_SIZE - 2);
450 	return res;
451 }
452 
normalized_boundaries(double d,diy_fp_t * out_m_minus,diy_fp_t * out_m_plus)453 static void normalized_boundaries(double d, diy_fp_t* out_m_minus, diy_fp_t* out_m_plus)
454 {
455 	diy_fp_t v = double2diy_fp(d);
456 	diy_fp_t pl, mi;
457 	int significand_is_zero = v.f == DP_HIDDEN_BIT;
458 	pl.f = (v.f << 1) + 1; pl.e = v.e - 1;
459 	pl = normalize_boundary(pl);
460 	if (significand_is_zero) {
461 		mi.f = (v.f << 2) - 1;
462 		mi.e = v.e - 2;
463 	} else {
464 		mi.f = (v.f << 1) - 1;
465 		mi.e = v.e - 1;
466 	}
467 	mi.f <<= mi.e - pl.e;
468 	mi.e = pl.e;
469 	*out_m_plus = pl;
470 	*out_m_minus = mi;
471 }
472 
473 #define TEN2 100
digit_gen(diy_fp_t Mp,diy_fp_t delta,char * buffer,int * len,int * K)474 static void digit_gen(diy_fp_t Mp, diy_fp_t delta, char* buffer, int* len, int* K)
475 {
476 	uint32_t div, p1;
477 	uint64_t p2;
478 	int d,kappa;
479 	diy_fp_t one;
480 	one.f = ((uint64_t) 1) << -Mp.e; one.e = Mp.e;
481 	p1 = Mp.f >> -one.e;
482 	p2 = Mp.f & (one.f - 1);
483 	*len = 0; kappa = 3; div = TEN2;
484 	while (kappa > 0) {
485 		d = p1 / div;
486 		if (d || *len) buffer[(*len)++] = '0' + d;
487 		p1 %= div; kappa--; div /= 10;
488 		if ((((uint64_t)p1)<<-one.e)+p2 <= delta.f) {
489 			*K += kappa; return;
490 		}
491 	}
492 	do {
493 		p2 *= 10;
494 		d = p2 >> -one.e;
495 		if (d || *len) buffer[(*len)++] = '0' + d;
496 		p2 &= one.f - 1; kappa--; delta.f *= 10;
497 	} while (p2 > delta.f);
498 	*K += kappa;
499 }
500 
501 int
js_grisu2(double v,char * buffer,int * K)502 js_grisu2(double v, char *buffer, int *K)
503 {
504 	int length, mk;
505 	diy_fp_t w_m, w_p, c_mk, Wp, Wm, delta;
506 	int q = 64, alpha = -59, gamma = -56;
507 	normalized_boundaries(v, &w_m, &w_p);
508 	mk = k_comp(w_p.e + q, alpha, gamma);
509 	c_mk = cached_power(mk);
510 	Wp = multiply(w_p, c_mk);
511 	Wm = multiply(w_m, c_mk);
512 	Wm.f++; Wp.f--;
513 	delta = minus(Wp, Wm);
514 	*K = -mk;
515 	digit_gen(Wp, delta, buffer, &length, K);
516 	return length;
517 }
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
js_strtod(const char * string,char ** endPtr)563 js_strtod(const char *string, char **endPtr)
564 {
565 	int sign, expSign = FALSE;
566 	double fraction, dblExp, *d;
567 	register const char *p;
568 	register int c;
569 
570 	/* Exponent read from "EX" field. */
571 	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 	int fracExp = 0;
581 
582 	/* Number of digits in mantissa. */
583 	int mantSize;
584 
585 	/* Number of mantissa digits BEFORE decimal point. */
586 	int decPt;
587 
588 	/* Temporarily holds location of exponent in string. */
589 	const char *pExp;
590 
591 	/*
592 	 * Strip off leading blanks and check for a sign.
593 	 */
594 
595 	p = string;
596 	while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') {
597 		p += 1;
598 	}
599 	if (*p == '-') {
600 		sign = TRUE;
601 		p += 1;
602 	} else {
603 		if (*p == '+') {
604 			p += 1;
605 		}
606 		sign = FALSE;
607 	}
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 	decPt = -1;
615 	for (mantSize = 0; ; mantSize += 1)
616 	{
617 		c = *p;
618 		if (!(c>='0'&&c<='9')) {
619 			if ((c != '.') || (decPt >= 0)) {
620 				break;
621 			}
622 			decPt = mantSize;
623 		}
624 		p += 1;
625 	}
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 	pExp = p;
635 	p -= mantSize;
636 	if (decPt < 0) {
637 		decPt = mantSize;
638 	} else {
639 		mantSize -= 1;			/* One of the digits was the point. */
640 	}
641 	if (mantSize > 18) {
642 		fracExp = decPt - 18;
643 		mantSize = 18;
644 	} else {
645 		fracExp = decPt - mantSize;
646 	}
647 	if (mantSize == 0) {
648 		fraction = 0.0;
649 		p = string;
650 		goto done;
651 	} else {
652 		int frac1, frac2;
653 		frac1 = 0;
654 		for ( ; mantSize > 9; mantSize -= 1)
655 		{
656 			c = *p;
657 			p += 1;
658 			if (c == '.') {
659 				c = *p;
660 				p += 1;
661 			}
662 			frac1 = 10*frac1 + (c - '0');
663 		}
664 		frac2 = 0;
665 		for (; mantSize > 0; mantSize -= 1)
666 		{
667 			c = *p;
668 			p += 1;
669 			if (c == '.') {
670 				c = *p;
671 				p += 1;
672 			}
673 			frac2 = 10*frac2 + (c - '0');
674 		}
675 		fraction = (1.0e9 * frac1) + frac2;
676 	}
677 
678 	/*
679 	 * Skim off the exponent.
680 	 */
681 
682 	p = pExp;
683 	if ((*p == 'E') || (*p == 'e')) {
684 		p += 1;
685 		if (*p == '-') {
686 			expSign = TRUE;
687 			p += 1;
688 		} else {
689 			if (*p == '+') {
690 				p += 1;
691 			}
692 			expSign = FALSE;
693 		}
694 		while ((*p >= '0') && (*p <= '9')) {
695 			exp = exp * 10 + (*p - '0');
696 			p += 1;
697 		}
698 	}
699 	if (expSign) {
700 		exp = fracExp - exp;
701 	} else {
702 		exp = fracExp + exp;
703 	}
704 
705 	/*
706 	 * Generate a floating-point number that represents the exponent.
707 	 * Do this by processing the exponent one bit at a time to combine
708 	 * many powers of 2 of 10. Then combine the exponent with the
709 	 * fraction.
710 	 */
711 
712 	if (exp < -maxExponent) {
713 		exp = maxExponent;
714 		expSign = TRUE;
715 		errno = ERANGE;
716 	} else if (exp > maxExponent) {
717 		exp = maxExponent;
718 		expSign = FALSE;
719 		errno = ERANGE;
720 	} else if (exp < 0) {
721 		expSign = TRUE;
722 		exp = -exp;
723 	} else {
724 		expSign = FALSE;
725 	}
726 	dblExp = 1.0;
727 	for (d = powersOf10; exp != 0; exp >>= 1, d += 1) {
728 		if (exp & 01) {
729 			dblExp *= *d;
730 		}
731 	}
732 	if (expSign) {
733 		fraction /= dblExp;
734 	} else {
735 		fraction *= dblExp;
736 	}
737 
738 done:
739 	if (endPtr != NULL) {
740 		*endPtr = (char *) p;
741 	}
742 
743 	if (sign) {
744 		return -fraction;
745 	}
746 	return fraction;
747 }
748