johnson 1.2.0 → 2.0.0.pre0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (782) hide show
  1. data/CHANGELOG.rdoc +8 -0
  2. data/Manifest.txt +762 -48
  3. data/README.rdoc +2 -1
  4. data/Rakefile +90 -18
  5. data/ext/spidermonkey/conversions.c +9 -2
  6. data/ext/spidermonkey/ruby_land_proxy.c +1 -1
  7. data/ext/spidermonkey/runtime.h +1 -1
  8. data/ext/tracemonkey/context.cc +125 -0
  9. data/ext/tracemonkey/context.h +19 -0
  10. data/ext/tracemonkey/conversions.cc +365 -0
  11. data/ext/tracemonkey/conversions.h +32 -0
  12. data/ext/tracemonkey/debugger.cc +234 -0
  13. data/ext/tracemonkey/debugger.h +10 -0
  14. data/ext/tracemonkey/extconf.rb +37 -0
  15. data/ext/tracemonkey/extensions.cc +37 -0
  16. data/ext/tracemonkey/extensions.h +12 -0
  17. data/ext/tracemonkey/global.cc +40 -0
  18. data/ext/tracemonkey/global.h +11 -0
  19. data/ext/tracemonkey/idhash.cc +16 -0
  20. data/ext/tracemonkey/idhash.h +8 -0
  21. data/ext/tracemonkey/immutable_node.cc +1199 -0
  22. data/ext/tracemonkey/immutable_node.cc.erb +559 -0
  23. data/ext/tracemonkey/immutable_node.h +22 -0
  24. data/ext/tracemonkey/jroot.h +215 -0
  25. data/ext/tracemonkey/js_land_proxy.cc +620 -0
  26. data/ext/tracemonkey/js_land_proxy.h +20 -0
  27. data/ext/tracemonkey/ruby_land_proxy.cc +618 -0
  28. data/ext/tracemonkey/ruby_land_proxy.h +38 -0
  29. data/ext/tracemonkey/runtime.cc +454 -0
  30. data/ext/tracemonkey/runtime.h +27 -0
  31. data/ext/tracemonkey/split_global.cc +392 -0
  32. data/ext/tracemonkey/split_global.h +11 -0
  33. data/ext/tracemonkey/tracemonkey.cc +23 -0
  34. data/ext/tracemonkey/tracemonkey.h +32 -0
  35. data/lib/johnson.rb +12 -4
  36. data/lib/johnson/error.rb +5 -0
  37. data/lib/johnson/js/prelude.js +16 -1
  38. data/lib/johnson/parser.rb +2 -1
  39. data/lib/johnson/runtime.rb +87 -26
  40. data/lib/johnson/spidermonkey/runtime.rb +7 -16
  41. data/lib/johnson/tracemonkey.rb +13 -0
  42. data/lib/johnson/tracemonkey/context.rb +10 -0
  43. data/lib/johnson/tracemonkey/debugger.rb +67 -0
  44. data/lib/johnson/tracemonkey/immutable_node.rb +282 -0
  45. data/lib/johnson/tracemonkey/js_land_proxy.rb +64 -0
  46. data/lib/johnson/tracemonkey/mutable_tree_visitor.rb +242 -0
  47. data/lib/johnson/tracemonkey/ruby_land_proxy.rb +17 -0
  48. data/lib/johnson/tracemonkey/runtime.rb +80 -0
  49. data/test/{johnson_test.rb → generic/johnson_test.rb} +1 -1
  50. data/test/{parser_test.rb → generic/parser_test.rb} +1 -1
  51. data/test/helper.rb +23 -4
  52. data/test/johnson/{browser_test.rb → generic/browser_test.rb} +1 -1
  53. data/test/johnson/{conversions → generic/conversions}/array_test.rb +1 -1
  54. data/test/johnson/{conversions → generic/conversions}/boolean_test.rb +1 -1
  55. data/test/johnson/{conversions → generic/conversions}/callable_test.rb +1 -1
  56. data/test/johnson/{conversions → generic/conversions}/file_test.rb +1 -1
  57. data/test/johnson/generic/conversions/helper.rb +1 -0
  58. data/test/johnson/{conversions → generic/conversions}/nil_test.rb +1 -1
  59. data/test/johnson/{conversions → generic/conversions}/number_test.rb +1 -1
  60. data/test/johnson/{conversions → generic/conversions}/regexp_test.rb +1 -1
  61. data/test/johnson/{conversions → generic/conversions}/string_test.rb +1 -1
  62. data/test/johnson/{conversions → generic/conversions}/struct_test.rb +1 -1
  63. data/test/johnson/{conversions → generic/conversions}/symbol_test.rb +1 -1
  64. data/test/johnson/{conversions → generic/conversions}/thread_test.rb +1 -1
  65. data/test/johnson/{custom_conversions_test.rb → generic/custom_conversions_test.rb} +1 -1
  66. data/test/johnson/generic/default_test.rb +12 -0
  67. data/test/johnson/{error_test.rb → generic/error_test.rb} +1 -1
  68. data/test/johnson/{extensions_test.rb → generic/extensions_test.rb} +1 -1
  69. data/test/johnson/generic/helper.rb +1 -0
  70. data/test/johnson/{nodes → generic/nodes}/array_literal_test.rb +1 -1
  71. data/test/johnson/{nodes → generic/nodes}/array_node_test.rb +1 -1
  72. data/test/johnson/{nodes → generic/nodes}/binary_node_test.rb +1 -1
  73. data/test/johnson/{nodes → generic/nodes}/bracket_access_test.rb +1 -1
  74. data/test/johnson/{nodes → generic/nodes}/delete_test.rb +1 -1
  75. data/test/johnson/{nodes → generic/nodes}/do_while_test.rb +1 -1
  76. data/test/johnson/{nodes → generic/nodes}/dot_accessor_test.rb +1 -1
  77. data/test/johnson/generic/nodes/export_test.rb +11 -0
  78. data/test/johnson/{nodes → generic/nodes}/for_test.rb +1 -1
  79. data/test/johnson/{nodes → generic/nodes}/function_test.rb +1 -1
  80. data/test/johnson/generic/nodes/helper.rb +1 -0
  81. data/test/johnson/{nodes → generic/nodes}/if_test.rb +16 -6
  82. data/test/johnson/generic/nodes/import_test.rb +15 -0
  83. data/test/johnson/{nodes → generic/nodes}/label_test.rb +1 -1
  84. data/test/johnson/{nodes → generic/nodes}/let_test.rb +1 -1
  85. data/test/johnson/{nodes → generic/nodes}/object_literal_test.rb +1 -1
  86. data/test/johnson/{nodes → generic/nodes}/return_test.rb +1 -1
  87. data/test/johnson/{nodes → generic/nodes}/semi_test.rb +1 -1
  88. data/test/johnson/{nodes → generic/nodes}/switch_test.rb +1 -1
  89. data/test/johnson/{nodes → generic/nodes}/ternary_test.rb +1 -1
  90. data/test/johnson/{nodes → generic/nodes}/throw_test.rb +1 -1
  91. data/test/johnson/{nodes → generic/nodes}/try_node_test.rb +36 -6
  92. data/test/johnson/{nodes → generic/nodes}/typeof_test.rb +1 -1
  93. data/test/johnson/{nodes → generic/nodes}/unary_node_test.rb +1 -1
  94. data/test/johnson/{nodes → generic/nodes}/void_test.rb +1 -1
  95. data/test/johnson/{nodes → generic/nodes}/while_test.rb +1 -1
  96. data/test/johnson/{nodes → generic/nodes}/with_test.rb +1 -1
  97. data/test/johnson/{prelude_test.rb → generic/prelude_test.rb} +1 -1
  98. data/test/johnson/{runtime_test.rb → generic/runtime_test.rb} +3 -6
  99. data/test/johnson/generic/version_test.rb +13 -0
  100. data/test/johnson/{visitors → generic/visitors}/dot_visitor_test.rb +1 -1
  101. data/test/johnson/{visitors → generic/visitors}/enumerating_visitor_test.rb +1 -1
  102. data/test/johnson/generic/visitors/helper.rb +1 -0
  103. data/test/johnson/spidermonkey/js_land_proxy_test.rb +1 -5
  104. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +11 -7
  105. data/test/johnson/tracemonkey/context_test.rb +21 -0
  106. data/test/johnson/tracemonkey/immutable_node_test.rb +34 -0
  107. data/test/johnson/tracemonkey/js_land_proxy_test.rb +273 -0
  108. data/test/johnson/tracemonkey/ruby_land_proxy_test.rb +274 -0
  109. data/test/johnson/tracemonkey/runtime_test.rb +41 -0
  110. data/test/johnson/tracemonkey/split_global_test.rb +32 -0
  111. data/vendor/spidermonkey/js.pkg +2 -0
  112. data/vendor/tracemonkey/Makefile.in +668 -0
  113. data/vendor/tracemonkey/Makefile.ref +483 -0
  114. data/vendor/tracemonkey/README.html +54 -0
  115. data/vendor/tracemonkey/SpiderMonkey.rsp +11 -0
  116. data/vendor/tracemonkey/Y.js +19 -0
  117. data/vendor/tracemonkey/aclocal.m4 +9 -0
  118. data/vendor/tracemonkey/bench.sh +5 -0
  119. data/vendor/tracemonkey/build/autoconf/acoutput-fast.pl +202 -0
  120. data/vendor/tracemonkey/build/autoconf/altoptions.m4 +154 -0
  121. data/vendor/tracemonkey/build/autoconf/config.guess +1537 -0
  122. data/vendor/tracemonkey/build/autoconf/config.sub +1595 -0
  123. data/vendor/tracemonkey/build/autoconf/install-sh +119 -0
  124. data/vendor/tracemonkey/build/autoconf/make-makefile +315 -0
  125. data/vendor/tracemonkey/build/autoconf/match-dir.sh +101 -0
  126. data/vendor/tracemonkey/build/autoconf/moznbytetype.m4 +136 -0
  127. data/vendor/tracemonkey/build/autoconf/nspr.m4 +82 -0
  128. data/vendor/tracemonkey/build/autoconf/pkg.m4 +59 -0
  129. data/vendor/tracemonkey/build/autoconf/update-makefile.sh +118 -0
  130. data/vendor/tracemonkey/build/cygwin-wrapper +75 -0
  131. data/vendor/tracemonkey/build/hcc +111 -0
  132. data/vendor/tracemonkey/build/hcpp +155 -0
  133. data/vendor/tracemonkey/build/unix/mddepend.pl +165 -0
  134. data/vendor/tracemonkey/build/unix/uniq.pl +63 -0
  135. data/vendor/tracemonkey/build/win32/pgomerge.py +40 -0
  136. data/vendor/tracemonkey/builtins.tbl +91 -0
  137. data/vendor/tracemonkey/call.js +13 -0
  138. data/vendor/tracemonkey/config.mk +206 -0
  139. data/vendor/tracemonkey/config/Makefile.in +106 -0
  140. data/vendor/tracemonkey/config/Moz/Milestone.pm +232 -0
  141. data/vendor/tracemonkey/config/autoconf.mk.in +362 -0
  142. data/vendor/tracemonkey/config/check-sync-dirs.py +103 -0
  143. data/vendor/tracemonkey/config/check-sync-exceptions +7 -0
  144. data/vendor/tracemonkey/config/config.mk +881 -0
  145. data/vendor/tracemonkey/config/fastcwd.pl +66 -0
  146. data/vendor/tracemonkey/config/gcc_hidden.h +2 -0
  147. data/vendor/tracemonkey/config/insure.mk +53 -0
  148. data/vendor/tracemonkey/config/make-system-wrappers.pl +59 -0
  149. data/vendor/tracemonkey/config/milestone.pl +112 -0
  150. data/vendor/tracemonkey/config/milestone.txt +13 -0
  151. data/vendor/tracemonkey/config/mkdepend/Makefile.in +84 -0
  152. data/vendor/tracemonkey/config/mkdepend/cppsetup.c +233 -0
  153. data/vendor/tracemonkey/config/mkdepend/def.h +184 -0
  154. data/vendor/tracemonkey/config/mkdepend/ifparser.c +551 -0
  155. data/vendor/tracemonkey/config/mkdepend/ifparser.h +83 -0
  156. data/vendor/tracemonkey/config/mkdepend/imakemdep.h +733 -0
  157. data/vendor/tracemonkey/config/mkdepend/include.c +337 -0
  158. data/vendor/tracemonkey/config/mkdepend/main.c +860 -0
  159. data/vendor/tracemonkey/config/mkdepend/mkdepend.man +382 -0
  160. data/vendor/tracemonkey/config/mkdepend/parse.c +686 -0
  161. data/vendor/tracemonkey/config/mkdepend/pr.c +124 -0
  162. data/vendor/tracemonkey/config/nfspwd.pl +50 -0
  163. data/vendor/tracemonkey/config/nsinstall.c +481 -0
  164. data/vendor/tracemonkey/config/nsinstall.py +155 -0
  165. data/vendor/tracemonkey/config/pathsub.c +247 -0
  166. data/vendor/tracemonkey/config/pathsub.h +74 -0
  167. data/vendor/tracemonkey/config/preprocessor.pl +671 -0
  168. data/vendor/tracemonkey/config/revdepth-nt.pl +48 -0
  169. data/vendor/tracemonkey/config/revdepth.pl +51 -0
  170. data/vendor/tracemonkey/config/rules.mk +2310 -0
  171. data/vendor/tracemonkey/config/static-checking-config.mk +21 -0
  172. data/vendor/tracemonkey/config/static-checking.js +92 -0
  173. data/vendor/tracemonkey/config/string-format.js +61 -0
  174. data/vendor/tracemonkey/config/system-headers +1035 -0
  175. data/vendor/tracemonkey/config/version.mk +85 -0
  176. data/vendor/tracemonkey/config/version_win.pl +442 -0
  177. data/vendor/tracemonkey/configure +14183 -0
  178. data/vendor/tracemonkey/configure.in +5363 -0
  179. data/vendor/tracemonkey/correct.sh +23 -0
  180. data/vendor/tracemonkey/correct/check-3d-morph.js +55 -0
  181. data/vendor/tracemonkey/correct/check-3d-raytrace.js +445 -0
  182. data/vendor/tracemonkey/correct/check-access-binary-trees.js +52 -0
  183. data/vendor/tracemonkey/correct/check-access-fannkuch.js +66 -0
  184. data/vendor/tracemonkey/correct/check-access-nbody.js +171 -0
  185. data/vendor/tracemonkey/correct/check-access-nsieve.js +40 -0
  186. data/vendor/tracemonkey/correct/check-bitops-3bit-bits-in-byte.js +35 -0
  187. data/vendor/tracemonkey/correct/check-bitops-bits-in-byte.js +24 -0
  188. data/vendor/tracemonkey/correct/check-bitops-bitwise-and.js +29 -0
  189. data/vendor/tracemonkey/correct/check-bitops-nsieve-bits.js +40 -0
  190. data/vendor/tracemonkey/correct/check-controlflow-recursive.js +27 -0
  191. data/vendor/tracemonkey/correct/check-date-format-tofte.js +302 -0
  192. data/vendor/tracemonkey/correct/check-date-format-xparb.js +421 -0
  193. data/vendor/tracemonkey/correct/check-mont.js +119 -0
  194. data/vendor/tracemonkey/dtoa.c +3335 -0
  195. data/vendor/tracemonkey/editline/Makefile.in +55 -0
  196. data/vendor/tracemonkey/editline/Makefile.ref +143 -0
  197. data/vendor/tracemonkey/editline/README +83 -0
  198. data/vendor/tracemonkey/editline/editline.3 +175 -0
  199. data/vendor/tracemonkey/editline/editline.c +1371 -0
  200. data/vendor/tracemonkey/editline/editline.h +135 -0
  201. data/vendor/tracemonkey/editline/sysunix.c +182 -0
  202. data/vendor/tracemonkey/editline/unix.h +82 -0
  203. data/vendor/tracemonkey/if.js +13 -0
  204. data/vendor/tracemonkey/imacro_asm.js.in +396 -0
  205. data/vendor/tracemonkey/imacros.c.out +1034 -0
  206. data/vendor/tracemonkey/imacros.jsasm +770 -0
  207. data/vendor/tracemonkey/javascript-trace.d +73 -0
  208. data/vendor/tracemonkey/jitstats.tbl +55 -0
  209. data/vendor/tracemonkey/js-config.h.in +82 -0
  210. data/vendor/tracemonkey/js-config.in +111 -0
  211. data/vendor/tracemonkey/js.mdp +0 -0
  212. data/vendor/tracemonkey/js.msg +312 -0
  213. data/vendor/tracemonkey/js3240.rc +79 -0
  214. data/vendor/tracemonkey/jsOS240.def +654 -0
  215. data/vendor/tracemonkey/jsapi.cpp +6005 -0
  216. data/vendor/tracemonkey/jsapi.h +2727 -0
  217. data/vendor/tracemonkey/jsarena.cpp +450 -0
  218. data/vendor/tracemonkey/jsarena.h +318 -0
  219. data/vendor/tracemonkey/jsarray.cpp +3664 -0
  220. data/vendor/tracemonkey/jsarray.h +238 -0
  221. data/vendor/tracemonkey/jsatom.cpp +1244 -0
  222. data/vendor/tracemonkey/jsatom.h +493 -0
  223. data/vendor/tracemonkey/jsbit.h +249 -0
  224. data/vendor/tracemonkey/jsbool.cpp +184 -0
  225. data/vendor/tracemonkey/jsbool.h +88 -0
  226. data/vendor/tracemonkey/jsbuiltins.cpp +415 -0
  227. data/vendor/tracemonkey/jsbuiltins.h +456 -0
  228. data/vendor/tracemonkey/jsclist.h +139 -0
  229. data/vendor/tracemonkey/jscntxt.cpp +1816 -0
  230. data/vendor/tracemonkey/jscntxt.h +1541 -0
  231. data/vendor/tracemonkey/jscompat.h +57 -0
  232. data/vendor/tracemonkey/jsconfig.mk +181 -0
  233. data/vendor/tracemonkey/jscpucfg.cpp +194 -0
  234. data/vendor/tracemonkey/jscpucfg.h +91 -0
  235. data/vendor/tracemonkey/jsdate.cpp +2465 -0
  236. data/vendor/tracemonkey/jsdate.h +129 -0
  237. data/vendor/tracemonkey/jsdbgapi.cpp +2017 -0
  238. data/vendor/tracemonkey/jsdbgapi.h +500 -0
  239. data/vendor/tracemonkey/jsdhash.cpp +876 -0
  240. data/vendor/tracemonkey/jsdhash.h +588 -0
  241. data/vendor/tracemonkey/jsdtoa.cpp +572 -0
  242. data/vendor/tracemonkey/jsdtoa.h +131 -0
  243. data/vendor/tracemonkey/jsdtracef.c +318 -0
  244. data/vendor/tracemonkey/jsdtracef.h +81 -0
  245. data/vendor/tracemonkey/jsemit.cpp +7292 -0
  246. data/vendor/tracemonkey/jsemit.h +802 -0
  247. data/vendor/tracemonkey/jsexn.cpp +1337 -0
  248. data/vendor/tracemonkey/jsexn.h +96 -0
  249. data/vendor/tracemonkey/jsfile.cpp +2747 -0
  250. data/vendor/tracemonkey/jsfile.h +56 -0
  251. data/vendor/tracemonkey/jsfile.msg +90 -0
  252. data/vendor/tracemonkey/jsfun.cpp +3089 -0
  253. data/vendor/tracemonkey/jsfun.h +366 -0
  254. data/vendor/tracemonkey/jsgc.cpp +3816 -0
  255. data/vendor/tracemonkey/jsgc.h +429 -0
  256. data/vendor/tracemonkey/jshash.cpp +477 -0
  257. data/vendor/tracemonkey/jshash.h +151 -0
  258. data/vendor/tracemonkey/jsify.pl +483 -0
  259. data/vendor/tracemonkey/jsinterp.cpp +7441 -0
  260. data/vendor/tracemonkey/jsinterp.h +666 -0
  261. data/vendor/tracemonkey/jsinvoke.cpp +42 -0
  262. data/vendor/tracemonkey/jsiter.cpp +1040 -0
  263. data/vendor/tracemonkey/jsiter.h +140 -0
  264. data/vendor/tracemonkey/jskeyword.tbl +124 -0
  265. data/vendor/tracemonkey/jskwgen.cpp +460 -0
  266. data/vendor/tracemonkey/jslibmath.h +69 -0
  267. data/vendor/tracemonkey/jslock.cpp +1512 -0
  268. data/vendor/tracemonkey/jslock.h +325 -0
  269. data/vendor/tracemonkey/jslocko.asm +60 -0
  270. data/vendor/tracemonkey/jslog2.cpp +111 -0
  271. data/vendor/tracemonkey/jslong.h +167 -0
  272. data/vendor/tracemonkey/jsmath.cpp +806 -0
  273. data/vendor/tracemonkey/jsmath.h +63 -0
  274. data/vendor/tracemonkey/jsnum.cpp +1374 -0
  275. data/vendor/tracemonkey/jsnum.h +280 -0
  276. data/vendor/tracemonkey/jsobj.cpp +6165 -0
  277. data/vendor/tracemonkey/jsobj.h +870 -0
  278. data/vendor/tracemonkey/json.cpp +1338 -0
  279. data/vendor/tracemonkey/json.h +108 -0
  280. data/vendor/tracemonkey/jsopcode.cpp +5484 -0
  281. data/vendor/tracemonkey/jsopcode.h +434 -0
  282. data/vendor/tracemonkey/jsopcode.tbl +591 -0
  283. data/vendor/tracemonkey/jsoplengen.cpp +121 -0
  284. data/vendor/tracemonkey/jsotypes.h +202 -0
  285. data/vendor/tracemonkey/jsparse.cpp +9257 -0
  286. data/vendor/tracemonkey/jsparse.h +900 -0
  287. data/vendor/tracemonkey/jsprf.cpp +1262 -0
  288. data/vendor/tracemonkey/jsprf.h +150 -0
  289. data/vendor/tracemonkey/jsproto.tbl +117 -0
  290. data/vendor/tracemonkey/jsprvtd.h +366 -0
  291. data/vendor/tracemonkey/jspubtd.h +585 -0
  292. data/vendor/tracemonkey/jsregexp.cpp +5051 -0
  293. data/vendor/tracemonkey/jsregexp.h +199 -0
  294. data/vendor/tracemonkey/jsreops.tbl +145 -0
  295. data/vendor/tracemonkey/jsscan.cpp +2040 -0
  296. data/vendor/tracemonkey/jsscan.h +467 -0
  297. data/vendor/tracemonkey/jsscope.cpp +1966 -0
  298. data/vendor/tracemonkey/jsscope.h +487 -0
  299. data/vendor/tracemonkey/jsscript.cpp +1932 -0
  300. data/vendor/tracemonkey/jsscript.h +345 -0
  301. data/vendor/tracemonkey/jsshell.msg +54 -0
  302. data/vendor/tracemonkey/jsstack.js +167 -0
  303. data/vendor/tracemonkey/jsstaticcheck.h +69 -0
  304. data/vendor/tracemonkey/jsstddef.h +87 -0
  305. data/vendor/tracemonkey/jsstdint.h +96 -0
  306. data/vendor/tracemonkey/jsstr.cpp +5277 -0
  307. data/vendor/tracemonkey/jsstr.h +702 -0
  308. data/vendor/tracemonkey/jstracer.cpp +10991 -0
  309. data/vendor/tracemonkey/jstracer.h +794 -0
  310. data/vendor/tracemonkey/jstypes.h +481 -0
  311. data/vendor/tracemonkey/jsutil.cpp +361 -0
  312. data/vendor/tracemonkey/jsutil.h +178 -0
  313. data/vendor/tracemonkey/jsversion.h +243 -0
  314. data/vendor/tracemonkey/jswince.asm +44 -0
  315. data/vendor/tracemonkey/jsxdrapi.cpp +800 -0
  316. data/vendor/tracemonkey/jsxdrapi.h +220 -0
  317. data/vendor/tracemonkey/jsxml.cpp +8327 -0
  318. data/vendor/tracemonkey/jsxml.h +305 -0
  319. data/vendor/tracemonkey/liveconnect/LiveConnect.dsp +157 -0
  320. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsp +120 -0
  321. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsw +44 -0
  322. data/vendor/tracemonkey/liveconnect/Makefile.in +105 -0
  323. data/vendor/tracemonkey/liveconnect/Makefile.ref +169 -0
  324. data/vendor/tracemonkey/liveconnect/README.html +712 -0
  325. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
  326. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
  327. data/vendor/tracemonkey/liveconnect/classes/Makefile.in +89 -0
  328. data/vendor/tracemonkey/liveconnect/classes/Makefile.ref +57 -0
  329. data/vendor/tracemonkey/liveconnect/classes/netscape/Makefile.ref +47 -0
  330. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSException.java +140 -0
  331. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
  332. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
  333. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
  334. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
  335. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
  336. data/vendor/tracemonkey/liveconnect/config/AIX4.1.mk +45 -0
  337. data/vendor/tracemonkey/liveconnect/config/AIX4.2.mk +45 -0
  338. data/vendor/tracemonkey/liveconnect/config/AIX4.3.mk +50 -0
  339. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.10.mk +43 -0
  340. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.20.mk +43 -0
  341. data/vendor/tracemonkey/liveconnect/config/HP-UXB.11.00.mk +43 -0
  342. data/vendor/tracemonkey/liveconnect/config/IRIX6.2.mk +43 -0
  343. data/vendor/tracemonkey/liveconnect/config/IRIX6.3.mk +43 -0
  344. data/vendor/tracemonkey/liveconnect/config/IRIX6.5.mk +43 -0
  345. data/vendor/tracemonkey/liveconnect/config/Linux_All.mk +73 -0
  346. data/vendor/tracemonkey/liveconnect/config/OSF1V4.0.mk +65 -0
  347. data/vendor/tracemonkey/liveconnect/config/OSF1V5.0.mk +62 -0
  348. data/vendor/tracemonkey/liveconnect/config/SunOS5.5.1.mk +55 -0
  349. data/vendor/tracemonkey/liveconnect/config/SunOS5.6.mk +39 -0
  350. data/vendor/tracemonkey/liveconnect/config/SunOS5.7.mk +39 -0
  351. data/vendor/tracemonkey/liveconnect/config/SunOS5.8.mk +39 -0
  352. data/vendor/tracemonkey/liveconnect/config/WINNT4.0.mk +53 -0
  353. data/vendor/tracemonkey/liveconnect/jsj.c +886 -0
  354. data/vendor/tracemonkey/liveconnect/jsj.msg +98 -0
  355. data/vendor/tracemonkey/liveconnect/jsj_JSObject.c +1377 -0
  356. data/vendor/tracemonkey/liveconnect/jsj_JavaArray.c +474 -0
  357. data/vendor/tracemonkey/liveconnect/jsj_JavaClass.c +737 -0
  358. data/vendor/tracemonkey/liveconnect/jsj_JavaMember.c +191 -0
  359. data/vendor/tracemonkey/liveconnect/jsj_JavaObject.c +1079 -0
  360. data/vendor/tracemonkey/liveconnect/jsj_JavaPackage.c +569 -0
  361. data/vendor/tracemonkey/liveconnect/jsj_array.c +207 -0
  362. data/vendor/tracemonkey/liveconnect/jsj_class.c +770 -0
  363. data/vendor/tracemonkey/liveconnect/jsj_convert.c +902 -0
  364. data/vendor/tracemonkey/liveconnect/jsj_field.c +421 -0
  365. data/vendor/tracemonkey/liveconnect/jsj_hash.c +488 -0
  366. data/vendor/tracemonkey/liveconnect/jsj_hash.h +161 -0
  367. data/vendor/tracemonkey/liveconnect/jsj_method.c +1825 -0
  368. data/vendor/tracemonkey/liveconnect/jsj_nodl.c +1 -0
  369. data/vendor/tracemonkey/liveconnect/jsj_private.h +677 -0
  370. data/vendor/tracemonkey/liveconnect/jsj_simpleapi.c +219 -0
  371. data/vendor/tracemonkey/liveconnect/jsj_utils.c +513 -0
  372. data/vendor/tracemonkey/liveconnect/jsjava.h +316 -0
  373. data/vendor/tracemonkey/liveconnect/netscape_javascript_JSObject.h +155 -0
  374. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.cpp +785 -0
  375. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.h +197 -0
  376. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.cpp +118 -0
  377. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.h +76 -0
  378. data/vendor/tracemonkey/liveconnect/nsILiveconnect.h +197 -0
  379. data/vendor/tracemonkey/liveconnect/nsISecureLiveconnect.h +94 -0
  380. data/vendor/tracemonkey/liveconnect/nsISecurityContext.h +136 -0
  381. data/vendor/tracemonkey/lock_SunOS.s +119 -0
  382. data/vendor/tracemonkey/mandelbrot-results.js +3 -0
  383. data/vendor/tracemonkey/math-partial-sums.js +32 -0
  384. data/vendor/tracemonkey/math-trace-tests.js +507 -0
  385. data/vendor/tracemonkey/md5.js +289 -0
  386. data/vendor/tracemonkey/nanojit/Assembler.cpp +1984 -0
  387. data/vendor/tracemonkey/nanojit/Assembler.h +375 -0
  388. data/vendor/tracemonkey/nanojit/Fragmento.cpp +651 -0
  389. data/vendor/tracemonkey/nanojit/Fragmento.h +237 -0
  390. data/vendor/tracemonkey/nanojit/LIR.cpp +2314 -0
  391. data/vendor/tracemonkey/nanojit/LIR.h +879 -0
  392. data/vendor/tracemonkey/nanojit/LIRopcode.tbl +252 -0
  393. data/vendor/tracemonkey/nanojit/Native.h +127 -0
  394. data/vendor/tracemonkey/nanojit/NativeARM.cpp +1742 -0
  395. data/vendor/tracemonkey/nanojit/NativeARM.h +844 -0
  396. data/vendor/tracemonkey/nanojit/NativeSparc.cpp +1130 -0
  397. data/vendor/tracemonkey/nanojit/NativeSparc.h +948 -0
  398. data/vendor/tracemonkey/nanojit/NativeThumb.cpp +1322 -0
  399. data/vendor/tracemonkey/nanojit/NativeThumb.h +525 -0
  400. data/vendor/tracemonkey/nanojit/Nativei386.cpp +1748 -0
  401. data/vendor/tracemonkey/nanojit/Nativei386.h +857 -0
  402. data/vendor/tracemonkey/nanojit/RegAlloc.cpp +183 -0
  403. data/vendor/tracemonkey/nanojit/RegAlloc.h +95 -0
  404. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.cpp +306 -0
  405. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.h +88 -0
  406. data/vendor/tracemonkey/nanojit/avmplus.cpp +56 -0
  407. data/vendor/tracemonkey/nanojit/avmplus.h +1016 -0
  408. data/vendor/tracemonkey/nanojit/nanojit.h +253 -0
  409. data/vendor/tracemonkey/perfect.js +39 -0
  410. data/vendor/tracemonkey/plify_jsdhash.sed +35 -0
  411. data/vendor/tracemonkey/prmjtime.cpp +869 -0
  412. data/vendor/tracemonkey/prmjtime.h +103 -0
  413. data/vendor/tracemonkey/ref-config/AIX4.1.mk +65 -0
  414. data/vendor/tracemonkey/ref-config/AIX4.2.mk +64 -0
  415. data/vendor/tracemonkey/ref-config/AIX4.3.mk +65 -0
  416. data/vendor/tracemonkey/ref-config/Darwin.mk +85 -0
  417. data/vendor/tracemonkey/ref-config/Darwin1.3.mk +81 -0
  418. data/vendor/tracemonkey/ref-config/Darwin1.4.mk +41 -0
  419. data/vendor/tracemonkey/ref-config/Darwin5.2.mk +81 -0
  420. data/vendor/tracemonkey/ref-config/Darwin5.3.mk +81 -0
  421. data/vendor/tracemonkey/ref-config/Darwin64.mk +72 -0
  422. data/vendor/tracemonkey/ref-config/HP-UXB.10.10.mk +77 -0
  423. data/vendor/tracemonkey/ref-config/HP-UXB.10.20.mk +77 -0
  424. data/vendor/tracemonkey/ref-config/HP-UXB.11.00.mk +80 -0
  425. data/vendor/tracemonkey/ref-config/IRIX.mk +87 -0
  426. data/vendor/tracemonkey/ref-config/IRIX5.3.mk +44 -0
  427. data/vendor/tracemonkey/ref-config/IRIX6.1.mk +44 -0
  428. data/vendor/tracemonkey/ref-config/IRIX6.2.mk +44 -0
  429. data/vendor/tracemonkey/ref-config/IRIX6.3.mk +44 -0
  430. data/vendor/tracemonkey/ref-config/IRIX6.5.mk +44 -0
  431. data/vendor/tracemonkey/ref-config/Linux_All.mk +105 -0
  432. data/vendor/tracemonkey/ref-config/Mac_OS10.0.mk +82 -0
  433. data/vendor/tracemonkey/ref-config/OSF1V4.0.mk +72 -0
  434. data/vendor/tracemonkey/ref-config/OSF1V5.0.mk +69 -0
  435. data/vendor/tracemonkey/ref-config/SunOS4.1.4.mk +101 -0
  436. data/vendor/tracemonkey/ref-config/SunOS5.10.mk +50 -0
  437. data/vendor/tracemonkey/ref-config/SunOS5.3.mk +91 -0
  438. data/vendor/tracemonkey/ref-config/SunOS5.4.mk +92 -0
  439. data/vendor/tracemonkey/ref-config/SunOS5.5.1.mk +44 -0
  440. data/vendor/tracemonkey/ref-config/SunOS5.5.mk +87 -0
  441. data/vendor/tracemonkey/ref-config/SunOS5.6.mk +89 -0
  442. data/vendor/tracemonkey/ref-config/SunOS5.7.mk +44 -0
  443. data/vendor/tracemonkey/ref-config/SunOS5.8.mk +44 -0
  444. data/vendor/tracemonkey/ref-config/SunOS5.9.mk +44 -0
  445. data/vendor/tracemonkey/ref-config/WINNT4.0.mk +118 -0
  446. data/vendor/tracemonkey/ref-config/WINNT5.0.mk +118 -0
  447. data/vendor/tracemonkey/ref-config/WINNT5.1.mk +118 -0
  448. data/vendor/tracemonkey/ref-config/WINNT5.2.mk +118 -0
  449. data/vendor/tracemonkey/ref-config/WINNT6.0.mk +118 -0
  450. data/vendor/tracemonkey/ref-config/dgux.mk +64 -0
  451. data/vendor/tracemonkey/resource.h +15 -0
  452. data/vendor/tracemonkey/rules.mk +206 -0
  453. data/vendor/tracemonkey/shell/Makefile.in +72 -0
  454. data/vendor/tracemonkey/shell/js.cpp +4719 -0
  455. data/vendor/tracemonkey/t/3d-cube.js +337 -0
  456. data/vendor/tracemonkey/t/3d-morph.js +54 -0
  457. data/vendor/tracemonkey/t/3d-raytrace.js +441 -0
  458. data/vendor/tracemonkey/t/access-binary-trees.js +50 -0
  459. data/vendor/tracemonkey/t/access-fannkuch.js +66 -0
  460. data/vendor/tracemonkey/t/access-nbody.js +169 -0
  461. data/vendor/tracemonkey/t/access-nsieve.js +38 -0
  462. data/vendor/tracemonkey/t/bitops-3bit-bits-in-byte.js +32 -0
  463. data/vendor/tracemonkey/t/bitops-bits-in-byte.js +21 -0
  464. data/vendor/tracemonkey/t/bitops-bitwise-and.js +28 -0
  465. data/vendor/tracemonkey/t/bitops-nsieve-bits.js +32 -0
  466. data/vendor/tracemonkey/t/controlflow-recursive.js +25 -0
  467. data/vendor/tracemonkey/t/crypto-aes.js +422 -0
  468. data/vendor/tracemonkey/t/crypto-md5.js +286 -0
  469. data/vendor/tracemonkey/t/crypto-sha1.js +224 -0
  470. data/vendor/tracemonkey/t/date-format-tofte.js +299 -0
  471. data/vendor/tracemonkey/t/date-format-xparb.js +417 -0
  472. data/vendor/tracemonkey/t/math-cordic.js +95 -0
  473. data/vendor/tracemonkey/t/math-partial-sums.js +33 -0
  474. data/vendor/tracemonkey/t/math-spectral-norm.js +51 -0
  475. data/vendor/tracemonkey/t/regexp-dna.js +1712 -0
  476. data/vendor/tracemonkey/t/string-base64.js +135 -0
  477. data/vendor/tracemonkey/t/string-fasta.js +85 -0
  478. data/vendor/tracemonkey/t/string-tagcloud.js +265 -0
  479. data/vendor/tracemonkey/t/string-unpack-code.js +68 -0
  480. data/vendor/tracemonkey/t/string-validate-input.js +89 -0
  481. data/vendor/tracemonkey/time.sh +13 -0
  482. data/vendor/tracemonkey/trace-test.js +5564 -0
  483. data/vendor/tracemonkey/v8/base.js +187 -0
  484. data/vendor/tracemonkey/v8/crypto.js +1689 -0
  485. data/vendor/tracemonkey/v8/deltablue.js +880 -0
  486. data/vendor/tracemonkey/v8/earley-boyer.js +4682 -0
  487. data/vendor/tracemonkey/v8/raytrace.js +3418 -0
  488. data/vendor/tracemonkey/v8/richards.js +539 -0
  489. data/vendor/tracemonkey/v8/run-crypto.js +44 -0
  490. data/vendor/tracemonkey/v8/run-deltablue.js +44 -0
  491. data/vendor/tracemonkey/v8/run-earley-boyer.js +44 -0
  492. data/vendor/tracemonkey/v8/run-raytrace.js +44 -0
  493. data/vendor/tracemonkey/v8/run-richards.js +44 -0
  494. data/vendor/tracemonkey/v8/run.js +49 -0
  495. data/vendor/tracemonkey/vprof/readme.txt +93 -0
  496. data/vendor/tracemonkey/vprof/vprof.cpp +360 -0
  497. data/vendor/tracemonkey/vprof/vprof.h +245 -0
  498. data/vendor/tracemonkey/xpconnect/Makefile.in +67 -0
  499. data/vendor/tracemonkey/xpconnect/crashtests/117307-1.html +20 -0
  500. data/vendor/tracemonkey/xpconnect/crashtests/193710.html +11 -0
  501. data/vendor/tracemonkey/xpconnect/crashtests/290162-1.html +5 -0
  502. data/vendor/tracemonkey/xpconnect/crashtests/326615-1.html +16 -0
  503. data/vendor/tracemonkey/xpconnect/crashtests/328553-1.html +13 -0
  504. data/vendor/tracemonkey/xpconnect/crashtests/346258-1.html +12 -0
  505. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame1.xhtml +16 -0
  506. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame2.xhtml +15 -0
  507. data/vendor/tracemonkey/xpconnect/crashtests/346512-1.xhtml +30 -0
  508. data/vendor/tracemonkey/xpconnect/crashtests/382133-1.html +3 -0
  509. data/vendor/tracemonkey/xpconnect/crashtests/386680-1.html +22 -0
  510. data/vendor/tracemonkey/xpconnect/crashtests/394810-1.html +4 -0
  511. data/vendor/tracemonkey/xpconnect/crashtests/400349-1.html +20 -0
  512. data/vendor/tracemonkey/xpconnect/crashtests/403356-1.html +13 -0
  513. data/vendor/tracemonkey/xpconnect/crashtests/418139-1.svg +22 -0
  514. data/vendor/tracemonkey/xpconnect/crashtests/420513-1.html +11 -0
  515. data/vendor/tracemonkey/xpconnect/crashtests/453935-1.html +37 -0
  516. data/vendor/tracemonkey/xpconnect/crashtests/462926.html +12 -0
  517. data/vendor/tracemonkey/xpconnect/crashtests/468552-1.html +18 -0
  518. data/vendor/tracemonkey/xpconnect/crashtests/471366-1.html +12 -0
  519. data/vendor/tracemonkey/xpconnect/crashtests/475185-1.html +13 -0
  520. data/vendor/tracemonkey/xpconnect/crashtests/475291-1.html +14 -0
  521. data/vendor/tracemonkey/xpconnect/crashtests/503286-1.html +23 -0
  522. data/vendor/tracemonkey/xpconnect/crashtests/crashtests.list +21 -0
  523. data/vendor/tracemonkey/xpconnect/idl/Makefile.in +78 -0
  524. data/vendor/tracemonkey/xpconnect/idl/XPCIDispatch.idl +51 -0
  525. data/vendor/tracemonkey/xpconnect/idl/mozIJSSubScriptLoader.idl +64 -0
  526. data/vendor/tracemonkey/xpconnect/idl/nsIActiveXSecurityPolicy.idl +67 -0
  527. data/vendor/tracemonkey/xpconnect/idl/nsIDispatchSupport.idl +119 -0
  528. data/vendor/tracemonkey/xpconnect/idl/nsIJSContextStack.idl +85 -0
  529. data/vendor/tracemonkey/xpconnect/idl/nsIJSRuntimeService.idl +51 -0
  530. data/vendor/tracemonkey/xpconnect/idl/nsIScriptError.idl +102 -0
  531. data/vendor/tracemonkey/xpconnect/idl/nsIScriptableInterfaces.idl +67 -0
  532. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptNotify.idl +66 -0
  533. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptable.idl +183 -0
  534. data/vendor/tracemonkey/xpconnect/idl/nsIXPCSecurityManager.idl +114 -0
  535. data/vendor/tracemonkey/xpconnect/idl/nsIXPConnect.idl +819 -0
  536. data/vendor/tracemonkey/xpconnect/idl/xpcIJSModuleLoader.idl +95 -0
  537. data/vendor/tracemonkey/xpconnect/idl/xpcIJSWeakReference.idl +49 -0
  538. data/vendor/tracemonkey/xpconnect/idl/xpccomponents.idl +254 -0
  539. data/vendor/tracemonkey/xpconnect/idl/xpcexception.idl +66 -0
  540. data/vendor/tracemonkey/xpconnect/idl/xpcjsid.idl +83 -0
  541. data/vendor/tracemonkey/xpconnect/loader/ISO8601DateUtils.jsm +176 -0
  542. data/vendor/tracemonkey/xpconnect/loader/Makefile.in +63 -0
  543. data/vendor/tracemonkey/xpconnect/loader/XPCOMUtils.jsm +267 -0
  544. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.cpp +1717 -0
  545. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.h +172 -0
  546. data/vendor/tracemonkey/xpconnect/loader/mozJSLoaderConstructors.h +101 -0
  547. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.cpp +360 -0
  548. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.h +66 -0
  549. data/vendor/tracemonkey/xpconnect/public/Makefile.in +54 -0
  550. data/vendor/tracemonkey/xpconnect/public/nsAXPCNativeCallContext.h +89 -0
  551. data/vendor/tracemonkey/xpconnect/public/nsAutoJSValHolder.h +168 -0
  552. data/vendor/tracemonkey/xpconnect/public/xpc_map_end.h +327 -0
  553. data/vendor/tracemonkey/xpconnect/sample/Makefile.in +71 -0
  554. data/vendor/tracemonkey/xpconnect/sample/README +39 -0
  555. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.cpp +337 -0
  556. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.idl +82 -0
  557. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.js +21 -0
  558. data/vendor/tracemonkey/xpconnect/shell/Makefile.in +106 -0
  559. data/vendor/tracemonkey/xpconnect/shell/jsshell.msg +50 -0
  560. data/vendor/tracemonkey/xpconnect/shell/xpcshell.cpp +1817 -0
  561. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.h +43 -0
  562. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.mm +54 -0
  563. data/vendor/tracemonkey/xpconnect/src/Makefile.in +228 -0
  564. data/vendor/tracemonkey/xpconnect/src/README +3 -0
  565. data/vendor/tracemonkey/xpconnect/src/XPCCrossOriginWrapper.cpp +1186 -0
  566. data/vendor/tracemonkey/xpconnect/src/XPCDispConvert.cpp +593 -0
  567. data/vendor/tracemonkey/xpconnect/src/XPCDispInlines.h +667 -0
  568. data/vendor/tracemonkey/xpconnect/src/XPCDispInterface.cpp +383 -0
  569. data/vendor/tracemonkey/xpconnect/src/XPCDispObject.cpp +516 -0
  570. data/vendor/tracemonkey/xpconnect/src/XPCDispParamPropJSClass.cpp +223 -0
  571. data/vendor/tracemonkey/xpconnect/src/XPCDispParams.cpp +103 -0
  572. data/vendor/tracemonkey/xpconnect/src/XPCDispPrivate.h +1401 -0
  573. data/vendor/tracemonkey/xpconnect/src/XPCDispTearOff.cpp +547 -0
  574. data/vendor/tracemonkey/xpconnect/src/XPCDispTypeInfo.cpp +471 -0
  575. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchClassInfo.cpp +139 -0
  576. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchExtension.cpp +362 -0
  577. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.cpp +1350 -0
  578. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.h +88 -0
  579. data/vendor/tracemonkey/xpconnect/src/XPCSafeJSObjectWrapper.cpp +1148 -0
  580. data/vendor/tracemonkey/xpconnect/src/XPCSystemOnlyWrapper.cpp +718 -0
  581. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.cpp +850 -0
  582. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.h +394 -0
  583. data/vendor/tracemonkey/xpconnect/src/dom_quickstubs.qsconf +568 -0
  584. data/vendor/tracemonkey/xpconnect/src/nsDispatchSupport.cpp +348 -0
  585. data/vendor/tracemonkey/xpconnect/src/nsScriptError.cpp +201 -0
  586. data/vendor/tracemonkey/xpconnect/src/nsXPConnect.cpp +2609 -0
  587. data/vendor/tracemonkey/xpconnect/src/qsgen.py +1487 -0
  588. data/vendor/tracemonkey/xpconnect/src/xpc.msg +217 -0
  589. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.cpp +148 -0
  590. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.h +56 -0
  591. data/vendor/tracemonkey/xpconnect/src/xpccallcontext.cpp +579 -0
  592. data/vendor/tracemonkey/xpconnect/src/xpccomponents.cpp +4144 -0
  593. data/vendor/tracemonkey/xpconnect/src/xpccontext.cpp +115 -0
  594. data/vendor/tracemonkey/xpconnect/src/xpcconvert.cpp +2298 -0
  595. data/vendor/tracemonkey/xpconnect/src/xpcdebug.cpp +481 -0
  596. data/vendor/tracemonkey/xpconnect/src/xpcexception.cpp +502 -0
  597. data/vendor/tracemonkey/xpconnect/src/xpcforwards.h +114 -0
  598. data/vendor/tracemonkey/xpconnect/src/xpcinlines.h +772 -0
  599. data/vendor/tracemonkey/xpconnect/src/xpcjsid.cpp +1025 -0
  600. data/vendor/tracemonkey/xpconnect/src/xpcjsruntime.cpp +1342 -0
  601. data/vendor/tracemonkey/xpconnect/src/xpclog.cpp +128 -0
  602. data/vendor/tracemonkey/xpconnect/src/xpclog.h +101 -0
  603. data/vendor/tracemonkey/xpconnect/src/xpcmaps.cpp +761 -0
  604. data/vendor/tracemonkey/xpconnect/src/xpcmaps.h +713 -0
  605. data/vendor/tracemonkey/xpconnect/src/xpcmodule.cpp +136 -0
  606. data/vendor/tracemonkey/xpconnect/src/xpcprivate.h +4138 -0
  607. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.cpp +1128 -0
  608. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.h +480 -0
  609. data/vendor/tracemonkey/xpconnect/src/xpcruntimesvc.cpp +179 -0
  610. data/vendor/tracemonkey/xpconnect/src/xpcstack.cpp +342 -0
  611. data/vendor/tracemonkey/xpconnect/src/xpcstring.cpp +139 -0
  612. data/vendor/tracemonkey/xpconnect/src/xpcthreadcontext.cpp +599 -0
  613. data/vendor/tracemonkey/xpconnect/src/xpcthrower.cpp +399 -0
  614. data/vendor/tracemonkey/xpconnect/src/xpcvariant.cpp +850 -0
  615. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjs.cpp +670 -0
  616. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjsclass.cpp +2015 -0
  617. data/vendor/tracemonkey/xpconnect/src/xpcwrappednative.cpp +3482 -0
  618. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeinfo.cpp +945 -0
  619. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativejsops.cpp +2003 -0
  620. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeproto.cpp +302 -0
  621. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativescope.cpp +991 -0
  622. data/vendor/tracemonkey/xpconnect/tests/Makefile.in +75 -0
  623. data/vendor/tracemonkey/xpconnect/tests/TestXPC.cpp +785 -0
  624. data/vendor/tracemonkey/xpconnect/tests/chrome/Makefile.in +51 -0
  625. data/vendor/tracemonkey/xpconnect/tests/chrome/test_bug500931.xul +43 -0
  626. data/vendor/tracemonkey/xpconnect/tests/components/Makefile.in +85 -0
  627. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_array.cpp +388 -0
  628. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_attributes.cpp +305 -0
  629. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_calljs.cpp +135 -0
  630. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_child.cpp +225 -0
  631. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_const.cpp +76 -0
  632. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_domstring.cpp +118 -0
  633. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_echo.cpp +616 -0
  634. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_in.cpp +204 -0
  635. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_inout.cpp +171 -0
  636. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_module.cpp +77 -0
  637. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_multiple.cpp +554 -0
  638. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_noisy.cpp +154 -0
  639. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_out.cpp +335 -0
  640. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_overloaded.cpp +250 -0
  641. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_private.h +192 -0
  642. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_string.cpp +185 -0
  643. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_variant.cpp +355 -0
  644. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.cpp +12 -0
  645. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.h +28 -0
  646. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCDispUtilities.h +28 -0
  647. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.cpp +86 -0
  648. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.def +9 -0
  649. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsp +318 -0
  650. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsw +29 -0
  651. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.idl +454 -0
  652. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.rc +145 -0
  653. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.cpp +44 -0
  654. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.h +56 -0
  655. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.rgs +23 -0
  656. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.cpp +221 -0
  657. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.h +53 -0
  658. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.rgs +23 -0
  659. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.cpp +699 -0
  660. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.h +138 -0
  661. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.rgs +23 -0
  662. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.cpp +23 -0
  663. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.h +41 -0
  664. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.rgs +23 -0
  665. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.cpp +256 -0
  666. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.h +88 -0
  667. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.rgs +23 -0
  668. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.cpp +23 -0
  669. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.h +43 -0
  670. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.rgs +23 -0
  671. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.cpp +29 -0
  672. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.h +45 -0
  673. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.rgs +23 -0
  674. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.cpp +177 -0
  675. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.h +50 -0
  676. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.rgs +23 -0
  677. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/resource.h +36 -0
  678. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Arrays/XPCIDispatchArrayTests.js +54 -0
  679. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Attributes/XPCIDispatchAttributeTests.js +150 -0
  680. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCIDispatchInstantiations.js +122 -0
  681. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCStress.js +58 -0
  682. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Methods/XPCIDispatchMethodTests.js +376 -0
  683. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/shell.js +377 -0
  684. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/General/XPCIDispatchTestWrappedJS.js +76 -0
  685. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/shell.js +377 -0
  686. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/exectests.cmd +1 -0
  687. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/jsDriver.pl +1288 -0
  688. data/vendor/tracemonkey/xpconnect/tests/idl/Makefile.in +61 -0
  689. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest.idl +312 -0
  690. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest2.idl +51 -0
  691. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_attributes.idl +67 -0
  692. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_calljs.idl +59 -0
  693. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_const.idl +61 -0
  694. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_domstring.idl +59 -0
  695. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_in.idl +88 -0
  696. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_inout.idl +86 -0
  697. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_multiple.idl +77 -0
  698. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_out.idl +142 -0
  699. data/vendor/tracemonkey/xpconnect/tests/js/checkid.js +82 -0
  700. data/vendor/tracemonkey/xpconnect/tests/js/evaluate.js +311 -0
  701. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-2.js +153 -0
  702. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-3.js +194 -0
  703. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-4.js +297 -0
  704. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-5.js +343 -0
  705. data/vendor/tracemonkey/xpconnect/tests/js/exceptions.js +230 -0
  706. data/vendor/tracemonkey/xpconnect/tests/js/javascript.js +96 -0
  707. data/vendor/tracemonkey/xpconnect/tests/js/multiple-2.js +151 -0
  708. data/vendor/tracemonkey/xpconnect/tests/js/multiple-3.js +148 -0
  709. data/vendor/tracemonkey/xpconnect/tests/js/multiple-4.js +152 -0
  710. data/vendor/tracemonkey/xpconnect/tests/js/multiple.js +137 -0
  711. data/vendor/tracemonkey/xpconnect/tests/js/notscriptable.js +104 -0
  712. data/vendor/tracemonkey/xpconnect/tests/js/old/simpletest.js +36 -0
  713. data/vendor/tracemonkey/xpconnect/tests/js/old/speed.js +60 -0
  714. data/vendor/tracemonkey/xpconnect/tests/js/old/testxpc.js +464 -0
  715. data/vendor/tracemonkey/xpconnect/tests/js/old/threads.js +74 -0
  716. data/vendor/tracemonkey/xpconnect/tests/js/old/try.js +27 -0
  717. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_array.js +308 -0
  718. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_callcontext.js +68 -0
  719. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_echo.js +636 -0
  720. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_and_sort.js +28 -0
  721. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_constants.js +15 -0
  722. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_create.js +200 -0
  723. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_exceptions.js +167 -0
  724. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_ids.js +135 -0
  725. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_observer.js +36 -0
  726. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_overloaded.js +14 -0
  727. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_primitives.js +141 -0
  728. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_propertybag.js +36 -0
  729. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant.js +339 -0
  730. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant_array.js +30 -0
  731. data/vendor/tracemonkey/xpconnect/tests/js/readonlyattributes.js +74 -0
  732. data/vendor/tracemonkey/xpconnect/tests/js/readwriteattributes.js +101 -0
  733. data/vendor/tracemonkey/xpconnect/tests/js/scriptable.js +120 -0
  734. data/vendor/tracemonkey/xpconnect/tests/js/testin.js +203 -0
  735. data/vendor/tracemonkey/xpconnect/tests/js/xpcfun.js +234 -0
  736. data/vendor/tracemonkey/xpconnect/tests/js/xpctest_primitives.js +200 -0
  737. data/vendor/tracemonkey/xpconnect/tests/mochitest/Makefile.in +66 -0
  738. data/vendor/tracemonkey/xpconnect/tests/mochitest/bug500931_helper.html +7 -0
  739. data/vendor/tracemonkey/xpconnect/tests/mochitest/inner.html +7 -0
  740. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug361111.xul +29 -0
  741. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug384632.html +32 -0
  742. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug390488.html +65 -0
  743. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug393269.html +46 -0
  744. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug396851.html +43 -0
  745. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug428021.html +41 -0
  746. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug446584.html +49 -0
  747. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug448587.html +31 -0
  748. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug462428.html +42 -0
  749. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug478438.html +66 -0
  750. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484107.html +100 -0
  751. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484459.html +36 -0
  752. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug500691.html +28 -0
  753. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_wrappers.html +116 -0
  754. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_element_type.jsm +1 -0
  755. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_exports_type.jsm +1 -0
  756. data/vendor/tracemonkey/xpconnect/tests/unit/bug451678_subscript.js +2 -0
  757. data/vendor/tracemonkey/xpconnect/tests/unit/component_import.js +144 -0
  758. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importA.jsm +44 -0
  759. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importB.jsm +45 -0
  760. data/vendor/tracemonkey/xpconnect/tests/unit/syntax_error.jsm +1 -0
  761. data/vendor/tracemonkey/xpconnect/tests/unit/test_bogus_files.js +88 -0
  762. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug408412.js +51 -0
  763. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug451678.js +52 -0
  764. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug_442086.js +68 -0
  765. data/vendor/tracemonkey/xpconnect/tests/unit/test_import.js +127 -0
  766. data/vendor/tracemonkey/xpconnect/tests/unit/test_js_weak_references.js +63 -0
  767. data/vendor/tracemonkey/xpconnect/tests/unit/test_recursive_import.js +62 -0
  768. data/vendor/tracemonkey/xpconnect/tools/Makefile.in +49 -0
  769. data/vendor/tracemonkey/xpconnect/tools/idl/Makefile.in +53 -0
  770. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsCompiler.idl +60 -0
  771. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsProfiler.idl +57 -0
  772. data/vendor/tracemonkey/xpconnect/tools/js/CompileJSFiles.js +28 -0
  773. data/vendor/tracemonkey/xpconnect/tools/js/ListJSFiles.js +18 -0
  774. data/vendor/tracemonkey/xpconnect/tools/src/Makefile.in +76 -0
  775. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsCompiler.cpp +161 -0
  776. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsModule.cpp +65 -0
  777. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsProfiler.cpp +370 -0
  778. data/vendor/tracemonkey/xpconnect/tools/src/xpctools_private.h +236 -0
  779. metadata +782 -107
  780. data/test/johnson/nodes/export_test.rb +0 -9
  781. data/test/johnson/nodes/import_test.rb +0 -13
  782. data/test/johnson/version_test.rb +0 -13
@@ -0,0 +1,119 @@
1
+ // regression test for Bug 452008 - TM: SRP in Clipperz crypto library fails when JIT (TraceMonkey) is enabled.
2
+
3
+ var x = [9385, 32112, 25383, 16317, 30138, 14565, 17812, 24500, 2719, 30174, 3546, 9096, 15352, 19120, 20648, 14334, 7426, 0, 0, 0];
4
+ var n = [27875, 25925, 30422, 12227, 27798, 32170, 10873, 21748, 30629, 26296, 20697, 5125, 4815, 2221, 14392, 23369, 5560, 2, 0, 0];
5
+ var np = 18229;
6
+ var expected = [18770, 31456, 17999, 32635, 27508, 29131, 2856, 16233, 5439, 27580, 7093, 18192, 30804, 5472, 8529, 28649, 14852, 0, 0, 0];
7
+
8
+ //globals
9
+ bpe=0; //bits stored per array element
10
+ mask=0; //AND this with an array element to chop it down to bpe bits
11
+
12
+ //initialize the global variables
13
+ for (bpe=0; (1<<(bpe+1)) > (1<<bpe); bpe++); //bpe=number of bits in the mantissa on this platform
14
+ bpe>>=1; //bpe=number of bits in one element of the array representing the bigInt
15
+ mask=(1<<bpe)-1; //AND the mask with an integer to get its bpe least significant bits
16
+
17
+
18
+ //the following global variables are scratchpad memory to
19
+ //reduce dynamic memory allocation in the inner loop
20
+ sa = new Array(0); //used in mont_()
21
+
22
+ //do x=y on bigInts x and y. x must be an array at least as big as y (not counting the leading zeros in y).
23
+ function copy_(x,y) {
24
+ var i;
25
+ var k=x.length<y.length ? x.length : y.length;
26
+ for (i=0;i<k;i++)
27
+ x[i]=y[i];
28
+ for (i=k;i<x.length;i++)
29
+ x[i]=0;
30
+ }
31
+
32
+ //do x=y on bigInt x and integer y.
33
+ function copyInt_(x,n) {
34
+ var i,c;
35
+ for (c=n,i=0;i<x.length;i++) {
36
+ x[i]=c & mask;
37
+ c>>=bpe;
38
+ }
39
+ }
40
+
41
+ //is x > y? (x and y both nonnegative)
42
+ function greater(x,y) {
43
+ var i;
44
+ var k=(x.length<y.length) ? x.length : y.length;
45
+
46
+ for (i=x.length;i<y.length;i++)
47
+ if (y[i])
48
+ return 0; //y has more digits
49
+
50
+ for (i=y.length;i<x.length;i++)
51
+ if (x[i])
52
+ return 1; //x has more digits
53
+
54
+ for (i=k-1;i>=0;i--)
55
+ if (x[i]>y[i])
56
+ return 1;
57
+ else if (x[i]<y[i])
58
+ return 0;
59
+ return 0;
60
+ }
61
+
62
+
63
+ //do x=x*y*Ri mod n for bigInts x,y,n,
64
+ // where Ri = 2**(-kn*bpe) mod n, and kn is the
65
+ // number of elements in the n array, not
66
+ // counting leading zeros.
67
+ //x must be large enough to hold the answer.
68
+ //It's OK if x and y are the same variable.
69
+ //must have:
70
+ // x,y < n
71
+ // n is odd
72
+ // np = -(n^(-1)) mod radix
73
+ function mont_(x,y,n,np) {
74
+ var i,j,c,ui,t;
75
+ var kn=n.length;
76
+ var ky=y.length;
77
+
78
+ if (sa.length!=kn)
79
+ sa=new Array(kn);
80
+
81
+ for (;kn>0 && n[kn-1]==0;kn--); //ignore leading zeros of n
82
+ for (;ky>0 && y[ky-1]==0;ky--); //ignore leading zeros of y
83
+
84
+ copyInt_(sa,0);
85
+
86
+ //the following loop consumes 95% of the runtime for randTruePrime_() and powMod_() for large keys
87
+ for (i=0; i<kn; i++) {
88
+ t=sa[0]+x[i]*y[0];
89
+ ui=((t & mask) * np) & mask; //the inner "& mask" is needed on Macintosh MSIE, but not windows MSIE
90
+ c=(t+ui*n[0]) >> bpe;
91
+ t=x[i];
92
+
93
+ //do sa=(sa+x[i]*y+ui*n)/b where b=2**bpe
94
+ for (j=1;j<ky;j++) {
95
+ c+=sa[j]+t*y[j]+ui*n[j];
96
+ sa[j-1]=c & mask;
97
+ c>>=bpe;
98
+ }
99
+ for (;j<kn;j++) {
100
+ c+=sa[j]+ui*n[j];
101
+ sa[j-1]=c & mask;
102
+ c>>=bpe;
103
+ }
104
+ sa[j-1]=c & mask;
105
+ }
106
+
107
+ if (!greater(n,sa))
108
+ sub_(sa,n);
109
+ copy_(x,sa);
110
+ }
111
+
112
+ mont_(x, x, n, np);
113
+
114
+ var passed = expected.length == x.length;
115
+ for (var i = 0; i < expected.length; i++) {
116
+ if (passed)
117
+ passed = expected[i] == x[i];
118
+ }
119
+ print(passed);
@@ -0,0 +1,3335 @@
1
+ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
2
+ /****************************************************************
3
+ *
4
+ * The author of this software is David M. Gay.
5
+ *
6
+ * Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
7
+ *
8
+ * Permission to use, copy, modify, and distribute this software for any
9
+ * purpose without fee is hereby granted, provided that this entire notice
10
+ * is included in all copies of any software which is or includes a copy
11
+ * or modification of this software and in all copies of the supporting
12
+ * documentation for such software.
13
+ *
14
+ * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
15
+ * WARRANTY. IN PARTICULAR, NEITHER THE AUTHOR NOR LUCENT MAKES ANY
16
+ * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
17
+ * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
18
+ *
19
+ ***************************************************************/
20
+
21
+ /* Please send bug reports to David M. Gay (dmg at acm dot org,
22
+ * with " at " changed at "@" and " dot " changed to "."). */
23
+
24
+ /* On a machine with IEEE extended-precision registers, it is
25
+ * necessary to specify double-precision (53-bit) rounding precision
26
+ * before invoking strtod or dtoa. If the machine uses (the equivalent
27
+ * of) Intel 80x87 arithmetic, the call
28
+ * _control87(PC_53, MCW_PC);
29
+ * does this with many compilers. Whether this or another call is
30
+ * appropriate depends on the compiler; for this to work, it may be
31
+ * necessary to #include "float.h" or another system-dependent header
32
+ * file.
33
+ */
34
+
35
+ /* strtod for IEEE-, VAX-, and IBM-arithmetic machines.
36
+ *
37
+ * This strtod returns a nearest machine number to the input decimal
38
+ * string (or sets errno to ERANGE). With IEEE arithmetic, ties are
39
+ * broken by the IEEE round-even rule. Otherwise ties are broken by
40
+ * biased rounding (add half and chop).
41
+ *
42
+ * Inspired loosely by William D. Clinger's paper "How to Read Floating
43
+ * Point Numbers Accurately" [Proc. ACM SIGPLAN '90, pp. 92-101].
44
+ *
45
+ * Modifications:
46
+ *
47
+ * 1. We only require IEEE, IBM, or VAX double-precision
48
+ * arithmetic (not IEEE double-extended).
49
+ * 2. We get by with floating-point arithmetic in a case that
50
+ * Clinger missed -- when we're computing d * 10^n
51
+ * for a small integer d and the integer n is not too
52
+ * much larger than 22 (the maximum integer k for which
53
+ * we can represent 10^k exactly), we may be able to
54
+ * compute (d*10^k) * 10^(e-k) with just one roundoff.
55
+ * 3. Rather than a bit-at-a-time adjustment of the binary
56
+ * result in the hard case, we use floating-point
57
+ * arithmetic to determine the adjustment to within
58
+ * one bit; only in really hard cases do we need to
59
+ * compute a second residual.
60
+ * 4. Because of 3., we don't need a large table of powers of 10
61
+ * for ten-to-e (just some small tables, e.g. of 10^k
62
+ * for 0 <= k <= 22).
63
+ */
64
+
65
+ /*
66
+ * #define IEEE_8087 for IEEE-arithmetic machines where the least
67
+ * significant byte has the lowest address.
68
+ * #define IEEE_MC68k for IEEE-arithmetic machines where the most
69
+ * significant byte has the lowest address.
70
+ * #define Long int on machines with 32-bit ints and 64-bit longs.
71
+ * #define IBM for IBM mainframe-style floating-point arithmetic.
72
+ * #define VAX for VAX-style floating-point arithmetic (D_floating).
73
+ * #define No_leftright to omit left-right logic in fast floating-point
74
+ * computation of dtoa.
75
+ * #define Honor_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3
76
+ * and strtod and dtoa should round accordingly.
77
+ * #define Check_FLT_ROUNDS if FLT_ROUNDS can assume the values 2 or 3
78
+ * and Honor_FLT_ROUNDS is not #defined.
79
+ * #define RND_PRODQUOT to use rnd_prod and rnd_quot (assembly routines
80
+ * that use extended-precision instructions to compute rounded
81
+ * products and quotients) with IBM.
82
+ * #define ROUND_BIASED for IEEE-format with biased rounding.
83
+ * #define Inaccurate_Divide for IEEE-format with correctly rounded
84
+ * products but inaccurate quotients, e.g., for Intel i860.
85
+ * #define NO_LONG_LONG on machines that do not have a "long long"
86
+ * integer type (of >= 64 bits). On such machines, you can
87
+ * #define Just_16 to store 16 bits per 32-bit Long when doing
88
+ * high-precision integer arithmetic. Whether this speeds things
89
+ * up or slows things down depends on the machine and the number
90
+ * being converted. If long long is available and the name is
91
+ * something other than "long long", #define Llong to be the name,
92
+ * and if "unsigned Llong" does not work as an unsigned version of
93
+ * Llong, #define #ULLong to be the corresponding unsigned type.
94
+ * #define KR_headers for old-style C function headers.
95
+ * #define Bad_float_h if your system lacks a float.h or if it does not
96
+ * define some or all of DBL_DIG, DBL_MAX_10_EXP, DBL_MAX_EXP,
97
+ * FLT_RADIX, FLT_ROUNDS, and DBL_MAX.
98
+ * #define MALLOC your_malloc, where your_malloc(n) acts like malloc(n)
99
+ * if memory is available and otherwise does something you deem
100
+ * appropriate. If MALLOC is undefined, malloc will be invoked
101
+ * directly -- and assumed always to succeed. Similarly, if you
102
+ * want something other than the system's free() to be called to
103
+ * recycle memory acquired from MALLOC, #define FREE to be the
104
+ * name of the alternate routine. (FREE or free is only called in
105
+ * pathological cases, e.g., in a dtoa call after a dtoa return in
106
+ * mode 3 with thousands of digits requested.)
107
+ * #define Omit_Private_Memory to omit logic (added Jan. 1998) for making
108
+ * memory allocations from a private pool of memory when possible.
109
+ * When used, the private pool is PRIVATE_MEM bytes long: 2304 bytes,
110
+ * unless #defined to be a different length. This default length
111
+ * suffices to get rid of MALLOC calls except for unusual cases,
112
+ * such as decimal-to-binary conversion of a very long string of
113
+ * digits. The longest string dtoa can return is about 751 bytes
114
+ * long. For conversions by strtod of strings of 800 digits and
115
+ * all dtoa conversions in single-threaded executions with 8-byte
116
+ * pointers, PRIVATE_MEM >= 7400 appears to suffice; with 4-byte
117
+ * pointers, PRIVATE_MEM >= 7112 appears adequate.
118
+ * #define NO_INFNAN_CHECK if you do not wish to have INFNAN_CHECK
119
+ * #defined automatically on IEEE systems. On such systems,
120
+ * when INFNAN_CHECK is #defined, strtod checks
121
+ * for Infinity and NaN (case insensitively). On some systems
122
+ * (e.g., some HP systems), it may be necessary to #define NAN_WORD0
123
+ * appropriately -- to the most significant word of a quiet NaN.
124
+ * (On HP Series 700/800 machines, -DNAN_WORD0=0x7ff40000 works.)
125
+ * When INFNAN_CHECK is #defined and No_Hex_NaN is not #defined,
126
+ * strtod also accepts (case insensitively) strings of the form
127
+ * NaN(x), where x is a string of hexadecimal digits and spaces;
128
+ * if there is only one string of hexadecimal digits, it is taken
129
+ * for the 52 fraction bits of the resulting NaN; if there are two
130
+ * or more strings of hex digits, the first is for the high 20 bits,
131
+ * the second and subsequent for the low 32 bits, with intervening
132
+ * white space ignored; but if this results in none of the 52
133
+ * fraction bits being on (an IEEE Infinity symbol), then NAN_WORD0
134
+ * and NAN_WORD1 are used instead.
135
+ * #define MULTIPLE_THREADS if the system offers preemptively scheduled
136
+ * multiple threads. In this case, you must provide (or suitably
137
+ * #define) two locks, acquired by ACQUIRE_DTOA_LOCK(n) and freed
138
+ * by FREE_DTOA_LOCK(n) for n = 0 or 1. (The second lock, accessed
139
+ * in pow5mult, ensures lazy evaluation of only one copy of high
140
+ * powers of 5; omitting this lock would introduce a small
141
+ * probability of wasting memory, but would otherwise be harmless.)
142
+ * You must also invoke freedtoa(s) to free the value s returned by
143
+ * dtoa. You may do so whether or not MULTIPLE_THREADS is #defined.
144
+ * #define NO_IEEE_Scale to disable new (Feb. 1997) logic in strtod that
145
+ * avoids underflows on inputs whose result does not underflow.
146
+ * If you #define NO_IEEE_Scale on a machine that uses IEEE-format
147
+ * floating-point numbers and flushes underflows to zero rather
148
+ * than implementing gradual underflow, then you must also #define
149
+ * Sudden_Underflow.
150
+ * #define USE_LOCALE to use the current locale's decimal_point value.
151
+ * #define SET_INEXACT if IEEE arithmetic is being used and extra
152
+ * computation should be done to set the inexact flag when the
153
+ * result is inexact and avoid setting inexact when the result
154
+ * is exact. In this case, dtoa.c must be compiled in
155
+ * an environment, perhaps provided by #include "dtoa.c" in a
156
+ * suitable wrapper, that defines two functions,
157
+ * int get_inexact(void);
158
+ * void clear_inexact(void);
159
+ * such that get_inexact() returns a nonzero value if the
160
+ * inexact bit is already set, and clear_inexact() sets the
161
+ * inexact bit to 0. When SET_INEXACT is #defined, strtod
162
+ * also does extra computations to set the underflow and overflow
163
+ * flags when appropriate (i.e., when the result is tiny and
164
+ * inexact or when it is a numeric value rounded to +-infinity).
165
+ * #define NO_ERRNO if strtod should not assign errno = ERANGE when
166
+ * the result overflows to +-Infinity or underflows to 0.
167
+ */
168
+
169
+ #ifndef Long
170
+ #define Long long
171
+ #endif
172
+ #ifndef ULong
173
+ typedef unsigned Long ULong;
174
+ #endif
175
+
176
+ #ifdef DEBUG
177
+ #include "stdio.h"
178
+ #define Bug(x) {fprintf(stderr, "%s\n", x); exit(1);}
179
+ #endif
180
+
181
+ #include "stdlib.h"
182
+ #include "string.h"
183
+
184
+ #ifdef USE_LOCALE
185
+ #include "locale.h"
186
+ #endif
187
+
188
+ #ifdef MALLOC
189
+ #ifdef KR_headers
190
+ extern char *MALLOC();
191
+ #else
192
+ extern void *MALLOC(size_t);
193
+ #endif
194
+ #else
195
+ #define MALLOC malloc
196
+ #endif
197
+
198
+ #ifndef Omit_Private_Memory
199
+ #ifndef PRIVATE_MEM
200
+ #define PRIVATE_MEM 2304
201
+ #endif
202
+ #define PRIVATE_mem ((PRIVATE_MEM+sizeof(double)-1)/sizeof(double))
203
+ static double private_mem[PRIVATE_mem], *pmem_next = private_mem;
204
+ #endif
205
+
206
+ #undef IEEE_Arith
207
+ #undef Avoid_Underflow
208
+ #ifdef IEEE_MC68k
209
+ #define IEEE_Arith
210
+ #endif
211
+ #ifdef IEEE_8087
212
+ #define IEEE_Arith
213
+ #endif
214
+
215
+ #ifdef IEEE_Arith
216
+ #ifndef NO_INFNAN_CHECK
217
+ #undef INFNAN_CHECK
218
+ #define INFNAN_CHECK
219
+ #endif
220
+ #else
221
+ #undef INFNAN_CHECK
222
+ #endif
223
+
224
+ #include "errno.h"
225
+
226
+ #ifdef Bad_float_h
227
+
228
+ #ifdef IEEE_Arith
229
+ #define DBL_DIG 15
230
+ #define DBL_MAX_10_EXP 308
231
+ #define DBL_MAX_EXP 1024
232
+ #define FLT_RADIX 2
233
+ #endif /*IEEE_Arith*/
234
+
235
+ #ifdef IBM
236
+ #define DBL_DIG 16
237
+ #define DBL_MAX_10_EXP 75
238
+ #define DBL_MAX_EXP 63
239
+ #define FLT_RADIX 16
240
+ #define DBL_MAX 7.2370055773322621e+75
241
+ #endif
242
+
243
+ #ifdef VAX
244
+ #define DBL_DIG 16
245
+ #define DBL_MAX_10_EXP 38
246
+ #define DBL_MAX_EXP 127
247
+ #define FLT_RADIX 2
248
+ #define DBL_MAX 1.7014118346046923e+38
249
+ #endif
250
+
251
+ #ifndef LONG_MAX
252
+ #define LONG_MAX 2147483647
253
+ #endif
254
+
255
+ #else /* ifndef Bad_float_h */
256
+ #include "float.h"
257
+ #endif /* Bad_float_h */
258
+
259
+ #ifndef __MATH_H__
260
+ #include "math.h"
261
+ #endif
262
+
263
+ #ifdef __cplusplus
264
+ extern "C" {
265
+ #endif
266
+
267
+ #ifndef CONST
268
+ #ifdef KR_headers
269
+ #define CONST /* blank */
270
+ #else
271
+ #define CONST const
272
+ #endif
273
+ #endif
274
+
275
+ #if defined(IEEE_8087) + defined(IEEE_MC68k) + defined(VAX) + defined(IBM) != 1
276
+ Exactly one of IEEE_8087, IEEE_MC68k, VAX, or IBM should be defined.
277
+ #endif
278
+
279
+ typedef union { double d; ULong L[2]; } U;
280
+
281
+ #define dval(x) ((x).d)
282
+ #ifdef IEEE_8087
283
+ #define word0(x) ((x).L[1])
284
+ #define word1(x) ((x).L[0])
285
+ #else
286
+ #define word0(x) ((x).L[0])
287
+ #define word1(x) ((x).L[1])
288
+ #endif
289
+
290
+ /* The following definition of Storeinc is appropriate for MIPS processors.
291
+ * An alternative that might be better on some machines is
292
+ * #define Storeinc(a,b,c) (*a++ = b << 16 | c & 0xffff)
293
+ */
294
+ #if defined(IEEE_8087) + defined(VAX)
295
+ #define Storeinc(a,b,c) (((unsigned short *)a)[1] = (unsigned short)b, \
296
+ ((unsigned short *)a)[0] = (unsigned short)c, a++)
297
+ #else
298
+ #define Storeinc(a,b,c) (((unsigned short *)a)[0] = (unsigned short)b, \
299
+ ((unsigned short *)a)[1] = (unsigned short)c, a++)
300
+ #endif
301
+
302
+ /* #define P DBL_MANT_DIG */
303
+ /* Ten_pmax = floor(P*log(2)/log(5)) */
304
+ /* Bletch = (highest power of 2 < DBL_MAX_10_EXP) / 16 */
305
+ /* Quick_max = floor((P-1)*log(FLT_RADIX)/log(10) - 1) */
306
+ /* Int_max = floor(P*log(FLT_RADIX)/log(10) - 1) */
307
+
308
+ #ifdef IEEE_Arith
309
+ #define Exp_shift 20
310
+ #define Exp_shift1 20
311
+ #define Exp_msk1 0x100000
312
+ #define Exp_msk11 0x100000
313
+ #define Exp_mask 0x7ff00000
314
+ #define P 53
315
+ #define Bias 1023
316
+ #define Emin (-1022)
317
+ #define Exp_1 0x3ff00000
318
+ #define Exp_11 0x3ff00000
319
+ #define Ebits 11
320
+ #define Frac_mask 0xfffff
321
+ #define Frac_mask1 0xfffff
322
+ #define Ten_pmax 22
323
+ #define Bletch 0x10
324
+ #define Bndry_mask 0xfffff
325
+ #define Bndry_mask1 0xfffff
326
+ #define LSB 1
327
+ #define Sign_bit 0x80000000
328
+ #define Log2P 1
329
+ #define Tiny0 0
330
+ #define Tiny1 1
331
+ #define Quick_max 14
332
+ #define Int_max 14
333
+ #ifndef NO_IEEE_Scale
334
+ #define Avoid_Underflow
335
+ #ifdef Flush_Denorm /* debugging option */
336
+ #undef Sudden_Underflow
337
+ #endif
338
+ #endif
339
+
340
+ #ifndef Flt_Rounds
341
+ #ifdef FLT_ROUNDS
342
+ #define Flt_Rounds FLT_ROUNDS
343
+ #else
344
+ #define Flt_Rounds 1
345
+ #endif
346
+ #endif /*Flt_Rounds*/
347
+
348
+ #ifdef Honor_FLT_ROUNDS
349
+ #define Rounding rounding
350
+ #undef Check_FLT_ROUNDS
351
+ #define Check_FLT_ROUNDS
352
+ #else
353
+ #define Rounding Flt_Rounds
354
+ #endif
355
+
356
+ #else /* ifndef IEEE_Arith */
357
+ #undef Check_FLT_ROUNDS
358
+ #undef Honor_FLT_ROUNDS
359
+ #undef SET_INEXACT
360
+ #undef Sudden_Underflow
361
+ #define Sudden_Underflow
362
+ #ifdef IBM
363
+ #undef Flt_Rounds
364
+ #define Flt_Rounds 0
365
+ #define Exp_shift 24
366
+ #define Exp_shift1 24
367
+ #define Exp_msk1 0x1000000
368
+ #define Exp_msk11 0x1000000
369
+ #define Exp_mask 0x7f000000
370
+ #define P 14
371
+ #define Bias 65
372
+ #define Exp_1 0x41000000
373
+ #define Exp_11 0x41000000
374
+ #define Ebits 8 /* exponent has 7 bits, but 8 is the right value in b2d */
375
+ #define Frac_mask 0xffffff
376
+ #define Frac_mask1 0xffffff
377
+ #define Bletch 4
378
+ #define Ten_pmax 22
379
+ #define Bndry_mask 0xefffff
380
+ #define Bndry_mask1 0xffffff
381
+ #define LSB 1
382
+ #define Sign_bit 0x80000000
383
+ #define Log2P 4
384
+ #define Tiny0 0x100000
385
+ #define Tiny1 0
386
+ #define Quick_max 14
387
+ #define Int_max 15
388
+ #else /* VAX */
389
+ #undef Flt_Rounds
390
+ #define Flt_Rounds 1
391
+ #define Exp_shift 23
392
+ #define Exp_shift1 7
393
+ #define Exp_msk1 0x80
394
+ #define Exp_msk11 0x800000
395
+ #define Exp_mask 0x7f80
396
+ #define P 56
397
+ #define Bias 129
398
+ #define Exp_1 0x40800000
399
+ #define Exp_11 0x4080
400
+ #define Ebits 8
401
+ #define Frac_mask 0x7fffff
402
+ #define Frac_mask1 0xffff007f
403
+ #define Ten_pmax 24
404
+ #define Bletch 2
405
+ #define Bndry_mask 0xffff007f
406
+ #define Bndry_mask1 0xffff007f
407
+ #define LSB 0x10000
408
+ #define Sign_bit 0x8000
409
+ #define Log2P 1
410
+ #define Tiny0 0x80
411
+ #define Tiny1 0
412
+ #define Quick_max 15
413
+ #define Int_max 15
414
+ #endif /* IBM, VAX */
415
+ #endif /* IEEE_Arith */
416
+
417
+ #ifndef IEEE_Arith
418
+ #define ROUND_BIASED
419
+ #endif
420
+
421
+ #ifdef RND_PRODQUOT
422
+ #define rounded_product(a,b) a = rnd_prod(a, b)
423
+ #define rounded_quotient(a,b) a = rnd_quot(a, b)
424
+ #ifdef KR_headers
425
+ extern double rnd_prod(), rnd_quot();
426
+ #else
427
+ extern double rnd_prod(double, double), rnd_quot(double, double);
428
+ #endif
429
+ #else
430
+ #define rounded_product(a,b) a *= b
431
+ #define rounded_quotient(a,b) a /= b
432
+ #endif
433
+
434
+ #define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
435
+ #define Big1 0xffffffff
436
+
437
+ #ifndef Pack_32
438
+ #define Pack_32
439
+ #endif
440
+
441
+ #ifdef KR_headers
442
+ #define FFFFFFFF ((((unsigned long)0xffff)<<16)|(unsigned long)0xffff)
443
+ #else
444
+ #define FFFFFFFF 0xffffffffUL
445
+ #endif
446
+
447
+ #ifdef NO_LONG_LONG
448
+ #undef ULLong
449
+ #ifdef Just_16
450
+ #undef Pack_32
451
+ /* When Pack_32 is not defined, we store 16 bits per 32-bit Long.
452
+ * This makes some inner loops simpler and sometimes saves work
453
+ * during multiplications, but it often seems to make things slightly
454
+ * slower. Hence the default is now to store 32 bits per Long.
455
+ */
456
+ #endif
457
+ #else /* long long available */
458
+ #ifndef Llong
459
+ #define Llong long long
460
+ #endif
461
+ #ifndef ULLong
462
+ #define ULLong unsigned Llong
463
+ #endif
464
+ #endif /* NO_LONG_LONG */
465
+
466
+ #ifndef MULTIPLE_THREADS
467
+ #define ACQUIRE_DTOA_LOCK(n) /*nothing*/
468
+ #define FREE_DTOA_LOCK(n) /*nothing*/
469
+ #endif
470
+
471
+ #define Kmax 7
472
+
473
+ struct
474
+ Bigint {
475
+ struct Bigint *next;
476
+ int k, maxwds, sign, wds;
477
+ ULong x[1];
478
+ };
479
+
480
+ typedef struct Bigint Bigint;
481
+
482
+ static Bigint *freelist[Kmax+1];
483
+
484
+ static Bigint *
485
+ Balloc
486
+ #ifdef KR_headers
487
+ (k) int k;
488
+ #else
489
+ (int k)
490
+ #endif
491
+ {
492
+ int x;
493
+ Bigint *rv;
494
+ #ifndef Omit_Private_Memory
495
+ size_t len;
496
+ #endif
497
+
498
+ ACQUIRE_DTOA_LOCK(0);
499
+ /* The k > Kmax case does not need ACQUIRE_DTOA_LOCK(0), */
500
+ /* but this case seems very unlikely. */
501
+ if (k <= Kmax && (rv = freelist[k]))
502
+ freelist[k] = rv->next;
503
+ else {
504
+ x = 1 << k;
505
+ #ifdef Omit_Private_Memory
506
+ rv = (Bigint *)MALLOC(sizeof(Bigint) + (x-1)*sizeof(ULong));
507
+ #else
508
+ len = (sizeof(Bigint) + (x-1)*sizeof(ULong) + sizeof(double) - 1)
509
+ /sizeof(double);
510
+ if (k <= Kmax && pmem_next - private_mem + len <= PRIVATE_mem) {
511
+ rv = (Bigint*)pmem_next;
512
+ pmem_next += len;
513
+ }
514
+ else
515
+ rv = (Bigint*)MALLOC(len*sizeof(double));
516
+ #endif
517
+ rv->k = k;
518
+ rv->maxwds = x;
519
+ }
520
+ FREE_DTOA_LOCK(0);
521
+ rv->sign = rv->wds = 0;
522
+ return rv;
523
+ }
524
+
525
+ static void
526
+ Bfree
527
+ #ifdef KR_headers
528
+ (v) Bigint *v;
529
+ #else
530
+ (Bigint *v)
531
+ #endif
532
+ {
533
+ if (v) {
534
+ if (v->k > Kmax)
535
+ #ifdef FREE
536
+ FREE((void*)v);
537
+ #else
538
+ free((void*)v);
539
+ #endif
540
+ else {
541
+ ACQUIRE_DTOA_LOCK(0);
542
+ v->next = freelist[v->k];
543
+ freelist[v->k] = v;
544
+ FREE_DTOA_LOCK(0);
545
+ }
546
+ }
547
+ }
548
+
549
+ #define Bcopy(x,y) memcpy((char *)&x->sign, (char *)&y->sign, \
550
+ y->wds*sizeof(Long) + 2*sizeof(int))
551
+
552
+ static Bigint *
553
+ multadd
554
+ #ifdef KR_headers
555
+ (b, m, a) Bigint *b; int m, a;
556
+ #else
557
+ (Bigint *b, int m, int a) /* multiply by m and add a */
558
+ #endif
559
+ {
560
+ int i, wds;
561
+ #ifdef ULLong
562
+ ULong *x;
563
+ ULLong carry, y;
564
+ #else
565
+ ULong carry, *x, y;
566
+ #ifdef Pack_32
567
+ ULong xi, z;
568
+ #endif
569
+ #endif
570
+ Bigint *b1;
571
+
572
+ wds = b->wds;
573
+ x = b->x;
574
+ i = 0;
575
+ carry = a;
576
+ do {
577
+ #ifdef ULLong
578
+ y = *x * (ULLong)m + carry;
579
+ carry = y >> 32;
580
+ *x++ = (ULong) y & FFFFFFFF;
581
+ #else
582
+ #ifdef Pack_32
583
+ xi = *x;
584
+ y = (xi & 0xffff) * m + carry;
585
+ z = (xi >> 16) * m + (y >> 16);
586
+ carry = z >> 16;
587
+ *x++ = (z << 16) + (y & 0xffff);
588
+ #else
589
+ y = *x * m + carry;
590
+ carry = y >> 16;
591
+ *x++ = y & 0xffff;
592
+ #endif
593
+ #endif
594
+ }
595
+ while(++i < wds);
596
+ if (carry) {
597
+ if (wds >= b->maxwds) {
598
+ b1 = Balloc(b->k+1);
599
+ Bcopy(b1, b);
600
+ Bfree(b);
601
+ b = b1;
602
+ }
603
+ b->x[wds++] = (ULong) carry;
604
+ b->wds = wds;
605
+ }
606
+ return b;
607
+ }
608
+
609
+ static Bigint *
610
+ s2b
611
+ #ifdef KR_headers
612
+ (s, nd0, nd, y9) CONST char *s; int nd0, nd; ULong y9;
613
+ #else
614
+ (CONST char *s, int nd0, int nd, ULong y9)
615
+ #endif
616
+ {
617
+ Bigint *b;
618
+ int i, k;
619
+ Long x, y;
620
+
621
+ x = (nd + 8) / 9;
622
+ for(k = 0, y = 1; x > y; y <<= 1, k++) ;
623
+ #ifdef Pack_32
624
+ b = Balloc(k);
625
+ b->x[0] = y9;
626
+ b->wds = 1;
627
+ #else
628
+ b = Balloc(k+1);
629
+ b->x[0] = y9 & 0xffff;
630
+ b->wds = (b->x[1] = y9 >> 16) ? 2 : 1;
631
+ #endif
632
+
633
+ i = 9;
634
+ if (9 < nd0) {
635
+ s += 9;
636
+ do b = multadd(b, 10, *s++ - '0');
637
+ while(++i < nd0);
638
+ s++;
639
+ }
640
+ else
641
+ s += 10;
642
+ for(; i < nd; i++)
643
+ b = multadd(b, 10, *s++ - '0');
644
+ return b;
645
+ }
646
+
647
+ static int
648
+ hi0bits
649
+ #ifdef KR_headers
650
+ (x) register ULong x;
651
+ #else
652
+ (register ULong x)
653
+ #endif
654
+ {
655
+ register int k = 0;
656
+
657
+ if (!(x & 0xffff0000)) {
658
+ k = 16;
659
+ x <<= 16;
660
+ }
661
+ if (!(x & 0xff000000)) {
662
+ k += 8;
663
+ x <<= 8;
664
+ }
665
+ if (!(x & 0xf0000000)) {
666
+ k += 4;
667
+ x <<= 4;
668
+ }
669
+ if (!(x & 0xc0000000)) {
670
+ k += 2;
671
+ x <<= 2;
672
+ }
673
+ if (!(x & 0x80000000)) {
674
+ k++;
675
+ if (!(x & 0x40000000))
676
+ return 32;
677
+ }
678
+ return k;
679
+ }
680
+
681
+ static int
682
+ lo0bits
683
+ #ifdef KR_headers
684
+ (y) ULong *y;
685
+ #else
686
+ (ULong *y)
687
+ #endif
688
+ {
689
+ register int k;
690
+ register ULong x = *y;
691
+
692
+ if (x & 7) {
693
+ if (x & 1)
694
+ return 0;
695
+ if (x & 2) {
696
+ *y = x >> 1;
697
+ return 1;
698
+ }
699
+ *y = x >> 2;
700
+ return 2;
701
+ }
702
+ k = 0;
703
+ if (!(x & 0xffff)) {
704
+ k = 16;
705
+ x >>= 16;
706
+ }
707
+ if (!(x & 0xff)) {
708
+ k += 8;
709
+ x >>= 8;
710
+ }
711
+ if (!(x & 0xf)) {
712
+ k += 4;
713
+ x >>= 4;
714
+ }
715
+ if (!(x & 0x3)) {
716
+ k += 2;
717
+ x >>= 2;
718
+ }
719
+ if (!(x & 1)) {
720
+ k++;
721
+ x >>= 1;
722
+ if (!x)
723
+ return 32;
724
+ }
725
+ *y = x;
726
+ return k;
727
+ }
728
+
729
+ static Bigint *
730
+ i2b
731
+ #ifdef KR_headers
732
+ (i) int i;
733
+ #else
734
+ (int i)
735
+ #endif
736
+ {
737
+ Bigint *b;
738
+
739
+ b = Balloc(1);
740
+ b->x[0] = i;
741
+ b->wds = 1;
742
+ return b;
743
+ }
744
+
745
+ static Bigint *
746
+ mult
747
+ #ifdef KR_headers
748
+ (a, b) Bigint *a, *b;
749
+ #else
750
+ (Bigint *a, Bigint *b)
751
+ #endif
752
+ {
753
+ Bigint *c;
754
+ int k, wa, wb, wc;
755
+ ULong *x, *xa, *xae, *xb, *xbe, *xc, *xc0;
756
+ ULong y;
757
+ #ifdef ULLong
758
+ ULLong carry, z;
759
+ #else
760
+ ULong carry, z;
761
+ #ifdef Pack_32
762
+ ULong z2;
763
+ #endif
764
+ #endif
765
+
766
+ if (a->wds < b->wds) {
767
+ c = a;
768
+ a = b;
769
+ b = c;
770
+ }
771
+ k = a->k;
772
+ wa = a->wds;
773
+ wb = b->wds;
774
+ wc = wa + wb;
775
+ if (wc > a->maxwds)
776
+ k++;
777
+ c = Balloc(k);
778
+ for(x = c->x, xa = x + wc; x < xa; x++)
779
+ *x = 0;
780
+ xa = a->x;
781
+ xae = xa + wa;
782
+ xb = b->x;
783
+ xbe = xb + wb;
784
+ xc0 = c->x;
785
+ #ifdef ULLong
786
+ for(; xb < xbe; xc0++) {
787
+ if ((y = *xb++)) {
788
+ x = xa;
789
+ xc = xc0;
790
+ carry = 0;
791
+ do {
792
+ z = *x++ * (ULLong)y + *xc + carry;
793
+ carry = z >> 32;
794
+ *xc++ = (ULong) z & FFFFFFFF;
795
+ }
796
+ while(x < xae);
797
+ *xc = (ULong) carry;
798
+ }
799
+ }
800
+ #else
801
+ #ifdef Pack_32
802
+ for(; xb < xbe; xb++, xc0++) {
803
+ if (y = *xb & 0xffff) {
804
+ x = xa;
805
+ xc = xc0;
806
+ carry = 0;
807
+ do {
808
+ z = (*x & 0xffff) * y + (*xc & 0xffff) + carry;
809
+ carry = z >> 16;
810
+ z2 = (*x++ >> 16) * y + (*xc >> 16) + carry;
811
+ carry = z2 >> 16;
812
+ Storeinc(xc, z2, z);
813
+ }
814
+ while(x < xae);
815
+ *xc = carry;
816
+ }
817
+ if (y = *xb >> 16) {
818
+ x = xa;
819
+ xc = xc0;
820
+ carry = 0;
821
+ z2 = *xc;
822
+ do {
823
+ z = (*x & 0xffff) * y + (*xc >> 16) + carry;
824
+ carry = z >> 16;
825
+ Storeinc(xc, z, z2);
826
+ z2 = (*x++ >> 16) * y + (*xc & 0xffff) + carry;
827
+ carry = z2 >> 16;
828
+ }
829
+ while(x < xae);
830
+ *xc = z2;
831
+ }
832
+ }
833
+ #else
834
+ for(; xb < xbe; xc0++) {
835
+ if (y = *xb++) {
836
+ x = xa;
837
+ xc = xc0;
838
+ carry = 0;
839
+ do {
840
+ z = *x++ * y + *xc + carry;
841
+ carry = z >> 16;
842
+ *xc++ = z & 0xffff;
843
+ }
844
+ while(x < xae);
845
+ *xc = carry;
846
+ }
847
+ }
848
+ #endif
849
+ #endif
850
+ for(xc0 = c->x, xc = xc0 + wc; wc > 0 && !*--xc; --wc) ;
851
+ c->wds = wc;
852
+ return c;
853
+ }
854
+
855
+ static Bigint *p5s;
856
+
857
+ static Bigint *
858
+ pow5mult
859
+ #ifdef KR_headers
860
+ (b, k) Bigint *b; int k;
861
+ #else
862
+ (Bigint *b, int k)
863
+ #endif
864
+ {
865
+ Bigint *b1, *p5, *p51;
866
+ int i;
867
+ static int p05[3] = { 5, 25, 125 };
868
+
869
+ if ((i = k & 3))
870
+ b = multadd(b, p05[i-1], 0);
871
+
872
+ if (!(k >>= 2))
873
+ return b;
874
+ if (!(p5 = p5s)) {
875
+ /* first time */
876
+ #ifdef MULTIPLE_THREADS
877
+ ACQUIRE_DTOA_LOCK(1);
878
+ if (!(p5 = p5s)) {
879
+ p5 = p5s = i2b(625);
880
+ p5->next = 0;
881
+ }
882
+ FREE_DTOA_LOCK(1);
883
+ #else
884
+ p5 = p5s = i2b(625);
885
+ p5->next = 0;
886
+ #endif
887
+ }
888
+ for(;;) {
889
+ if (k & 1) {
890
+ b1 = mult(b, p5);
891
+ Bfree(b);
892
+ b = b1;
893
+ }
894
+ if (!(k >>= 1))
895
+ break;
896
+ if (!(p51 = p5->next)) {
897
+ #ifdef MULTIPLE_THREADS
898
+ ACQUIRE_DTOA_LOCK(1);
899
+ if (!(p51 = p5->next)) {
900
+ p51 = p5->next = mult(p5,p5);
901
+ p51->next = 0;
902
+ }
903
+ FREE_DTOA_LOCK(1);
904
+ #else
905
+ p51 = p5->next = mult(p5,p5);
906
+ p51->next = 0;
907
+ #endif
908
+ }
909
+ p5 = p51;
910
+ }
911
+ return b;
912
+ }
913
+
914
+ static Bigint *
915
+ lshift
916
+ #ifdef KR_headers
917
+ (b, k) Bigint *b; int k;
918
+ #else
919
+ (Bigint *b, int k)
920
+ #endif
921
+ {
922
+ int i, k1, n, n1;
923
+ Bigint *b1;
924
+ ULong *x, *x1, *xe, z;
925
+
926
+ #ifdef Pack_32
927
+ n = k >> 5;
928
+ #else
929
+ n = k >> 4;
930
+ #endif
931
+ k1 = b->k;
932
+ n1 = n + b->wds + 1;
933
+ for(i = b->maxwds; n1 > i; i <<= 1)
934
+ k1++;
935
+ b1 = Balloc(k1);
936
+ x1 = b1->x;
937
+ for(i = 0; i < n; i++)
938
+ *x1++ = 0;
939
+ x = b->x;
940
+ xe = x + b->wds;
941
+ #ifdef Pack_32
942
+ if (k &= 0x1f) {
943
+ k1 = 32 - k;
944
+ z = 0;
945
+ do {
946
+ *x1++ = *x << k | z;
947
+ z = *x++ >> k1;
948
+ }
949
+ while(x < xe);
950
+ if ((*x1 = z))
951
+ ++n1;
952
+ }
953
+ #else
954
+ if (k &= 0xf) {
955
+ k1 = 16 - k;
956
+ z = 0;
957
+ do {
958
+ *x1++ = *x << k & 0xffff | z;
959
+ z = *x++ >> k1;
960
+ }
961
+ while(x < xe);
962
+ if (*x1 = z)
963
+ ++n1;
964
+ }
965
+ #endif
966
+ else do
967
+ *x1++ = *x++;
968
+ while(x < xe);
969
+ b1->wds = n1 - 1;
970
+ Bfree(b);
971
+ return b1;
972
+ }
973
+
974
+ static int
975
+ cmp
976
+ #ifdef KR_headers
977
+ (a, b) Bigint *a, *b;
978
+ #else
979
+ (Bigint *a, Bigint *b)
980
+ #endif
981
+ {
982
+ ULong *xa, *xa0, *xb, *xb0;
983
+ int i, j;
984
+
985
+ i = a->wds;
986
+ j = b->wds;
987
+ #ifdef DEBUG
988
+ if (i > 1 && !a->x[i-1])
989
+ Bug("cmp called with a->x[a->wds-1] == 0");
990
+ if (j > 1 && !b->x[j-1])
991
+ Bug("cmp called with b->x[b->wds-1] == 0");
992
+ #endif
993
+ if (i -= j)
994
+ return i;
995
+ xa0 = a->x;
996
+ xa = xa0 + j;
997
+ xb0 = b->x;
998
+ xb = xb0 + j;
999
+ for(;;) {
1000
+ if (*--xa != *--xb)
1001
+ return *xa < *xb ? -1 : 1;
1002
+ if (xa <= xa0)
1003
+ break;
1004
+ }
1005
+ return 0;
1006
+ }
1007
+
1008
+ static Bigint *
1009
+ diff
1010
+ #ifdef KR_headers
1011
+ (a, b) Bigint *a, *b;
1012
+ #else
1013
+ (Bigint *a, Bigint *b)
1014
+ #endif
1015
+ {
1016
+ Bigint *c;
1017
+ int i, wa, wb;
1018
+ ULong *xa, *xae, *xb, *xbe, *xc;
1019
+ #ifdef ULLong
1020
+ ULLong borrow, y;
1021
+ #else
1022
+ ULong borrow, y;
1023
+ #ifdef Pack_32
1024
+ ULong z;
1025
+ #endif
1026
+ #endif
1027
+
1028
+ i = cmp(a,b);
1029
+ if (!i) {
1030
+ c = Balloc(0);
1031
+ c->wds = 1;
1032
+ c->x[0] = 0;
1033
+ return c;
1034
+ }
1035
+ if (i < 0) {
1036
+ c = a;
1037
+ a = b;
1038
+ b = c;
1039
+ i = 1;
1040
+ }
1041
+ else
1042
+ i = 0;
1043
+ c = Balloc(a->k);
1044
+ c->sign = i;
1045
+ wa = a->wds;
1046
+ xa = a->x;
1047
+ xae = xa + wa;
1048
+ wb = b->wds;
1049
+ xb = b->x;
1050
+ xbe = xb + wb;
1051
+ xc = c->x;
1052
+ borrow = 0;
1053
+ #ifdef ULLong
1054
+ do {
1055
+ y = (ULLong)*xa++ - *xb++ - borrow;
1056
+ borrow = y >> 32 & (ULong)1;
1057
+ *xc++ = (ULong) y & FFFFFFFF;
1058
+ }
1059
+ while(xb < xbe);
1060
+ while(xa < xae) {
1061
+ y = *xa++ - borrow;
1062
+ borrow = y >> 32 & (ULong)1;
1063
+ *xc++ = (ULong) y & FFFFFFFF;
1064
+ }
1065
+ #else
1066
+ #ifdef Pack_32
1067
+ do {
1068
+ y = (*xa & 0xffff) - (*xb & 0xffff) - borrow;
1069
+ borrow = (y & 0x10000) >> 16;
1070
+ z = (*xa++ >> 16) - (*xb++ >> 16) - borrow;
1071
+ borrow = (z & 0x10000) >> 16;
1072
+ Storeinc(xc, z, y);
1073
+ }
1074
+ while(xb < xbe);
1075
+ while(xa < xae) {
1076
+ y = (*xa & 0xffff) - borrow;
1077
+ borrow = (y & 0x10000) >> 16;
1078
+ z = (*xa++ >> 16) - borrow;
1079
+ borrow = (z & 0x10000) >> 16;
1080
+ Storeinc(xc, z, y);
1081
+ }
1082
+ #else
1083
+ do {
1084
+ y = *xa++ - *xb++ - borrow;
1085
+ borrow = (y & 0x10000) >> 16;
1086
+ *xc++ = y & 0xffff;
1087
+ }
1088
+ while(xb < xbe);
1089
+ while(xa < xae) {
1090
+ y = *xa++ - borrow;
1091
+ borrow = (y & 0x10000) >> 16;
1092
+ *xc++ = y & 0xffff;
1093
+ }
1094
+ #endif
1095
+ #endif
1096
+ while(!*--xc)
1097
+ wa--;
1098
+ c->wds = wa;
1099
+ return c;
1100
+ }
1101
+
1102
+ static double
1103
+ ulp
1104
+ #ifdef KR_headers
1105
+ (x) U x;
1106
+ #else
1107
+ (U x)
1108
+ #endif
1109
+ {
1110
+ register Long L;
1111
+ U a;
1112
+
1113
+ L = (word0(x) & Exp_mask) - (P-1)*Exp_msk1;
1114
+ #ifndef Avoid_Underflow
1115
+ #ifndef Sudden_Underflow
1116
+ if (L > 0) {
1117
+ #endif
1118
+ #endif
1119
+ #ifdef IBM
1120
+ L |= Exp_msk1 >> 4;
1121
+ #endif
1122
+ word0(a) = L;
1123
+ word1(a) = 0;
1124
+ #ifndef Avoid_Underflow
1125
+ #ifndef Sudden_Underflow
1126
+ }
1127
+ else {
1128
+ L = -L >> Exp_shift;
1129
+ if (L < Exp_shift) {
1130
+ word0(a) = 0x80000 >> L;
1131
+ word1(a) = 0;
1132
+ }
1133
+ else {
1134
+ word0(a) = 0;
1135
+ L -= Exp_shift;
1136
+ word1(a) = L >= 31 ? 1 : 1 << 31 - L;
1137
+ }
1138
+ }
1139
+ #endif
1140
+ #endif
1141
+ return dval(a);
1142
+ }
1143
+
1144
+ static double
1145
+ b2d
1146
+ #ifdef KR_headers
1147
+ (a, e) Bigint *a; int *e;
1148
+ #else
1149
+ (Bigint *a, int *e)
1150
+ #endif
1151
+ {
1152
+ ULong *xa, *xa0, w, y, z;
1153
+ int k;
1154
+ U d;
1155
+ #ifdef VAX
1156
+ ULong d0, d1;
1157
+ #else
1158
+ #define d0 word0(d)
1159
+ #define d1 word1(d)
1160
+ #endif
1161
+
1162
+ xa0 = a->x;
1163
+ xa = xa0 + a->wds;
1164
+ y = *--xa;
1165
+ #ifdef DEBUG
1166
+ if (!y) Bug("zero y in b2d");
1167
+ #endif
1168
+ k = hi0bits(y);
1169
+ *e = 32 - k;
1170
+ #ifdef Pack_32
1171
+ if (k < Ebits) {
1172
+ d0 = Exp_1 | y >> (Ebits - k);
1173
+ w = xa > xa0 ? *--xa : 0;
1174
+ d1 = y << ((32-Ebits) + k) | w >> (Ebits - k);
1175
+ goto ret_d;
1176
+ }
1177
+ z = xa > xa0 ? *--xa : 0;
1178
+ if (k -= Ebits) {
1179
+ d0 = Exp_1 | y << k | z >> (32 - k);
1180
+ y = xa > xa0 ? *--xa : 0;
1181
+ d1 = z << k | y >> (32 - k);
1182
+ }
1183
+ else {
1184
+ d0 = Exp_1 | y;
1185
+ d1 = z;
1186
+ }
1187
+ #else
1188
+ if (k < Ebits + 16) {
1189
+ z = xa > xa0 ? *--xa : 0;
1190
+ d0 = Exp_1 | y << k - Ebits | z >> Ebits + 16 - k;
1191
+ w = xa > xa0 ? *--xa : 0;
1192
+ y = xa > xa0 ? *--xa : 0;
1193
+ d1 = z << k + 16 - Ebits | w << k - Ebits | y >> 16 + Ebits - k;
1194
+ goto ret_d;
1195
+ }
1196
+ z = xa > xa0 ? *--xa : 0;
1197
+ w = xa > xa0 ? *--xa : 0;
1198
+ k -= Ebits + 16;
1199
+ d0 = Exp_1 | y << k + 16 | z << k | w >> 16 - k;
1200
+ y = xa > xa0 ? *--xa : 0;
1201
+ d1 = w << k + 16 | y << k;
1202
+ #endif
1203
+ ret_d:
1204
+ #ifdef VAX
1205
+ word0(d) = d0 >> 16 | d0 << 16;
1206
+ word1(d) = d1 >> 16 | d1 << 16;
1207
+ #else
1208
+ #undef d0
1209
+ #undef d1
1210
+ #endif
1211
+ return dval(d);
1212
+ }
1213
+
1214
+ static Bigint *
1215
+ d2b
1216
+ #ifdef KR_headers
1217
+ (d, e, bits) U d; int *e, *bits;
1218
+ #else
1219
+ (U d, int *e, int *bits)
1220
+ #endif
1221
+ {
1222
+ Bigint *b;
1223
+ int de, k;
1224
+ ULong *x, y, z;
1225
+ #ifndef Sudden_Underflow
1226
+ int i;
1227
+ #endif
1228
+ #ifdef VAX
1229
+ ULong d0, d1;
1230
+ d0 = word0(d) >> 16 | word0(d) << 16;
1231
+ d1 = word1(d) >> 16 | word1(d) << 16;
1232
+ #else
1233
+ #define d0 word0(d)
1234
+ #define d1 word1(d)
1235
+ #endif
1236
+
1237
+ #ifdef Pack_32
1238
+ b = Balloc(1);
1239
+ #else
1240
+ b = Balloc(2);
1241
+ #endif
1242
+ x = b->x;
1243
+
1244
+ z = d0 & Frac_mask;
1245
+ d0 &= 0x7fffffff; /* clear sign bit, which we ignore */
1246
+ #ifdef Sudden_Underflow
1247
+ de = (int)(d0 >> Exp_shift);
1248
+ #ifndef IBM
1249
+ z |= Exp_msk11;
1250
+ #endif
1251
+ #else
1252
+ if ((de = (int)(d0 >> Exp_shift)))
1253
+ z |= Exp_msk1;
1254
+ #endif
1255
+ #ifdef Pack_32
1256
+ if ((y = d1)) {
1257
+ if ((k = lo0bits(&y))) {
1258
+ x[0] = y | z << (32 - k);
1259
+ z >>= k;
1260
+ }
1261
+ else
1262
+ x[0] = y;
1263
+ #ifndef Sudden_Underflow
1264
+ i =
1265
+ #endif
1266
+ b->wds = (x[1] = z) ? 2 : 1;
1267
+ }
1268
+ else {
1269
+ #ifdef DEBUG
1270
+ if (!z)
1271
+ Bug("Zero passed to d2b");
1272
+ #endif
1273
+ k = lo0bits(&z);
1274
+ x[0] = z;
1275
+ #ifndef Sudden_Underflow
1276
+ i =
1277
+ #endif
1278
+ b->wds = 1;
1279
+ k += 32;
1280
+ }
1281
+ #else
1282
+ if (y = d1) {
1283
+ if (k = lo0bits(&y))
1284
+ if (k >= 16) {
1285
+ x[0] = y | z << 32 - k & 0xffff;
1286
+ x[1] = z >> k - 16 & 0xffff;
1287
+ x[2] = z >> k;
1288
+ i = 2;
1289
+ }
1290
+ else {
1291
+ x[0] = y & 0xffff;
1292
+ x[1] = y >> 16 | z << 16 - k & 0xffff;
1293
+ x[2] = z >> k & 0xffff;
1294
+ x[3] = z >> k+16;
1295
+ i = 3;
1296
+ }
1297
+ else {
1298
+ x[0] = y & 0xffff;
1299
+ x[1] = y >> 16;
1300
+ x[2] = z & 0xffff;
1301
+ x[3] = z >> 16;
1302
+ i = 3;
1303
+ }
1304
+ }
1305
+ else {
1306
+ #ifdef DEBUG
1307
+ if (!z)
1308
+ Bug("Zero passed to d2b");
1309
+ #endif
1310
+ k = lo0bits(&z);
1311
+ if (k >= 16) {
1312
+ x[0] = z;
1313
+ i = 0;
1314
+ }
1315
+ else {
1316
+ x[0] = z & 0xffff;
1317
+ x[1] = z >> 16;
1318
+ i = 1;
1319
+ }
1320
+ k += 32;
1321
+ }
1322
+ while(!x[i])
1323
+ --i;
1324
+ b->wds = i + 1;
1325
+ #endif
1326
+ #ifndef Sudden_Underflow
1327
+ if (de) {
1328
+ #endif
1329
+ #ifdef IBM
1330
+ *e = (de - Bias - (P-1) << 2) + k;
1331
+ *bits = 4*P + 8 - k - hi0bits(word0(d) & Frac_mask);
1332
+ #else
1333
+ *e = de - Bias - (P-1) + k;
1334
+ *bits = P - k;
1335
+ #endif
1336
+ #ifndef Sudden_Underflow
1337
+ }
1338
+ else {
1339
+ *e = de - Bias - (P-1) + 1 + k;
1340
+ #ifdef Pack_32
1341
+ *bits = 32*i - hi0bits(x[i-1]);
1342
+ #else
1343
+ *bits = (i+2)*16 - hi0bits(x[i]);
1344
+ #endif
1345
+ }
1346
+ #endif
1347
+ return b;
1348
+ }
1349
+ #undef d0
1350
+ #undef d1
1351
+
1352
+ static double
1353
+ ratio
1354
+ #ifdef KR_headers
1355
+ (a, b) Bigint *a, *b;
1356
+ #else
1357
+ (Bigint *a, Bigint *b)
1358
+ #endif
1359
+ {
1360
+ U da, db;
1361
+ int k, ka, kb;
1362
+
1363
+ dval(da) = b2d(a, &ka);
1364
+ dval(db) = b2d(b, &kb);
1365
+ #ifdef Pack_32
1366
+ k = ka - kb + 32*(a->wds - b->wds);
1367
+ #else
1368
+ k = ka - kb + 16*(a->wds - b->wds);
1369
+ #endif
1370
+ #ifdef IBM
1371
+ if (k > 0) {
1372
+ word0(da) += (k >> 2)*Exp_msk1;
1373
+ if (k &= 3)
1374
+ dval(da) *= 1 << k;
1375
+ }
1376
+ else {
1377
+ k = -k;
1378
+ word0(db) += (k >> 2)*Exp_msk1;
1379
+ if (k &= 3)
1380
+ dval(db) *= 1 << k;
1381
+ }
1382
+ #else
1383
+ if (k > 0)
1384
+ word0(da) += k*Exp_msk1;
1385
+ else {
1386
+ k = -k;
1387
+ word0(db) += k*Exp_msk1;
1388
+ }
1389
+ #endif
1390
+ return dval(da) / dval(db);
1391
+ }
1392
+
1393
+ static CONST double
1394
+ tens[] = {
1395
+ 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9,
1396
+ 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18, 1e19,
1397
+ 1e20, 1e21, 1e22
1398
+ #ifdef VAX
1399
+ , 1e23, 1e24
1400
+ #endif
1401
+ };
1402
+
1403
+ static CONST double
1404
+ #ifdef IEEE_Arith
1405
+ bigtens[] = { 1e16, 1e32, 1e64, 1e128, 1e256 };
1406
+ static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64, 1e-128,
1407
+ #ifdef Avoid_Underflow
1408
+ 9007199254740992.*9007199254740992.e-256
1409
+ /* = 2^106 * 1e-53 */
1410
+ #else
1411
+ 1e-256
1412
+ #endif
1413
+ };
1414
+ /* The factor of 2^53 in tinytens[4] helps us avoid setting the underflow */
1415
+ /* flag unnecessarily. It leads to a song and dance at the end of strtod. */
1416
+ #define Scale_Bit 0x10
1417
+ #define n_bigtens 5
1418
+ #else
1419
+ #ifdef IBM
1420
+ bigtens[] = { 1e16, 1e32, 1e64 };
1421
+ static CONST double tinytens[] = { 1e-16, 1e-32, 1e-64 };
1422
+ #define n_bigtens 3
1423
+ #else
1424
+ bigtens[] = { 1e16, 1e32 };
1425
+ static CONST double tinytens[] = { 1e-16, 1e-32 };
1426
+ #define n_bigtens 2
1427
+ #endif
1428
+ #endif
1429
+
1430
+ #ifdef INFNAN_CHECK
1431
+
1432
+ #ifndef NAN_WORD0
1433
+ #define NAN_WORD0 0x7ff80000
1434
+ #endif
1435
+
1436
+ #ifndef NAN_WORD1
1437
+ #define NAN_WORD1 0
1438
+ #endif
1439
+
1440
+ static int
1441
+ match
1442
+ #ifdef KR_headers
1443
+ (sp, t) char **sp, *t;
1444
+ #else
1445
+ (CONST char **sp, CONST char *t)
1446
+ #endif
1447
+ {
1448
+ int c, d;
1449
+ CONST char *s = *sp;
1450
+
1451
+ while((d = *t++)) {
1452
+ if ((c = *++s) >= 'A' && c <= 'Z')
1453
+ c += 'a' - 'A';
1454
+ if (c != d)
1455
+ return 0;
1456
+ }
1457
+ *sp = s + 1;
1458
+ return 1;
1459
+ }
1460
+
1461
+ #ifndef No_Hex_NaN
1462
+ static void
1463
+ hexnan
1464
+ #ifdef KR_headers
1465
+ (rvp, sp) U *rvp; CONST char **sp;
1466
+ #else
1467
+ (U *rvp, CONST char **sp)
1468
+ #endif
1469
+ {
1470
+ ULong c, x[2];
1471
+ CONST char *s;
1472
+ int havedig, udx0, xshift;
1473
+
1474
+ x[0] = x[1] = 0;
1475
+ havedig = xshift = 0;
1476
+ udx0 = 1;
1477
+ s = *sp;
1478
+ /* allow optional initial 0x or 0X */
1479
+ while((c = *(CONST unsigned char*)(s+1)) && c <= ' ')
1480
+ ++s;
1481
+ if (s[1] == '0' && (s[2] == 'x' || s[2] == 'X'))
1482
+ s += 2;
1483
+ while((c = *(CONST unsigned char*)++s)) {
1484
+ if (c >= '0' && c <= '9')
1485
+ c -= '0';
1486
+ else if (c >= 'a' && c <= 'f')
1487
+ c += 10 - 'a';
1488
+ else if (c >= 'A' && c <= 'F')
1489
+ c += 10 - 'A';
1490
+ else if (c <= ' ') {
1491
+ if (udx0 && havedig) {
1492
+ udx0 = 0;
1493
+ xshift = 1;
1494
+ }
1495
+ continue;
1496
+ }
1497
+ #ifdef GDTOA_NON_PEDANTIC_NANCHECK
1498
+ else if (/*(*/ c == ')' && havedig) {
1499
+ *sp = s + 1;
1500
+ break;
1501
+ }
1502
+ else
1503
+ return; /* invalid form: don't change *sp */
1504
+ #else
1505
+ else {
1506
+ do {
1507
+ if (/*(*/ c == ')') {
1508
+ *sp = s + 1;
1509
+ break;
1510
+ }
1511
+ } while((c = *++s));
1512
+ break;
1513
+ }
1514
+ #endif
1515
+ havedig = 1;
1516
+ if (xshift) {
1517
+ xshift = 0;
1518
+ x[0] = x[1];
1519
+ x[1] = 0;
1520
+ }
1521
+ if (udx0)
1522
+ x[0] = (x[0] << 4) | (x[1] >> 28);
1523
+ x[1] = (x[1] << 4) | c;
1524
+ }
1525
+ if ((x[0] &= 0xfffff) || x[1]) {
1526
+ word0(*rvp) = Exp_mask | x[0];
1527
+ word1(*rvp) = x[1];
1528
+ }
1529
+ }
1530
+ #endif /*No_Hex_NaN*/
1531
+ #endif /* INFNAN_CHECK */
1532
+
1533
+ static double
1534
+ _strtod
1535
+ #ifdef KR_headers
1536
+ (s00, se) CONST char *s00; char **se;
1537
+ #else
1538
+ (CONST char *s00, char **se)
1539
+ #endif
1540
+ {
1541
+ #ifdef Avoid_Underflow
1542
+ int scale;
1543
+ #endif
1544
+ int bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
1545
+ e, e1, esign, i, j, k, nd, nd0, nf, nz, nz0, sign;
1546
+ CONST char *s, *s0, *s1;
1547
+ double aadj, adj;
1548
+ U aadj1, rv, rv0;
1549
+ Long L;
1550
+ ULong y, z;
1551
+ Bigint *bb, *bb1, *bd, *bd0, *bs, *delta;
1552
+ #ifdef SET_INEXACT
1553
+ int inexact, oldinexact;
1554
+ #endif
1555
+ #ifdef Honor_FLT_ROUNDS
1556
+ int rounding;
1557
+ #endif
1558
+ #ifdef USE_LOCALE
1559
+ CONST char *s2;
1560
+ #endif
1561
+
1562
+ #ifdef __GNUC__
1563
+ delta = bb = bd = bs = 0;
1564
+ #endif
1565
+
1566
+ sign = nz0 = nz = 0;
1567
+ dval(rv) = 0.;
1568
+ for(s = s00;;s++) switch(*s) {
1569
+ case '-':
1570
+ sign = 1;
1571
+ /* no break */
1572
+ case '+':
1573
+ if (*++s)
1574
+ goto break2;
1575
+ /* no break */
1576
+ case 0:
1577
+ goto ret0;
1578
+ case '\t':
1579
+ case '\n':
1580
+ case '\v':
1581
+ case '\f':
1582
+ case '\r':
1583
+ case ' ':
1584
+ continue;
1585
+ default:
1586
+ goto break2;
1587
+ }
1588
+ break2:
1589
+ if (*s == '0') {
1590
+ nz0 = 1;
1591
+ while(*++s == '0') ;
1592
+ if (!*s)
1593
+ goto ret;
1594
+ }
1595
+ s0 = s;
1596
+ y = z = 0;
1597
+ for(nd = nf = 0; (c = *s) >= '0' && c <= '9'; nd++, s++)
1598
+ if (nd < 9)
1599
+ y = 10*y + c - '0';
1600
+ else if (nd < 16)
1601
+ z = 10*z + c - '0';
1602
+ nd0 = nd;
1603
+ #ifdef USE_LOCALE
1604
+ s1 = localeconv()->decimal_point;
1605
+ if (c == *s1) {
1606
+ c = '.';
1607
+ if (*++s1) {
1608
+ s2 = s;
1609
+ for(;;) {
1610
+ if (*++s2 != *s1) {
1611
+ c = 0;
1612
+ break;
1613
+ }
1614
+ if (!*++s1) {
1615
+ s = s2;
1616
+ break;
1617
+ }
1618
+ }
1619
+ }
1620
+ }
1621
+ #endif
1622
+ if (c == '.') {
1623
+ c = *++s;
1624
+ if (!nd) {
1625
+ for(; c == '0'; c = *++s)
1626
+ nz++;
1627
+ if (c > '0' && c <= '9') {
1628
+ s0 = s;
1629
+ nf += nz;
1630
+ nz = 0;
1631
+ goto have_dig;
1632
+ }
1633
+ goto dig_done;
1634
+ }
1635
+ for(; c >= '0' && c <= '9'; c = *++s) {
1636
+ have_dig:
1637
+ nz++;
1638
+ if (c -= '0') {
1639
+ nf += nz;
1640
+ for(i = 1; i < nz; i++)
1641
+ if (nd++ < 9)
1642
+ y *= 10;
1643
+ else if (nd <= DBL_DIG + 1)
1644
+ z *= 10;
1645
+ if (nd++ < 9)
1646
+ y = 10*y + c;
1647
+ else if (nd <= DBL_DIG + 1)
1648
+ z = 10*z + c;
1649
+ nz = 0;
1650
+ }
1651
+ }
1652
+ }
1653
+ dig_done:
1654
+ e = 0;
1655
+ if (c == 'e' || c == 'E') {
1656
+ if (!nd && !nz && !nz0) {
1657
+ goto ret0;
1658
+ }
1659
+ s00 = s;
1660
+ esign = 0;
1661
+ switch(c = *++s) {
1662
+ case '-':
1663
+ esign = 1;
1664
+ case '+':
1665
+ c = *++s;
1666
+ }
1667
+ if (c >= '0' && c <= '9') {
1668
+ while(c == '0')
1669
+ c = *++s;
1670
+ if (c > '0' && c <= '9') {
1671
+ L = c - '0';
1672
+ s1 = s;
1673
+ while((c = *++s) >= '0' && c <= '9')
1674
+ L = 10*L + c - '0';
1675
+ if (s - s1 > 8 || L > 19999)
1676
+ /* Avoid confusion from exponents
1677
+ * so large that e might overflow.
1678
+ */
1679
+ e = 19999; /* safe for 16 bit ints */
1680
+ else
1681
+ e = (int)L;
1682
+ if (esign)
1683
+ e = -e;
1684
+ }
1685
+ else
1686
+ e = 0;
1687
+ }
1688
+ else
1689
+ s = s00;
1690
+ }
1691
+ if (!nd) {
1692
+ if (!nz && !nz0) {
1693
+ #ifdef INFNAN_CHECK
1694
+ /* Check for Nan and Infinity */
1695
+ switch(c) {
1696
+ case 'i':
1697
+ case 'I':
1698
+ if (match(&s,"nf")) {
1699
+ --s;
1700
+ if (!match(&s,"inity"))
1701
+ ++s;
1702
+ word0(rv) = 0x7ff00000;
1703
+ word1(rv) = 0;
1704
+ goto ret;
1705
+ }
1706
+ break;
1707
+ case 'n':
1708
+ case 'N':
1709
+ if (match(&s, "an")) {
1710
+ word0(rv) = NAN_WORD0;
1711
+ word1(rv) = NAN_WORD1;
1712
+ #ifndef No_Hex_NaN
1713
+ if (*s == '(') /*)*/
1714
+ hexnan(&rv, &s);
1715
+ #endif
1716
+ goto ret;
1717
+ }
1718
+ }
1719
+ #endif /* INFNAN_CHECK */
1720
+ ret0:
1721
+ s = s00;
1722
+ sign = 0;
1723
+ }
1724
+ goto ret;
1725
+ }
1726
+ e1 = e -= nf;
1727
+
1728
+ /* Now we have nd0 digits, starting at s0, followed by a
1729
+ * decimal point, followed by nd-nd0 digits. The number we're
1730
+ * after is the integer represented by those digits times
1731
+ * 10**e */
1732
+
1733
+ if (!nd0)
1734
+ nd0 = nd;
1735
+ k = nd < DBL_DIG + 1 ? nd : DBL_DIG + 1;
1736
+ dval(rv) = y;
1737
+ if (k > 9) {
1738
+ #ifdef SET_INEXACT
1739
+ if (k > DBL_DIG)
1740
+ oldinexact = get_inexact();
1741
+ #endif
1742
+ dval(rv) = tens[k - 9] * dval(rv) + z;
1743
+ }
1744
+ bd0 = 0;
1745
+ if (nd <= DBL_DIG
1746
+ #ifndef RND_PRODQUOT
1747
+ #ifndef Honor_FLT_ROUNDS
1748
+ && Flt_Rounds == 1
1749
+ #endif
1750
+ #endif
1751
+ ) {
1752
+ if (!e)
1753
+ goto ret;
1754
+ if (e > 0) {
1755
+ if (e <= Ten_pmax) {
1756
+ #ifdef VAX
1757
+ goto vax_ovfl_check;
1758
+ #else
1759
+ #ifdef Honor_FLT_ROUNDS
1760
+ /* round correctly FLT_ROUNDS = 2 or 3 */
1761
+ if (sign) {
1762
+ rv = -rv;
1763
+ sign = 0;
1764
+ }
1765
+ #endif
1766
+ /* rv = */ rounded_product(dval(rv), tens[e]);
1767
+ goto ret;
1768
+ #endif
1769
+ }
1770
+ i = DBL_DIG - nd;
1771
+ if (e <= Ten_pmax + i) {
1772
+ /* A fancier test would sometimes let us do
1773
+ * this for larger i values.
1774
+ */
1775
+ #ifdef Honor_FLT_ROUNDS
1776
+ /* round correctly FLT_ROUNDS = 2 or 3 */
1777
+ if (sign) {
1778
+ rv = -rv;
1779
+ sign = 0;
1780
+ }
1781
+ #endif
1782
+ e -= i;
1783
+ dval(rv) *= tens[i];
1784
+ #ifdef VAX
1785
+ /* VAX exponent range is so narrow we must
1786
+ * worry about overflow here...
1787
+ */
1788
+ vax_ovfl_check:
1789
+ word0(rv) -= P*Exp_msk1;
1790
+ /* rv = */ rounded_product(dval(rv), tens[e]);
1791
+ if ((word0(rv) & Exp_mask)
1792
+ > Exp_msk1*(DBL_MAX_EXP+Bias-1-P))
1793
+ goto ovfl;
1794
+ word0(rv) += P*Exp_msk1;
1795
+ #else
1796
+ /* rv = */ rounded_product(dval(rv), tens[e]);
1797
+ #endif
1798
+ goto ret;
1799
+ }
1800
+ }
1801
+ #ifndef Inaccurate_Divide
1802
+ else if (e >= -Ten_pmax) {
1803
+ #ifdef Honor_FLT_ROUNDS
1804
+ /* round correctly FLT_ROUNDS = 2 or 3 */
1805
+ if (sign) {
1806
+ rv = -rv;
1807
+ sign = 0;
1808
+ }
1809
+ #endif
1810
+ /* rv = */ rounded_quotient(dval(rv), tens[-e]);
1811
+ goto ret;
1812
+ }
1813
+ #endif
1814
+ }
1815
+ e1 += nd - k;
1816
+
1817
+ #ifdef IEEE_Arith
1818
+ #ifdef SET_INEXACT
1819
+ inexact = 1;
1820
+ if (k <= DBL_DIG)
1821
+ oldinexact = get_inexact();
1822
+ #endif
1823
+ #ifdef Avoid_Underflow
1824
+ scale = 0;
1825
+ #endif
1826
+ #ifdef Honor_FLT_ROUNDS
1827
+ if ((rounding = Flt_Rounds) >= 2) {
1828
+ if (sign)
1829
+ rounding = rounding == 2 ? 0 : 2;
1830
+ else
1831
+ if (rounding != 2)
1832
+ rounding = 0;
1833
+ }
1834
+ #endif
1835
+ #endif /*IEEE_Arith*/
1836
+
1837
+ /* Get starting approximation = rv * 10**e1 */
1838
+
1839
+ if (e1 > 0) {
1840
+ if ((i = e1 & 15))
1841
+ dval(rv) *= tens[i];
1842
+ if (e1 &= ~15) {
1843
+ if (e1 > DBL_MAX_10_EXP) {
1844
+ ovfl:
1845
+ #ifndef NO_ERRNO
1846
+ errno = ERANGE;
1847
+ #endif
1848
+ /* Can't trust HUGE_VAL */
1849
+ #ifdef IEEE_Arith
1850
+ #ifdef Honor_FLT_ROUNDS
1851
+ switch(rounding) {
1852
+ case 0: /* toward 0 */
1853
+ case 3: /* toward -infinity */
1854
+ word0(rv) = Big0;
1855
+ word1(rv) = Big1;
1856
+ break;
1857
+ default:
1858
+ word0(rv) = Exp_mask;
1859
+ word1(rv) = 0;
1860
+ }
1861
+ #else /*Honor_FLT_ROUNDS*/
1862
+ word0(rv) = Exp_mask;
1863
+ word1(rv) = 0;
1864
+ #endif /*Honor_FLT_ROUNDS*/
1865
+ #ifdef SET_INEXACT
1866
+ /* set overflow bit */
1867
+ dval(rv0) = 1e300;
1868
+ dval(rv0) *= dval(rv0);
1869
+ #endif
1870
+ #else /*IEEE_Arith*/
1871
+ word0(rv) = Big0;
1872
+ word1(rv) = Big1;
1873
+ #endif /*IEEE_Arith*/
1874
+ if (bd0)
1875
+ goto retfree;
1876
+ goto ret;
1877
+ }
1878
+ e1 >>= 4;
1879
+ for(j = 0; e1 > 1; j++, e1 >>= 1)
1880
+ if (e1 & 1)
1881
+ dval(rv) *= bigtens[j];
1882
+ /* The last multiplication could overflow. */
1883
+ word0(rv) -= P*Exp_msk1;
1884
+ dval(rv) *= bigtens[j];
1885
+ if ((z = word0(rv) & Exp_mask)
1886
+ > Exp_msk1*(DBL_MAX_EXP+Bias-P))
1887
+ goto ovfl;
1888
+ if (z > Exp_msk1*(DBL_MAX_EXP+Bias-1-P)) {
1889
+ /* set to largest number */
1890
+ /* (Can't trust DBL_MAX) */
1891
+ word0(rv) = Big0;
1892
+ word1(rv) = Big1;
1893
+ }
1894
+ else
1895
+ word0(rv) += P*Exp_msk1;
1896
+ }
1897
+ }
1898
+ else if (e1 < 0) {
1899
+ e1 = -e1;
1900
+ if ((i = e1 & 15))
1901
+ dval(rv) /= tens[i];
1902
+ if (e1 >>= 4) {
1903
+ if (e1 >= 1 << n_bigtens)
1904
+ goto undfl;
1905
+ #ifdef Avoid_Underflow
1906
+ if (e1 & Scale_Bit)
1907
+ scale = 2*P;
1908
+ for(j = 0; e1 > 0; j++, e1 >>= 1)
1909
+ if (e1 & 1)
1910
+ dval(rv) *= tinytens[j];
1911
+ if (scale && (j = 2*P + 1 - ((word0(rv) & Exp_mask)
1912
+ >> Exp_shift)) > 0) {
1913
+ /* scaled rv is denormal; zap j low bits */
1914
+ if (j >= 32) {
1915
+ word1(rv) = 0;
1916
+ if (j >= 53)
1917
+ word0(rv) = (P+2)*Exp_msk1;
1918
+ else
1919
+ word0(rv) &= 0xffffffff << (j-32);
1920
+ }
1921
+ else
1922
+ word1(rv) &= 0xffffffff << j;
1923
+ }
1924
+ #else
1925
+ for(j = 0; e1 > 1; j++, e1 >>= 1)
1926
+ if (e1 & 1)
1927
+ dval(rv) *= tinytens[j];
1928
+ /* The last multiplication could underflow. */
1929
+ dval(rv0) = dval(rv);
1930
+ dval(rv) *= tinytens[j];
1931
+ if (!dval(rv)) {
1932
+ dval(rv) = 2.*dval(rv0);
1933
+ dval(rv) *= tinytens[j];
1934
+ #endif
1935
+ if (!dval(rv)) {
1936
+ undfl:
1937
+ dval(rv) = 0.;
1938
+ #ifndef NO_ERRNO
1939
+ errno = ERANGE;
1940
+ #endif
1941
+ if (bd0)
1942
+ goto retfree;
1943
+ goto ret;
1944
+ }
1945
+ #ifndef Avoid_Underflow
1946
+ word0(rv) = Tiny0;
1947
+ word1(rv) = Tiny1;
1948
+ /* The refinement below will clean
1949
+ * this approximation up.
1950
+ */
1951
+ }
1952
+ #endif
1953
+ }
1954
+ }
1955
+
1956
+ /* Now the hard part -- adjusting rv to the correct value.*/
1957
+
1958
+ /* Put digits into bd: true value = bd * 10^e */
1959
+
1960
+ bd0 = s2b(s0, nd0, nd, y);
1961
+
1962
+ for(;;) {
1963
+ bd = Balloc(bd0->k);
1964
+ Bcopy(bd, bd0);
1965
+ bb = d2b(rv, &bbe, &bbbits); /* rv = bb * 2^bbe */
1966
+ bs = i2b(1);
1967
+
1968
+ if (e >= 0) {
1969
+ bb2 = bb5 = 0;
1970
+ bd2 = bd5 = e;
1971
+ }
1972
+ else {
1973
+ bb2 = bb5 = -e;
1974
+ bd2 = bd5 = 0;
1975
+ }
1976
+ if (bbe >= 0)
1977
+ bb2 += bbe;
1978
+ else
1979
+ bd2 -= bbe;
1980
+ bs2 = bb2;
1981
+ #ifdef Honor_FLT_ROUNDS
1982
+ if (rounding != 1)
1983
+ bs2++;
1984
+ #endif
1985
+ #ifdef Avoid_Underflow
1986
+ j = bbe - scale;
1987
+ i = j + bbbits - 1; /* logb(rv) */
1988
+ if (i < Emin) /* denormal */
1989
+ j += P - Emin;
1990
+ else
1991
+ j = P + 1 - bbbits;
1992
+ #else /*Avoid_Underflow*/
1993
+ #ifdef Sudden_Underflow
1994
+ #ifdef IBM
1995
+ j = 1 + 4*P - 3 - bbbits + ((bbe + bbbits - 1) & 3);
1996
+ #else
1997
+ j = P + 1 - bbbits;
1998
+ #endif
1999
+ #else /*Sudden_Underflow*/
2000
+ j = bbe;
2001
+ i = j + bbbits - 1; /* logb(rv) */
2002
+ if (i < Emin) /* denormal */
2003
+ j += P - Emin;
2004
+ else
2005
+ j = P + 1 - bbbits;
2006
+ #endif /*Sudden_Underflow*/
2007
+ #endif /*Avoid_Underflow*/
2008
+ bb2 += j;
2009
+ bd2 += j;
2010
+ #ifdef Avoid_Underflow
2011
+ bd2 += scale;
2012
+ #endif
2013
+ i = bb2 < bd2 ? bb2 : bd2;
2014
+ if (i > bs2)
2015
+ i = bs2;
2016
+ if (i > 0) {
2017
+ bb2 -= i;
2018
+ bd2 -= i;
2019
+ bs2 -= i;
2020
+ }
2021
+ if (bb5 > 0) {
2022
+ bs = pow5mult(bs, bb5);
2023
+ bb1 = mult(bs, bb);
2024
+ Bfree(bb);
2025
+ bb = bb1;
2026
+ }
2027
+ if (bb2 > 0)
2028
+ bb = lshift(bb, bb2);
2029
+ if (bd5 > 0)
2030
+ bd = pow5mult(bd, bd5);
2031
+ if (bd2 > 0)
2032
+ bd = lshift(bd, bd2);
2033
+ if (bs2 > 0)
2034
+ bs = lshift(bs, bs2);
2035
+ delta = diff(bb, bd);
2036
+ dsign = delta->sign;
2037
+ delta->sign = 0;
2038
+ i = cmp(delta, bs);
2039
+ #ifdef Honor_FLT_ROUNDS
2040
+ if (rounding != 1) {
2041
+ if (i < 0) {
2042
+ /* Error is less than an ulp */
2043
+ if (!delta->x[0] && delta->wds <= 1) {
2044
+ /* exact */
2045
+ #ifdef SET_INEXACT
2046
+ inexact = 0;
2047
+ #endif
2048
+ break;
2049
+ }
2050
+ if (rounding) {
2051
+ if (dsign) {
2052
+ adj = 1.;
2053
+ goto apply_adj;
2054
+ }
2055
+ }
2056
+ else if (!dsign) {
2057
+ adj = -1.;
2058
+ if (!word1(rv)
2059
+ && !(word0(rv) & Frac_mask)) {
2060
+ y = word0(rv) & Exp_mask;
2061
+ #ifdef Avoid_Underflow
2062
+ if (!scale || y > 2*P*Exp_msk1)
2063
+ #else
2064
+ if (y)
2065
+ #endif
2066
+ {
2067
+ delta = lshift(delta,Log2P);
2068
+ if (cmp(delta, bs) <= 0)
2069
+ adj = -0.5;
2070
+ }
2071
+ }
2072
+ apply_adj:
2073
+ #ifdef Avoid_Underflow
2074
+ if (scale && (y = word0(rv) & Exp_mask)
2075
+ <= 2*P*Exp_msk1)
2076
+ word0(adj) += (2*P+1)*Exp_msk1 - y;
2077
+ #else
2078
+ #ifdef Sudden_Underflow
2079
+ if ((word0(rv) & Exp_mask) <=
2080
+ P*Exp_msk1) {
2081
+ word0(rv) += P*Exp_msk1;
2082
+ dval(rv) += adj*ulp(rv);
2083
+ word0(rv) -= P*Exp_msk1;
2084
+ }
2085
+ else
2086
+ #endif /*Sudden_Underflow*/
2087
+ #endif /*Avoid_Underflow*/
2088
+ dval(rv) += adj*ulp(rv);
2089
+ }
2090
+ break;
2091
+ }
2092
+ adj = ratio(delta, bs);
2093
+ if (adj < 1.)
2094
+ adj = 1.;
2095
+ if (adj <= 0x7ffffffe) {
2096
+ /* adj = rounding ? ceil(adj) : floor(adj); */
2097
+ y = adj;
2098
+ if (y != adj) {
2099
+ if (!((rounding>>1) ^ dsign))
2100
+ y++;
2101
+ adj = y;
2102
+ }
2103
+ }
2104
+ #ifdef Avoid_Underflow
2105
+ if (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1)
2106
+ word0(adj) += (2*P+1)*Exp_msk1 - y;
2107
+ #else
2108
+ #ifdef Sudden_Underflow
2109
+ if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
2110
+ word0(rv) += P*Exp_msk1;
2111
+ adj *= ulp(rv);
2112
+ if (dsign)
2113
+ dval(rv) += adj;
2114
+ else
2115
+ dval(rv) -= adj;
2116
+ word0(rv) -= P*Exp_msk1;
2117
+ goto cont;
2118
+ }
2119
+ #endif /*Sudden_Underflow*/
2120
+ #endif /*Avoid_Underflow*/
2121
+ adj *= ulp(rv);
2122
+ if (dsign)
2123
+ dval(rv) += adj;
2124
+ else
2125
+ dval(rv) -= adj;
2126
+ goto cont;
2127
+ }
2128
+ #endif /*Honor_FLT_ROUNDS*/
2129
+
2130
+ if (i < 0) {
2131
+ /* Error is less than half an ulp -- check for
2132
+ * special case of mantissa a power of two.
2133
+ */
2134
+ if (dsign || word1(rv) || word0(rv) & Bndry_mask
2135
+ #ifdef IEEE_Arith
2136
+ #ifdef Avoid_Underflow
2137
+ || (word0(rv) & Exp_mask) <= (2*P+1)*Exp_msk1
2138
+ #else
2139
+ || (word0(rv) & Exp_mask) <= Exp_msk1
2140
+ #endif
2141
+ #endif
2142
+ ) {
2143
+ #ifdef SET_INEXACT
2144
+ if (!delta->x[0] && delta->wds <= 1)
2145
+ inexact = 0;
2146
+ #endif
2147
+ break;
2148
+ }
2149
+ if (!delta->x[0] && delta->wds <= 1) {
2150
+ /* exact result */
2151
+ #ifdef SET_INEXACT
2152
+ inexact = 0;
2153
+ #endif
2154
+ break;
2155
+ }
2156
+ delta = lshift(delta,Log2P);
2157
+ if (cmp(delta, bs) > 0)
2158
+ goto drop_down;
2159
+ break;
2160
+ }
2161
+ if (i == 0) {
2162
+ /* exactly half-way between */
2163
+ if (dsign) {
2164
+ if ((word0(rv) & Bndry_mask1) == Bndry_mask1
2165
+ && word1(rv) == (
2166
+ #ifdef Avoid_Underflow
2167
+ (scale && (y = word0(rv) & Exp_mask) <= 2*P*Exp_msk1)
2168
+ ? (0xffffffff & (0xffffffff << (2*P+1-(y>>Exp_shift)))) :
2169
+ #endif
2170
+ 0xffffffff)) {
2171
+ /*boundary case -- increment exponent*/
2172
+ word0(rv) = (word0(rv) & Exp_mask)
2173
+ + Exp_msk1
2174
+ #ifdef IBM
2175
+ | Exp_msk1 >> 4
2176
+ #endif
2177
+ ;
2178
+ word1(rv) = 0;
2179
+ #ifdef Avoid_Underflow
2180
+ dsign = 0;
2181
+ #endif
2182
+ break;
2183
+ }
2184
+ }
2185
+ else if (!(word0(rv) & Bndry_mask) && !word1(rv)) {
2186
+ drop_down:
2187
+ /* boundary case -- decrement exponent */
2188
+ #ifdef Sudden_Underflow /*{{*/
2189
+ L = word0(rv) & Exp_mask;
2190
+ #ifdef IBM
2191
+ if (L < Exp_msk1)
2192
+ #else
2193
+ #ifdef Avoid_Underflow
2194
+ if (L <= (scale ? (2*P+1)*Exp_msk1 : Exp_msk1))
2195
+ #else
2196
+ if (L <= Exp_msk1)
2197
+ #endif /*Avoid_Underflow*/
2198
+ #endif /*IBM*/
2199
+ goto undfl;
2200
+ L -= Exp_msk1;
2201
+ #else /*Sudden_Underflow}{*/
2202
+ #ifdef Avoid_Underflow
2203
+ if (scale) {
2204
+ L = word0(rv) & Exp_mask;
2205
+ if (L <= (2*P+1)*Exp_msk1) {
2206
+ if (L > (P+2)*Exp_msk1)
2207
+ /* round even ==> */
2208
+ /* accept rv */
2209
+ break;
2210
+ /* rv = smallest denormal */
2211
+ goto undfl;
2212
+ }
2213
+ }
2214
+ #endif /*Avoid_Underflow*/
2215
+ L = (word0(rv) & Exp_mask) - Exp_msk1;
2216
+ #endif /*Sudden_Underflow}}*/
2217
+ word0(rv) = L | Bndry_mask1;
2218
+ word1(rv) = 0xffffffff;
2219
+ #ifdef IBM
2220
+ goto cont;
2221
+ #else
2222
+ break;
2223
+ #endif
2224
+ }
2225
+ #ifndef ROUND_BIASED
2226
+ if (!(word1(rv) & LSB))
2227
+ break;
2228
+ #endif
2229
+ if (dsign)
2230
+ dval(rv) += ulp(rv);
2231
+ #ifndef ROUND_BIASED
2232
+ else {
2233
+ dval(rv) -= ulp(rv);
2234
+ #ifndef Sudden_Underflow
2235
+ if (!dval(rv))
2236
+ goto undfl;
2237
+ #endif
2238
+ }
2239
+ #ifdef Avoid_Underflow
2240
+ dsign = 1 - dsign;
2241
+ #endif
2242
+ #endif
2243
+ break;
2244
+ }
2245
+ if ((aadj = ratio(delta, bs)) <= 2.) {
2246
+ if (dsign)
2247
+ aadj = dval(aadj1) = 1.;
2248
+ else if (word1(rv) || word0(rv) & Bndry_mask) {
2249
+ #ifndef Sudden_Underflow
2250
+ if (word1(rv) == Tiny1 && !word0(rv))
2251
+ goto undfl;
2252
+ #endif
2253
+ aadj = 1.;
2254
+ dval(aadj1) = -1.;
2255
+ }
2256
+ else {
2257
+ /* special case -- power of FLT_RADIX to be */
2258
+ /* rounded down... */
2259
+
2260
+ if (aadj < 2./FLT_RADIX)
2261
+ aadj = 1./FLT_RADIX;
2262
+ else
2263
+ aadj *= 0.5;
2264
+ dval(aadj1) = -aadj;
2265
+ }
2266
+ }
2267
+ else {
2268
+ aadj *= 0.5;
2269
+ dval(aadj1) = dsign ? aadj : -aadj;
2270
+ #ifdef Check_FLT_ROUNDS
2271
+ switch(Rounding) {
2272
+ case 2: /* towards +infinity */
2273
+ dval(aadj1) -= 0.5;
2274
+ break;
2275
+ case 0: /* towards 0 */
2276
+ case 3: /* towards -infinity */
2277
+ dval(aadj1) += 0.5;
2278
+ }
2279
+ #else
2280
+ if (Flt_Rounds == 0)
2281
+ dval(aadj1) += 0.5;
2282
+ #endif /*Check_FLT_ROUNDS*/
2283
+ }
2284
+ y = word0(rv) & Exp_mask;
2285
+
2286
+ /* Check for overflow */
2287
+
2288
+ if (y == Exp_msk1*(DBL_MAX_EXP+Bias-1)) {
2289
+ dval(rv0) = dval(rv);
2290
+ word0(rv) -= P*Exp_msk1;
2291
+ adj = dval(aadj1) * ulp(rv);
2292
+ dval(rv) += adj;
2293
+ if ((word0(rv) & Exp_mask) >=
2294
+ Exp_msk1*(DBL_MAX_EXP+Bias-P)) {
2295
+ if (word0(rv0) == Big0 && word1(rv0) == Big1)
2296
+ goto ovfl;
2297
+ word0(rv) = Big0;
2298
+ word1(rv) = Big1;
2299
+ goto cont;
2300
+ }
2301
+ else
2302
+ word0(rv) += P*Exp_msk1;
2303
+ }
2304
+ else {
2305
+ #ifdef Avoid_Underflow
2306
+ if (scale && y <= 2*P*Exp_msk1) {
2307
+ if (aadj <= 0x7fffffff) {
2308
+ if ((z = (ULong) aadj) <= 0)
2309
+ z = 1;
2310
+ aadj = z;
2311
+ dval(aadj1) = dsign ? aadj : -aadj;
2312
+ }
2313
+ word0(aadj1) += (2*P+1)*Exp_msk1 - y;
2314
+ }
2315
+ adj = dval(aadj1) * ulp(rv);
2316
+ dval(rv) += adj;
2317
+ #else
2318
+ #ifdef Sudden_Underflow
2319
+ if ((word0(rv) & Exp_mask) <= P*Exp_msk1) {
2320
+ dval(rv0) = dval(rv);
2321
+ word0(rv) += P*Exp_msk1;
2322
+ adj = dval(aadj1) * ulp(rv);
2323
+ dval(rv) += adj;
2324
+ #ifdef IBM
2325
+ if ((word0(rv) & Exp_mask) < P*Exp_msk1)
2326
+ #else
2327
+ if ((word0(rv) & Exp_mask) <= P*Exp_msk1)
2328
+ #endif
2329
+ {
2330
+ if (word0(rv0) == Tiny0
2331
+ && word1(rv0) == Tiny1)
2332
+ goto undfl;
2333
+ word0(rv) = Tiny0;
2334
+ word1(rv) = Tiny1;
2335
+ goto cont;
2336
+ }
2337
+ else
2338
+ word0(rv) -= P*Exp_msk1;
2339
+ }
2340
+ else {
2341
+ adj = dval(aadj1) * ulp(rv);
2342
+ dval(rv) += adj;
2343
+ }
2344
+ #else /*Sudden_Underflow*/
2345
+ /* Compute adj so that the IEEE rounding rules will
2346
+ * correctly round rv + adj in some half-way cases.
2347
+ * If rv * ulp(rv) is denormalized (i.e.,
2348
+ * y <= (P-1)*Exp_msk1), we must adjust aadj to avoid
2349
+ * trouble from bits lost to denormalization;
2350
+ * example: 1.2e-307 .
2351
+ */
2352
+ if (y <= (P-1)*Exp_msk1 && aadj > 1.) {
2353
+ dval(aadj1) = (double)(int)(aadj + 0.5);
2354
+ if (!dsign)
2355
+ dval(aadj1) = -dval(aadj1);
2356
+ }
2357
+ adj = dval(aadj1) * ulp(rv);
2358
+ dval(rv) += adj;
2359
+ #endif /*Sudden_Underflow*/
2360
+ #endif /*Avoid_Underflow*/
2361
+ }
2362
+ z = word0(rv) & Exp_mask;
2363
+ #ifndef SET_INEXACT
2364
+ #ifdef Avoid_Underflow
2365
+ if (!scale)
2366
+ #endif
2367
+ if (y == z) {
2368
+ /* Can we stop now? */
2369
+ L = (Long)aadj;
2370
+ aadj -= L;
2371
+ /* The tolerances below are conservative. */
2372
+ if (dsign || word1(rv) || word0(rv) & Bndry_mask) {
2373
+ if (aadj < .4999999 || aadj > .5000001)
2374
+ break;
2375
+ }
2376
+ else if (aadj < .4999999/FLT_RADIX)
2377
+ break;
2378
+ }
2379
+ #endif
2380
+ cont:
2381
+ Bfree(bb);
2382
+ Bfree(bd);
2383
+ Bfree(bs);
2384
+ Bfree(delta);
2385
+ }
2386
+ #ifdef SET_INEXACT
2387
+ if (inexact) {
2388
+ if (!oldinexact) {
2389
+ word0(rv0) = Exp_1 + (70 << Exp_shift);
2390
+ word1(rv0) = 0;
2391
+ dval(rv0) += 1.;
2392
+ }
2393
+ }
2394
+ else if (!oldinexact)
2395
+ clear_inexact();
2396
+ #endif
2397
+ #ifdef Avoid_Underflow
2398
+ if (scale) {
2399
+ word0(rv0) = Exp_1 - 2*P*Exp_msk1;
2400
+ word1(rv0) = 0;
2401
+ dval(rv) *= dval(rv0);
2402
+ #ifndef NO_ERRNO
2403
+ /* try to avoid the bug of testing an 8087 register value */
2404
+ if (word0(rv) == 0 && word1(rv) == 0)
2405
+ errno = ERANGE;
2406
+ #endif
2407
+ }
2408
+ #endif /* Avoid_Underflow */
2409
+ #ifdef SET_INEXACT
2410
+ if (inexact && !(word0(rv) & Exp_mask)) {
2411
+ /* set underflow bit */
2412
+ dval(rv0) = 1e-300;
2413
+ dval(rv0) *= dval(rv0);
2414
+ }
2415
+ #endif
2416
+ retfree:
2417
+ Bfree(bb);
2418
+ Bfree(bd);
2419
+ Bfree(bs);
2420
+ Bfree(bd0);
2421
+ Bfree(delta);
2422
+ ret:
2423
+ if (se)
2424
+ *se = (char *)s;
2425
+ return sign ? -dval(rv) : dval(rv);
2426
+ }
2427
+
2428
+ static int
2429
+ quorem
2430
+ #ifdef KR_headers
2431
+ (b, S) Bigint *b, *S;
2432
+ #else
2433
+ (Bigint *b, Bigint *S)
2434
+ #endif
2435
+ {
2436
+ int n;
2437
+ ULong *bx, *bxe, q, *sx, *sxe;
2438
+ #ifdef ULLong
2439
+ ULLong borrow, carry, y, ys;
2440
+ #else
2441
+ ULong borrow, carry, y, ys;
2442
+ #ifdef Pack_32
2443
+ ULong si, z, zs;
2444
+ #endif
2445
+ #endif
2446
+
2447
+ n = S->wds;
2448
+ #ifdef DEBUG
2449
+ /*debug*/ if (b->wds > n)
2450
+ /*debug*/ Bug("oversize b in quorem");
2451
+ #endif
2452
+ if (b->wds < n)
2453
+ return 0;
2454
+ sx = S->x;
2455
+ sxe = sx + --n;
2456
+ bx = b->x;
2457
+ bxe = bx + n;
2458
+ q = *bxe / (*sxe + 1); /* ensure q <= true quotient */
2459
+ #ifdef DEBUG
2460
+ /*debug*/ if (q > 9)
2461
+ /*debug*/ Bug("oversized quotient in quorem");
2462
+ #endif
2463
+ if (q) {
2464
+ borrow = 0;
2465
+ carry = 0;
2466
+ do {
2467
+ #ifdef ULLong
2468
+ ys = *sx++ * (ULLong)q + carry;
2469
+ carry = ys >> 32;
2470
+ y = *bx - (ys & FFFFFFFF) - borrow;
2471
+ borrow = y >> 32 & (ULong)1;
2472
+ *bx++ = (ULong) y & FFFFFFFF;
2473
+ #else
2474
+ #ifdef Pack_32
2475
+ si = *sx++;
2476
+ ys = (si & 0xffff) * q + carry;
2477
+ zs = (si >> 16) * q + (ys >> 16);
2478
+ carry = zs >> 16;
2479
+ y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2480
+ borrow = (y & 0x10000) >> 16;
2481
+ z = (*bx >> 16) - (zs & 0xffff) - borrow;
2482
+ borrow = (z & 0x10000) >> 16;
2483
+ Storeinc(bx, z, y);
2484
+ #else
2485
+ ys = *sx++ * q + carry;
2486
+ carry = ys >> 16;
2487
+ y = *bx - (ys & 0xffff) - borrow;
2488
+ borrow = (y & 0x10000) >> 16;
2489
+ *bx++ = y & 0xffff;
2490
+ #endif
2491
+ #endif
2492
+ }
2493
+ while(sx <= sxe);
2494
+ if (!*bxe) {
2495
+ bx = b->x;
2496
+ while(--bxe > bx && !*bxe)
2497
+ --n;
2498
+ b->wds = n;
2499
+ }
2500
+ }
2501
+ if (cmp(b, S) >= 0) {
2502
+ q++;
2503
+ borrow = 0;
2504
+ carry = 0;
2505
+ bx = b->x;
2506
+ sx = S->x;
2507
+ do {
2508
+ #ifdef ULLong
2509
+ ys = *sx++ + carry;
2510
+ carry = ys >> 32;
2511
+ y = *bx - (ys & FFFFFFFF) - borrow;
2512
+ borrow = y >> 32 & (ULong)1;
2513
+ *bx++ = (ULong) y & FFFFFFFF;
2514
+ #else
2515
+ #ifdef Pack_32
2516
+ si = *sx++;
2517
+ ys = (si & 0xffff) + carry;
2518
+ zs = (si >> 16) + (ys >> 16);
2519
+ carry = zs >> 16;
2520
+ y = (*bx & 0xffff) - (ys & 0xffff) - borrow;
2521
+ borrow = (y & 0x10000) >> 16;
2522
+ z = (*bx >> 16) - (zs & 0xffff) - borrow;
2523
+ borrow = (z & 0x10000) >> 16;
2524
+ Storeinc(bx, z, y);
2525
+ #else
2526
+ ys = *sx++ + carry;
2527
+ carry = ys >> 16;
2528
+ y = *bx - (ys & 0xffff) - borrow;
2529
+ borrow = (y & 0x10000) >> 16;
2530
+ *bx++ = y & 0xffff;
2531
+ #endif
2532
+ #endif
2533
+ }
2534
+ while(sx <= sxe);
2535
+ bx = b->x;
2536
+ bxe = bx + n;
2537
+ if (!*bxe) {
2538
+ while(--bxe > bx && !*bxe)
2539
+ --n;
2540
+ b->wds = n;
2541
+ }
2542
+ }
2543
+ return q;
2544
+ }
2545
+
2546
+ #ifndef MULTIPLE_THREADS
2547
+ static char *dtoa_result;
2548
+ #endif
2549
+
2550
+ static char *
2551
+ #ifdef KR_headers
2552
+ rv_alloc(i) int i;
2553
+ #else
2554
+ rv_alloc(int i)
2555
+ #endif
2556
+ {
2557
+ int j, k, *r;
2558
+
2559
+ j = sizeof(ULong);
2560
+ for(k = 0;
2561
+ sizeof(Bigint) - sizeof(ULong) - sizeof(int) + j <= (unsigned) i;
2562
+ j <<= 1)
2563
+ k++;
2564
+ r = (int*)Balloc(k);
2565
+ *r = k;
2566
+ return
2567
+ #ifndef MULTIPLE_THREADS
2568
+ dtoa_result =
2569
+ #endif
2570
+ (char *)(r+1);
2571
+ }
2572
+
2573
+ static char *
2574
+ #ifdef KR_headers
2575
+ nrv_alloc(s, rve, n) char *s, **rve; int n;
2576
+ #else
2577
+ nrv_alloc(CONST char *s, char **rve, int n)
2578
+ #endif
2579
+ {
2580
+ char *rv, *t;
2581
+
2582
+ t = rv = rv_alloc(n);
2583
+ while((*t = *s++)) t++;
2584
+ if (rve)
2585
+ *rve = t;
2586
+ return rv;
2587
+ }
2588
+
2589
+ /* freedtoa(s) must be used to free values s returned by dtoa
2590
+ * when MULTIPLE_THREADS is #defined. It should be used in all cases,
2591
+ * but for consistency with earlier versions of dtoa, it is optional
2592
+ * when MULTIPLE_THREADS is not defined.
2593
+ */
2594
+
2595
+ void
2596
+ #ifdef KR_headers
2597
+ freedtoa(s) char *s;
2598
+ #else
2599
+ freedtoa(char *s)
2600
+ #endif
2601
+ {
2602
+ Bigint *b = (Bigint *)((int *)s - 1);
2603
+ b->maxwds = 1 << (b->k = *(int*)b);
2604
+ Bfree(b);
2605
+ #ifndef MULTIPLE_THREADS
2606
+ if (s == dtoa_result)
2607
+ dtoa_result = 0;
2608
+ #endif
2609
+ }
2610
+
2611
+ /* dtoa for IEEE arithmetic (dmg): convert double to ASCII string.
2612
+ *
2613
+ * Inspired by "How to Print Floating-Point Numbers Accurately" by
2614
+ * Guy L. Steele, Jr. and Jon L. White [Proc. ACM SIGPLAN '90, pp. 112-126].
2615
+ *
2616
+ * Modifications:
2617
+ * 1. Rather than iterating, we use a simple numeric overestimate
2618
+ * to determine k = floor(log10(d)). We scale relevant
2619
+ * quantities using O(log2(k)) rather than O(k) multiplications.
2620
+ * 2. For some modes > 2 (corresponding to ecvt and fcvt), we don't
2621
+ * try to generate digits strictly left to right. Instead, we
2622
+ * compute with fewer bits and propagate the carry if necessary
2623
+ * when rounding the final digit up. This is often faster.
2624
+ * 3. Under the assumption that input will be rounded nearest,
2625
+ * mode 0 renders 1e23 as 1e23 rather than 9.999999999999999e22.
2626
+ * That is, we allow equality in stopping tests when the
2627
+ * round-nearest rule will give the same floating-point value
2628
+ * as would satisfaction of the stopping test with strict
2629
+ * inequality.
2630
+ * 4. We remove common factors of powers of 2 from relevant
2631
+ * quantities.
2632
+ * 5. When converting floating-point integers less than 1e16,
2633
+ * we use floating-point arithmetic rather than resorting
2634
+ * to multiple-precision integers.
2635
+ * 6. When asked to produce fewer than 15 digits, we first try
2636
+ * to get by with floating-point arithmetic; we resort to
2637
+ * multiple-precision integer arithmetic only if we cannot
2638
+ * guarantee that the floating-point calculation has given
2639
+ * the correctly rounded result. For k requested digits and
2640
+ * "uniformly" distributed input, the probability is
2641
+ * something like 10^(k-15) that we must resort to the Long
2642
+ * calculation.
2643
+ */
2644
+
2645
+ static char *
2646
+ dtoa
2647
+ #ifdef KR_headers
2648
+ (d, mode, ndigits, decpt, sign, rve)
2649
+ U d; int mode, ndigits, *decpt, *sign; char **rve;
2650
+ #else
2651
+ (U d, int mode, int ndigits, int *decpt, int *sign, char **rve)
2652
+ #endif
2653
+ {
2654
+ /* Arguments ndigits, decpt, sign are similar to those
2655
+ of ecvt and fcvt; trailing zeros are suppressed from
2656
+ the returned string. If not null, *rve is set to point
2657
+ to the end of the return value. If d is +-Infinity or NaN,
2658
+ then *decpt is set to 9999.
2659
+
2660
+ mode:
2661
+ 0 ==> shortest string that yields d when read in
2662
+ and rounded to nearest.
2663
+ 1 ==> like 0, but with Steele & White stopping rule;
2664
+ e.g. with IEEE P754 arithmetic , mode 0 gives
2665
+ 1e23 whereas mode 1 gives 9.999999999999999e22.
2666
+ 2 ==> max(1,ndigits) significant digits. This gives a
2667
+ return value similar to that of ecvt, except
2668
+ that trailing zeros are suppressed.
2669
+ 3 ==> through ndigits past the decimal point. This
2670
+ gives a return value similar to that from fcvt,
2671
+ except that trailing zeros are suppressed, and
2672
+ ndigits can be negative.
2673
+ 4,5 ==> similar to 2 and 3, respectively, but (in
2674
+ round-nearest mode) with the tests of mode 0 to
2675
+ possibly return a shorter string that rounds to d.
2676
+ With IEEE arithmetic and compilation with
2677
+ -DHonor_FLT_ROUNDS, modes 4 and 5 behave the same
2678
+ as modes 2 and 3 when FLT_ROUNDS != 1.
2679
+ 6-9 ==> Debugging modes similar to mode - 4: don't try
2680
+ fast floating-point estimate (if applicable).
2681
+
2682
+ Values of mode other than 0-9 are treated as mode 0.
2683
+
2684
+ Sufficient space is allocated to the return value
2685
+ to hold the suppressed trailing zeros.
2686
+ */
2687
+
2688
+ int bbits, b2, b5, be, dig, i, ieps, ilim, ilim0, ilim1,
2689
+ j, j1, k, k0, k_check, leftright, m2, m5, s2, s5,
2690
+ spec_case, try_quick;
2691
+ Long L;
2692
+ #ifndef Sudden_Underflow
2693
+ int denorm;
2694
+ ULong x;
2695
+ #endif
2696
+ Bigint *b, *b1, *delta, *mlo, *mhi, *S;
2697
+ U d2, eps;
2698
+ double ds;
2699
+ char *s, *s0;
2700
+ #ifdef Honor_FLT_ROUNDS
2701
+ int rounding;
2702
+ #endif
2703
+ #ifdef SET_INEXACT
2704
+ int inexact, oldinexact;
2705
+ #endif
2706
+
2707
+ #ifdef __GNUC__
2708
+ ilim = ilim1 = 0;
2709
+ mlo = NULL;
2710
+ #endif
2711
+
2712
+ #ifndef MULTIPLE_THREADS
2713
+ if (dtoa_result) {
2714
+ freedtoa(dtoa_result);
2715
+ dtoa_result = 0;
2716
+ }
2717
+ #endif
2718
+
2719
+ if (word0(d) & Sign_bit) {
2720
+ /* set sign for everything, including 0's and NaNs */
2721
+ *sign = 1;
2722
+ word0(d) &= ~Sign_bit; /* clear sign bit */
2723
+ }
2724
+ else
2725
+ *sign = 0;
2726
+
2727
+ #if defined(IEEE_Arith) + defined(VAX)
2728
+ #ifdef IEEE_Arith
2729
+ if ((word0(d) & Exp_mask) == Exp_mask)
2730
+ #else
2731
+ if (word0(d) == 0x8000)
2732
+ #endif
2733
+ {
2734
+ /* Infinity or NaN */
2735
+ *decpt = 9999;
2736
+ #ifdef IEEE_Arith
2737
+ if (!word1(d) && !(word0(d) & 0xfffff))
2738
+ return nrv_alloc("Infinity", rve, 8);
2739
+ #endif
2740
+ return nrv_alloc("NaN", rve, 3);
2741
+ }
2742
+ #endif
2743
+ #ifdef IBM
2744
+ dval(d) += 0; /* normalize */
2745
+ #endif
2746
+ if (!dval(d)) {
2747
+ *decpt = 1;
2748
+ return nrv_alloc("0", rve, 1);
2749
+ }
2750
+
2751
+ #ifdef SET_INEXACT
2752
+ try_quick = oldinexact = get_inexact();
2753
+ inexact = 1;
2754
+ #endif
2755
+ #ifdef Honor_FLT_ROUNDS
2756
+ if ((rounding = Flt_Rounds) >= 2) {
2757
+ if (*sign)
2758
+ rounding = rounding == 2 ? 0 : 2;
2759
+ else
2760
+ if (rounding != 2)
2761
+ rounding = 0;
2762
+ }
2763
+ #endif
2764
+
2765
+ b = d2b(d, &be, &bbits);
2766
+ #ifdef Sudden_Underflow
2767
+ i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1));
2768
+ #else
2769
+ if ((i = (int)(word0(d) >> Exp_shift1 & (Exp_mask>>Exp_shift1)))) {
2770
+ #endif
2771
+ dval(d2) = dval(d);
2772
+ word0(d2) &= Frac_mask1;
2773
+ word0(d2) |= Exp_11;
2774
+ #ifdef IBM
2775
+ if (j = 11 - hi0bits(word0(d2) & Frac_mask))
2776
+ dval(d2) /= 1 << j;
2777
+ #endif
2778
+
2779
+ /* log(x) ~=~ log(1.5) + (x-1.5)/1.5
2780
+ * log10(x) = log(x) / log(10)
2781
+ * ~=~ log(1.5)/log(10) + (x-1.5)/(1.5*log(10))
2782
+ * log10(d) = (i-Bias)*log(2)/log(10) + log10(d2)
2783
+ *
2784
+ * This suggests computing an approximation k to log10(d) by
2785
+ *
2786
+ * k = (i - Bias)*0.301029995663981
2787
+ * + ( (d2-1.5)*0.289529654602168 + 0.176091259055681 );
2788
+ *
2789
+ * We want k to be too large rather than too small.
2790
+ * The error in the first-order Taylor series approximation
2791
+ * is in our favor, so we just round up the constant enough
2792
+ * to compensate for any error in the multiplication of
2793
+ * (i - Bias) by 0.301029995663981; since |i - Bias| <= 1077,
2794
+ * and 1077 * 0.30103 * 2^-52 ~=~ 7.2e-14,
2795
+ * adding 1e-13 to the constant term more than suffices.
2796
+ * Hence we adjust the constant term to 0.1760912590558.
2797
+ * (We could get a more accurate k by invoking log10,
2798
+ * but this is probably not worthwhile.)
2799
+ */
2800
+
2801
+ i -= Bias;
2802
+ #ifdef IBM
2803
+ i <<= 2;
2804
+ i += j;
2805
+ #endif
2806
+ #ifndef Sudden_Underflow
2807
+ denorm = 0;
2808
+ }
2809
+ else {
2810
+ /* d is denormalized */
2811
+
2812
+ i = bbits + be + (Bias + (P-1) - 1);
2813
+ x = i > 32 ? word0(d) << (64 - i) | word1(d) >> (i - 32)
2814
+ : word1(d) << (32 - i);
2815
+ dval(d2) = x;
2816
+ word0(d2) -= 31*Exp_msk1; /* adjust exponent */
2817
+ i -= (Bias + (P-1) - 1) + 1;
2818
+ denorm = 1;
2819
+ }
2820
+ #endif
2821
+ ds = (dval(d2)-1.5)*0.289529654602168 + 0.1760912590558 + i*0.301029995663981;
2822
+ k = (int)ds;
2823
+ if (ds < 0. && ds != k)
2824
+ k--; /* want k = floor(ds) */
2825
+ k_check = 1;
2826
+ if (k >= 0 && k <= Ten_pmax) {
2827
+ if (dval(d) < tens[k])
2828
+ k--;
2829
+ k_check = 0;
2830
+ }
2831
+ j = bbits - i - 1;
2832
+ if (j >= 0) {
2833
+ b2 = 0;
2834
+ s2 = j;
2835
+ }
2836
+ else {
2837
+ b2 = -j;
2838
+ s2 = 0;
2839
+ }
2840
+ if (k >= 0) {
2841
+ b5 = 0;
2842
+ s5 = k;
2843
+ s2 += k;
2844
+ }
2845
+ else {
2846
+ b2 -= k;
2847
+ b5 = -k;
2848
+ s5 = 0;
2849
+ }
2850
+ if (mode < 0 || mode > 9)
2851
+ mode = 0;
2852
+
2853
+ #ifndef SET_INEXACT
2854
+ #ifdef Check_FLT_ROUNDS
2855
+ try_quick = Rounding == 1;
2856
+ #else
2857
+ try_quick = 1;
2858
+ #endif
2859
+ #endif /*SET_INEXACT*/
2860
+
2861
+ if (mode > 5) {
2862
+ mode -= 4;
2863
+ try_quick = 0;
2864
+ }
2865
+ leftright = 1;
2866
+ switch(mode) {
2867
+ case 0:
2868
+ case 1:
2869
+ ilim = ilim1 = -1;
2870
+ i = 18;
2871
+ ndigits = 0;
2872
+ break;
2873
+ case 2:
2874
+ leftright = 0;
2875
+ /* no break */
2876
+ case 4:
2877
+ if (ndigits <= 0)
2878
+ ndigits = 1;
2879
+ ilim = ilim1 = i = ndigits;
2880
+ break;
2881
+ case 3:
2882
+ leftright = 0;
2883
+ /* no break */
2884
+ case 5:
2885
+ i = ndigits + k + 1;
2886
+ ilim = i;
2887
+ ilim1 = i - 1;
2888
+ if (i <= 0)
2889
+ i = 1;
2890
+ }
2891
+ s = s0 = rv_alloc(i);
2892
+
2893
+ #ifdef Honor_FLT_ROUNDS
2894
+ if (mode > 1 && rounding != 1)
2895
+ leftright = 0;
2896
+ #endif
2897
+
2898
+ if (ilim >= 0 && ilim <= Quick_max && try_quick) {
2899
+
2900
+ /* Try to get by with floating-point arithmetic. */
2901
+
2902
+ i = 0;
2903
+ dval(d2) = dval(d);
2904
+ k0 = k;
2905
+ ilim0 = ilim;
2906
+ ieps = 2; /* conservative */
2907
+ if (k > 0) {
2908
+ ds = tens[k&0xf];
2909
+ j = k >> 4;
2910
+ if (j & Bletch) {
2911
+ /* prevent overflows */
2912
+ j &= Bletch - 1;
2913
+ dval(d) /= bigtens[n_bigtens-1];
2914
+ ieps++;
2915
+ }
2916
+ for(; j; j >>= 1, i++)
2917
+ if (j & 1) {
2918
+ ieps++;
2919
+ ds *= bigtens[i];
2920
+ }
2921
+ dval(d) /= ds;
2922
+ }
2923
+ else if ((j1 = -k)) {
2924
+ dval(d) *= tens[j1 & 0xf];
2925
+ for(j = j1 >> 4; j; j >>= 1, i++)
2926
+ if (j & 1) {
2927
+ ieps++;
2928
+ dval(d) *= bigtens[i];
2929
+ }
2930
+ }
2931
+ if (k_check && dval(d) < 1. && ilim > 0) {
2932
+ if (ilim1 <= 0)
2933
+ goto fast_failed;
2934
+ ilim = ilim1;
2935
+ k--;
2936
+ dval(d) *= 10.;
2937
+ ieps++;
2938
+ }
2939
+ dval(eps) = ieps*dval(d) + 7.;
2940
+ word0(eps) -= (P-1)*Exp_msk1;
2941
+ if (ilim == 0) {
2942
+ S = mhi = 0;
2943
+ dval(d) -= 5.;
2944
+ if (dval(d) > dval(eps))
2945
+ goto one_digit;
2946
+ if (dval(d) < -dval(eps))
2947
+ goto no_digits;
2948
+ goto fast_failed;
2949
+ }
2950
+ #ifndef No_leftright
2951
+ if (leftright) {
2952
+ /* Use Steele & White method of only
2953
+ * generating digits needed.
2954
+ */
2955
+ dval(eps) = 0.5/tens[ilim-1] - dval(eps);
2956
+ for(i = 0;;) {
2957
+ L = (ULong) dval(d);
2958
+ dval(d) -= L;
2959
+ *s++ = '0' + (int)L;
2960
+ if (dval(d) < dval(eps))
2961
+ goto ret1;
2962
+ if (1. - dval(d) < dval(eps))
2963
+ goto bump_up;
2964
+ if (++i >= ilim)
2965
+ break;
2966
+ dval(eps) *= 10.;
2967
+ dval(d) *= 10.;
2968
+ }
2969
+ }
2970
+ else {
2971
+ #endif
2972
+ /* Generate ilim digits, then fix them up. */
2973
+ dval(eps) *= tens[ilim-1];
2974
+ for(i = 1;; i++, dval(d) *= 10.) {
2975
+ L = (Long)(dval(d));
2976
+ if (!(dval(d) -= L))
2977
+ ilim = i;
2978
+ *s++ = '0' + (int)L;
2979
+ if (i == ilim) {
2980
+ if (dval(d) > 0.5 + dval(eps))
2981
+ goto bump_up;
2982
+ else if (dval(d) < 0.5 - dval(eps)) {
2983
+ while(*--s == '0');
2984
+ s++;
2985
+ goto ret1;
2986
+ }
2987
+ break;
2988
+ }
2989
+ }
2990
+ #ifndef No_leftright
2991
+ }
2992
+ #endif
2993
+ fast_failed:
2994
+ s = s0;
2995
+ dval(d) = dval(d2);
2996
+ k = k0;
2997
+ ilim = ilim0;
2998
+ }
2999
+
3000
+ /* Do we have a "small" integer? */
3001
+
3002
+ if (be >= 0 && k <= Int_max) {
3003
+ /* Yes. */
3004
+ ds = tens[k];
3005
+ if (ndigits < 0 && ilim <= 0) {
3006
+ S = mhi = 0;
3007
+ if (ilim < 0 || dval(d) < 5*ds)
3008
+ goto no_digits;
3009
+ goto one_digit;
3010
+ }
3011
+ for(i = 1;; i++, dval(d) *= 10.) {
3012
+ L = (Long)(dval(d) / ds);
3013
+ dval(d) -= L*ds;
3014
+ #ifdef Check_FLT_ROUNDS
3015
+ /* If FLT_ROUNDS == 2, L will usually be high by 1 */
3016
+ if (dval(d) < 0) {
3017
+ L--;
3018
+ dval(d) += ds;
3019
+ }
3020
+ #endif
3021
+ *s++ = '0' + (int)L;
3022
+ if (!dval(d)) {
3023
+ #ifdef SET_INEXACT
3024
+ inexact = 0;
3025
+ #endif
3026
+ break;
3027
+ }
3028
+ if (i == ilim) {
3029
+ #ifdef Honor_FLT_ROUNDS
3030
+ if (mode > 1)
3031
+ switch(rounding) {
3032
+ case 0: goto ret1;
3033
+ case 2: goto bump_up;
3034
+ }
3035
+ #endif
3036
+ dval(d) += dval(d);
3037
+ if (dval(d) > ds || (dval(d) == ds && L & 1)) {
3038
+ bump_up:
3039
+ while(*--s == '9')
3040
+ if (s == s0) {
3041
+ k++;
3042
+ *s = '0';
3043
+ break;
3044
+ }
3045
+ ++*s++;
3046
+ }
3047
+ break;
3048
+ }
3049
+ }
3050
+ goto ret1;
3051
+ }
3052
+
3053
+ m2 = b2;
3054
+ m5 = b5;
3055
+ mhi = mlo = 0;
3056
+ if (leftright) {
3057
+ i =
3058
+ #ifndef Sudden_Underflow
3059
+ denorm ? be + (Bias + (P-1) - 1 + 1) :
3060
+ #endif
3061
+ #ifdef IBM
3062
+ 1 + 4*P - 3 - bbits + ((bbits + be - 1) & 3);
3063
+ #else
3064
+ 1 + P - bbits;
3065
+ #endif
3066
+ b2 += i;
3067
+ s2 += i;
3068
+ mhi = i2b(1);
3069
+ }
3070
+ if (m2 > 0 && s2 > 0) {
3071
+ i = m2 < s2 ? m2 : s2;
3072
+ b2 -= i;
3073
+ m2 -= i;
3074
+ s2 -= i;
3075
+ }
3076
+ if (b5 > 0) {
3077
+ if (leftright) {
3078
+ if (m5 > 0) {
3079
+ mhi = pow5mult(mhi, m5);
3080
+ b1 = mult(mhi, b);
3081
+ Bfree(b);
3082
+ b = b1;
3083
+ }
3084
+ if ((j = b5 - m5))
3085
+ b = pow5mult(b, j);
3086
+ }
3087
+ else
3088
+ b = pow5mult(b, b5);
3089
+ }
3090
+ S = i2b(1);
3091
+ if (s5 > 0)
3092
+ S = pow5mult(S, s5);
3093
+
3094
+ /* Check for special case that d is a normalized power of 2. */
3095
+
3096
+ spec_case = 0;
3097
+ if ((mode < 2 || leftright)
3098
+ #ifdef Honor_FLT_ROUNDS
3099
+ && rounding == 1
3100
+ #endif
3101
+ ) {
3102
+ if (!word1(d) && !(word0(d) & Bndry_mask)
3103
+ #ifndef Sudden_Underflow
3104
+ && word0(d) & (Exp_mask & ~Exp_msk1)
3105
+ #endif
3106
+ ) {
3107
+ /* The special case */
3108
+ b2 += Log2P;
3109
+ s2 += Log2P;
3110
+ spec_case = 1;
3111
+ }
3112
+ }
3113
+
3114
+ /* Arrange for convenient computation of quotients:
3115
+ * shift left if necessary so divisor has 4 leading 0 bits.
3116
+ *
3117
+ * Perhaps we should just compute leading 28 bits of S once
3118
+ * and for all and pass them and a shift to quorem, so it
3119
+ * can do shifts and ors to compute the numerator for q.
3120
+ */
3121
+ #ifdef Pack_32
3122
+ if ((i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0x1f))
3123
+ i = 32 - i;
3124
+ #else
3125
+ if (i = ((s5 ? 32 - hi0bits(S->x[S->wds-1]) : 1) + s2) & 0xf)
3126
+ i = 16 - i;
3127
+ #endif
3128
+ if (i > 4) {
3129
+ i -= 4;
3130
+ b2 += i;
3131
+ m2 += i;
3132
+ s2 += i;
3133
+ }
3134
+ else if (i < 4) {
3135
+ i += 28;
3136
+ b2 += i;
3137
+ m2 += i;
3138
+ s2 += i;
3139
+ }
3140
+ if (b2 > 0)
3141
+ b = lshift(b, b2);
3142
+ if (s2 > 0)
3143
+ S = lshift(S, s2);
3144
+ if (k_check) {
3145
+ if (cmp(b,S) < 0) {
3146
+ k--;
3147
+ b = multadd(b, 10, 0); /* we botched the k estimate */
3148
+ if (leftright)
3149
+ mhi = multadd(mhi, 10, 0);
3150
+ ilim = ilim1;
3151
+ }
3152
+ }
3153
+ if (ilim <= 0 && (mode == 3 || mode == 5)) {
3154
+ if (ilim < 0 || cmp(b,S = multadd(S,5,0)) < 0) {
3155
+ /* no digits, fcvt style */
3156
+ no_digits:
3157
+ /* MOZILLA CHANGE: Always return a non-empty string. */
3158
+ *s++ = '0';
3159
+ k = 0;
3160
+ goto ret;
3161
+ }
3162
+ one_digit:
3163
+ *s++ = '1';
3164
+ k++;
3165
+ goto ret;
3166
+ }
3167
+ if (leftright) {
3168
+ if (m2 > 0)
3169
+ mhi = lshift(mhi, m2);
3170
+
3171
+ /* Compute mlo -- check for special case
3172
+ * that d is a normalized power of 2.
3173
+ */
3174
+
3175
+ mlo = mhi;
3176
+ if (spec_case) {
3177
+ mhi = Balloc(mhi->k);
3178
+ Bcopy(mhi, mlo);
3179
+ mhi = lshift(mhi, Log2P);
3180
+ }
3181
+
3182
+ for(i = 1;;i++) {
3183
+ dig = quorem(b,S) + '0';
3184
+ /* Do we yet have the shortest decimal string
3185
+ * that will round to d?
3186
+ */
3187
+ j = cmp(b, mlo);
3188
+ delta = diff(S, mhi);
3189
+ j1 = delta->sign ? 1 : cmp(b, delta);
3190
+ Bfree(delta);
3191
+ #ifndef ROUND_BIASED
3192
+ if (j1 == 0 && mode != 1 && !(word1(d) & 1)
3193
+ #ifdef Honor_FLT_ROUNDS
3194
+ && rounding >= 1
3195
+ #endif
3196
+ ) {
3197
+ if (dig == '9')
3198
+ goto round_9_up;
3199
+ if (j > 0)
3200
+ dig++;
3201
+ #ifdef SET_INEXACT
3202
+ else if (!b->x[0] && b->wds <= 1)
3203
+ inexact = 0;
3204
+ #endif
3205
+ *s++ = dig;
3206
+ goto ret;
3207
+ }
3208
+ #endif
3209
+ if (j < 0 || (j == 0 && mode != 1
3210
+ #ifndef ROUND_BIASED
3211
+ && !(word1(d) & 1)
3212
+ #endif
3213
+ )) {
3214
+ if (!b->x[0] && b->wds <= 1) {
3215
+ #ifdef SET_INEXACT
3216
+ inexact = 0;
3217
+ #endif
3218
+ goto accept_dig;
3219
+ }
3220
+ #ifdef Honor_FLT_ROUNDS
3221
+ if (mode > 1)
3222
+ switch(rounding) {
3223
+ case 0: goto accept_dig;
3224
+ case 2: goto keep_dig;
3225
+ }
3226
+ #endif /*Honor_FLT_ROUNDS*/
3227
+ if (j1 > 0) {
3228
+ b = lshift(b, 1);
3229
+ j1 = cmp(b, S);
3230
+ if ((j1 > 0 || (j1 == 0 && dig & 1))
3231
+ && dig++ == '9')
3232
+ goto round_9_up;
3233
+ }
3234
+ accept_dig:
3235
+ *s++ = dig;
3236
+ goto ret;
3237
+ }
3238
+ if (j1 > 0) {
3239
+ #ifdef Honor_FLT_ROUNDS
3240
+ if (!rounding)
3241
+ goto accept_dig;
3242
+ #endif
3243
+ if (dig == '9') { /* possible if i == 1 */
3244
+ round_9_up:
3245
+ *s++ = '9';
3246
+ goto roundoff;
3247
+ }
3248
+ *s++ = dig + 1;
3249
+ goto ret;
3250
+ }
3251
+ #ifdef Honor_FLT_ROUNDS
3252
+ keep_dig:
3253
+ #endif
3254
+ *s++ = dig;
3255
+ if (i == ilim)
3256
+ break;
3257
+ b = multadd(b, 10, 0);
3258
+ if (mlo == mhi)
3259
+ mlo = mhi = multadd(mhi, 10, 0);
3260
+ else {
3261
+ mlo = multadd(mlo, 10, 0);
3262
+ mhi = multadd(mhi, 10, 0);
3263
+ }
3264
+ }
3265
+ }
3266
+ else
3267
+ for(i = 1;; i++) {
3268
+ *s++ = dig = quorem(b,S) + '0';
3269
+ if (!b->x[0] && b->wds <= 1) {
3270
+ #ifdef SET_INEXACT
3271
+ inexact = 0;
3272
+ #endif
3273
+ goto ret;
3274
+ }
3275
+ if (i >= ilim)
3276
+ break;
3277
+ b = multadd(b, 10, 0);
3278
+ }
3279
+
3280
+ /* Round off last digit */
3281
+
3282
+ #ifdef Honor_FLT_ROUNDS
3283
+ switch(rounding) {
3284
+ case 0: goto trimzeros;
3285
+ case 2: goto roundoff;
3286
+ }
3287
+ #endif
3288
+ b = lshift(b, 1);
3289
+ j = cmp(b, S);
3290
+ if (j >= 0) { /* ECMA compatible rounding needed by Spidermonkey */
3291
+ roundoff:
3292
+ while(*--s == '9')
3293
+ if (s == s0) {
3294
+ k++;
3295
+ *s++ = '1';
3296
+ goto ret;
3297
+ }
3298
+ ++*s++;
3299
+ }
3300
+ else {
3301
+ #ifdef Honor_FLT_ROUNDS
3302
+ trimzeros:
3303
+ #endif
3304
+ while(*--s == '0');
3305
+ s++;
3306
+ }
3307
+ ret:
3308
+ Bfree(S);
3309
+ if (mhi) {
3310
+ if (mlo && mlo != mhi)
3311
+ Bfree(mlo);
3312
+ Bfree(mhi);
3313
+ }
3314
+ ret1:
3315
+ #ifdef SET_INEXACT
3316
+ if (inexact) {
3317
+ if (!oldinexact) {
3318
+ word0(d) = Exp_1 + (70 << Exp_shift);
3319
+ word1(d) = 0;
3320
+ dval(d) += 1.;
3321
+ }
3322
+ }
3323
+ else if (!oldinexact)
3324
+ clear_inexact();
3325
+ #endif
3326
+ Bfree(b);
3327
+ *s = 0;
3328
+ *decpt = k + 1;
3329
+ if (rve)
3330
+ *rve = s;
3331
+ return s0;
3332
+ }
3333
+ #ifdef __cplusplus
3334
+ }
3335
+ #endif