johnson 2.0.0.pre1 → 2.0.0.pre2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (311) hide show
  1. data/CHANGELOG.rdoc +12 -0
  2. data/Manifest.txt +4 -285
  3. data/Rakefile +13 -20
  4. data/ext/tracemonkey/global.cc +4 -1
  5. data/ext/tracemonkey/js.cc +30 -33
  6. data/ext/tracemonkey/runtime.cc +96 -6
  7. data/ext/tracemonkey/split_global.cc +0 -5
  8. data/ext/tracemonkey/tracemonkey.h +2 -2
  9. data/lib/johnson.rb +2 -2
  10. data/lib/johnson/runtime.rb +25 -15
  11. data/lib/johnson/tracemonkey/runtime.rb +6 -3
  12. data/vendor/tracemonkey/config/system-headers +1 -3
  13. data/vendor/tracemonkey/jscntxt.h +5 -2
  14. data/vendor/tracemonkey/jsdbgapi.cpp +9 -1
  15. data/vendor/tracemonkey/jsdbgapi.h +4 -0
  16. data/vendor/tracemonkey/tests/ecma/NativeObjects/browser.js +0 -0
  17. data/vendor/tracemonkey/tests/ecma/NativeObjects/jstests.list +0 -0
  18. data/vendor/tracemonkey/tests/ecma_3_1/Object/jstests.list +1 -1
  19. data/vendor/tracemonkey/tests/js1_3/misc/browser.js +0 -0
  20. data/vendor/tracemonkey/tests/js1_3/misc/jstests.list +0 -0
  21. data/vendor/tracemonkey/tests/js1_5/Regress/jstests.list +4 -4
  22. data/vendor/tracemonkey/tests/js1_5/Scope/jstests.list +1 -1
  23. data/vendor/tracemonkey/tests/js1_5/decompilation/jstests.list +2 -2
  24. data/vendor/tracemonkey/tests/js1_7/decompilation/jstests.list +1 -1
  25. data/vendor/tracemonkey/tests/shell.js +2 -1
  26. metadata +51 -309
  27. data/ext/spidermonkey/context.c +0 -116
  28. data/ext/spidermonkey/context.h +0 -19
  29. data/ext/spidermonkey/conversions.c +0 -361
  30. data/ext/spidermonkey/conversions.h +0 -31
  31. data/ext/spidermonkey/debugger.c +0 -234
  32. data/ext/spidermonkey/debugger.h +0 -10
  33. data/ext/spidermonkey/extconf.rb +0 -32
  34. data/ext/spidermonkey/extensions.c +0 -37
  35. data/ext/spidermonkey/extensions.h +0 -12
  36. data/ext/spidermonkey/global.c +0 -40
  37. data/ext/spidermonkey/global.h +0 -11
  38. data/ext/spidermonkey/idhash.c +0 -16
  39. data/ext/spidermonkey/idhash.h +0 -8
  40. data/ext/spidermonkey/immutable_node.c +0 -1153
  41. data/ext/spidermonkey/immutable_node.c.erb +0 -523
  42. data/ext/spidermonkey/immutable_node.h +0 -22
  43. data/ext/spidermonkey/jroot.h +0 -197
  44. data/ext/spidermonkey/js_land_proxy.c +0 -620
  45. data/ext/spidermonkey/js_land_proxy.h +0 -20
  46. data/ext/spidermonkey/ruby_land_proxy.c +0 -618
  47. data/ext/spidermonkey/ruby_land_proxy.h +0 -38
  48. data/ext/spidermonkey/runtime.c +0 -396
  49. data/ext/spidermonkey/runtime.h +0 -27
  50. data/ext/spidermonkey/spidermonkey.c +0 -22
  51. data/ext/spidermonkey/spidermonkey.h +0 -29
  52. data/lib/johnson/spidermonkey.rb +0 -12
  53. data/lib/johnson/spidermonkey/context.rb +0 -10
  54. data/lib/johnson/spidermonkey/debugger.rb +0 -67
  55. data/lib/johnson/spidermonkey/immutable_node.rb +0 -282
  56. data/lib/johnson/spidermonkey/js_land_proxy.rb +0 -64
  57. data/lib/johnson/spidermonkey/mutable_tree_visitor.rb +0 -242
  58. data/lib/johnson/spidermonkey/ruby_land_proxy.rb +0 -17
  59. data/lib/johnson/spidermonkey/runtime.rb +0 -74
  60. data/test/johnson/spidermonkey/context_test.rb +0 -21
  61. data/test/johnson/spidermonkey/immutable_node_test.rb +0 -34
  62. data/test/johnson/spidermonkey/js_land_proxy_test.rb +0 -273
  63. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +0 -274
  64. data/test/johnson/spidermonkey/runtime_test.rb +0 -41
  65. data/vendor/spidermonkey/.cvsignore +0 -9
  66. data/vendor/spidermonkey/Makefile.in +0 -449
  67. data/vendor/spidermonkey/Makefile.ref +0 -365
  68. data/vendor/spidermonkey/README.html +0 -820
  69. data/vendor/spidermonkey/SpiderMonkey.rsp +0 -12
  70. data/vendor/spidermonkey/Y.js +0 -19
  71. data/vendor/spidermonkey/build.mk +0 -43
  72. data/vendor/spidermonkey/config.mk +0 -192
  73. data/vendor/spidermonkey/config/AIX4.1.mk +0 -65
  74. data/vendor/spidermonkey/config/AIX4.2.mk +0 -64
  75. data/vendor/spidermonkey/config/AIX4.3.mk +0 -65
  76. data/vendor/spidermonkey/config/Darwin.mk +0 -83
  77. data/vendor/spidermonkey/config/Darwin1.3.mk +0 -81
  78. data/vendor/spidermonkey/config/Darwin1.4.mk +0 -41
  79. data/vendor/spidermonkey/config/Darwin5.2.mk +0 -81
  80. data/vendor/spidermonkey/config/Darwin5.3.mk +0 -81
  81. data/vendor/spidermonkey/config/HP-UXB.10.10.mk +0 -77
  82. data/vendor/spidermonkey/config/HP-UXB.10.20.mk +0 -77
  83. data/vendor/spidermonkey/config/HP-UXB.11.00.mk +0 -80
  84. data/vendor/spidermonkey/config/IRIX.mk +0 -87
  85. data/vendor/spidermonkey/config/IRIX5.3.mk +0 -44
  86. data/vendor/spidermonkey/config/IRIX6.1.mk +0 -44
  87. data/vendor/spidermonkey/config/IRIX6.2.mk +0 -44
  88. data/vendor/spidermonkey/config/IRIX6.3.mk +0 -44
  89. data/vendor/spidermonkey/config/IRIX6.5.mk +0 -44
  90. data/vendor/spidermonkey/config/Linux_All.mk +0 -103
  91. data/vendor/spidermonkey/config/Mac_OS10.0.mk +0 -82
  92. data/vendor/spidermonkey/config/OSF1V4.0.mk +0 -72
  93. data/vendor/spidermonkey/config/OSF1V5.0.mk +0 -69
  94. data/vendor/spidermonkey/config/SunOS4.1.4.mk +0 -101
  95. data/vendor/spidermonkey/config/SunOS5.10.mk +0 -50
  96. data/vendor/spidermonkey/config/SunOS5.3.mk +0 -91
  97. data/vendor/spidermonkey/config/SunOS5.4.mk +0 -92
  98. data/vendor/spidermonkey/config/SunOS5.5.1.mk +0 -44
  99. data/vendor/spidermonkey/config/SunOS5.5.mk +0 -87
  100. data/vendor/spidermonkey/config/SunOS5.6.mk +0 -89
  101. data/vendor/spidermonkey/config/SunOS5.7.mk +0 -44
  102. data/vendor/spidermonkey/config/SunOS5.8.mk +0 -44
  103. data/vendor/spidermonkey/config/SunOS5.9.mk +0 -44
  104. data/vendor/spidermonkey/config/WINNT4.0.mk +0 -117
  105. data/vendor/spidermonkey/config/WINNT5.0.mk +0 -117
  106. data/vendor/spidermonkey/config/WINNT5.1.mk +0 -117
  107. data/vendor/spidermonkey/config/WINNT5.2.mk +0 -117
  108. data/vendor/spidermonkey/config/WINNT6.0.mk +0 -117
  109. data/vendor/spidermonkey/config/dgux.mk +0 -64
  110. data/vendor/spidermonkey/editline/Makefile.ref +0 -144
  111. data/vendor/spidermonkey/editline/README +0 -83
  112. data/vendor/spidermonkey/editline/editline.3 +0 -175
  113. data/vendor/spidermonkey/editline/editline.c +0 -1369
  114. data/vendor/spidermonkey/editline/editline.h +0 -135
  115. data/vendor/spidermonkey/editline/sysunix.c +0 -182
  116. data/vendor/spidermonkey/editline/unix.h +0 -82
  117. data/vendor/spidermonkey/fdlibm/.cvsignore +0 -7
  118. data/vendor/spidermonkey/fdlibm/Makefile.in +0 -127
  119. data/vendor/spidermonkey/fdlibm/Makefile.ref +0 -192
  120. data/vendor/spidermonkey/fdlibm/e_acos.c +0 -147
  121. data/vendor/spidermonkey/fdlibm/e_acosh.c +0 -105
  122. data/vendor/spidermonkey/fdlibm/e_asin.c +0 -156
  123. data/vendor/spidermonkey/fdlibm/e_atan2.c +0 -165
  124. data/vendor/spidermonkey/fdlibm/e_atanh.c +0 -110
  125. data/vendor/spidermonkey/fdlibm/e_cosh.c +0 -133
  126. data/vendor/spidermonkey/fdlibm/e_exp.c +0 -202
  127. data/vendor/spidermonkey/fdlibm/e_fmod.c +0 -184
  128. data/vendor/spidermonkey/fdlibm/e_gamma.c +0 -71
  129. data/vendor/spidermonkey/fdlibm/e_gamma_r.c +0 -70
  130. data/vendor/spidermonkey/fdlibm/e_hypot.c +0 -173
  131. data/vendor/spidermonkey/fdlibm/e_j0.c +0 -524
  132. data/vendor/spidermonkey/fdlibm/e_j1.c +0 -523
  133. data/vendor/spidermonkey/fdlibm/e_jn.c +0 -315
  134. data/vendor/spidermonkey/fdlibm/e_lgamma.c +0 -71
  135. data/vendor/spidermonkey/fdlibm/e_lgamma_r.c +0 -347
  136. data/vendor/spidermonkey/fdlibm/e_log.c +0 -184
  137. data/vendor/spidermonkey/fdlibm/e_log10.c +0 -134
  138. data/vendor/spidermonkey/fdlibm/e_pow.c +0 -386
  139. data/vendor/spidermonkey/fdlibm/e_rem_pio2.c +0 -222
  140. data/vendor/spidermonkey/fdlibm/e_remainder.c +0 -120
  141. data/vendor/spidermonkey/fdlibm/e_scalb.c +0 -89
  142. data/vendor/spidermonkey/fdlibm/e_sinh.c +0 -122
  143. data/vendor/spidermonkey/fdlibm/e_sqrt.c +0 -497
  144. data/vendor/spidermonkey/fdlibm/fdlibm.h +0 -273
  145. data/vendor/spidermonkey/fdlibm/fdlibm.mak +0 -1453
  146. data/vendor/spidermonkey/fdlibm/fdlibm.mdp +0 -0
  147. data/vendor/spidermonkey/fdlibm/k_cos.c +0 -135
  148. data/vendor/spidermonkey/fdlibm/k_rem_pio2.c +0 -354
  149. data/vendor/spidermonkey/fdlibm/k_sin.c +0 -114
  150. data/vendor/spidermonkey/fdlibm/k_standard.c +0 -785
  151. data/vendor/spidermonkey/fdlibm/k_tan.c +0 -170
  152. data/vendor/spidermonkey/fdlibm/s_asinh.c +0 -101
  153. data/vendor/spidermonkey/fdlibm/s_atan.c +0 -175
  154. data/vendor/spidermonkey/fdlibm/s_cbrt.c +0 -133
  155. data/vendor/spidermonkey/fdlibm/s_ceil.c +0 -120
  156. data/vendor/spidermonkey/fdlibm/s_copysign.c +0 -72
  157. data/vendor/spidermonkey/fdlibm/s_cos.c +0 -118
  158. data/vendor/spidermonkey/fdlibm/s_erf.c +0 -356
  159. data/vendor/spidermonkey/fdlibm/s_expm1.c +0 -267
  160. data/vendor/spidermonkey/fdlibm/s_fabs.c +0 -70
  161. data/vendor/spidermonkey/fdlibm/s_finite.c +0 -71
  162. data/vendor/spidermonkey/fdlibm/s_floor.c +0 -121
  163. data/vendor/spidermonkey/fdlibm/s_frexp.c +0 -99
  164. data/vendor/spidermonkey/fdlibm/s_ilogb.c +0 -85
  165. data/vendor/spidermonkey/fdlibm/s_isnan.c +0 -74
  166. data/vendor/spidermonkey/fdlibm/s_ldexp.c +0 -66
  167. data/vendor/spidermonkey/fdlibm/s_lib_version.c +0 -73
  168. data/vendor/spidermonkey/fdlibm/s_log1p.c +0 -211
  169. data/vendor/spidermonkey/fdlibm/s_logb.c +0 -79
  170. data/vendor/spidermonkey/fdlibm/s_matherr.c +0 -64
  171. data/vendor/spidermonkey/fdlibm/s_modf.c +0 -132
  172. data/vendor/spidermonkey/fdlibm/s_nextafter.c +0 -124
  173. data/vendor/spidermonkey/fdlibm/s_rint.c +0 -131
  174. data/vendor/spidermonkey/fdlibm/s_scalbn.c +0 -107
  175. data/vendor/spidermonkey/fdlibm/s_signgam.c +0 -40
  176. data/vendor/spidermonkey/fdlibm/s_significand.c +0 -68
  177. data/vendor/spidermonkey/fdlibm/s_sin.c +0 -118
  178. data/vendor/spidermonkey/fdlibm/s_tan.c +0 -112
  179. data/vendor/spidermonkey/fdlibm/s_tanh.c +0 -122
  180. data/vendor/spidermonkey/fdlibm/w_acos.c +0 -78
  181. data/vendor/spidermonkey/fdlibm/w_acosh.c +0 -78
  182. data/vendor/spidermonkey/fdlibm/w_asin.c +0 -80
  183. data/vendor/spidermonkey/fdlibm/w_atan2.c +0 -79
  184. data/vendor/spidermonkey/fdlibm/w_atanh.c +0 -81
  185. data/vendor/spidermonkey/fdlibm/w_cosh.c +0 -77
  186. data/vendor/spidermonkey/fdlibm/w_exp.c +0 -88
  187. data/vendor/spidermonkey/fdlibm/w_fmod.c +0 -78
  188. data/vendor/spidermonkey/fdlibm/w_gamma.c +0 -85
  189. data/vendor/spidermonkey/fdlibm/w_gamma_r.c +0 -81
  190. data/vendor/spidermonkey/fdlibm/w_hypot.c +0 -78
  191. data/vendor/spidermonkey/fdlibm/w_j0.c +0 -105
  192. data/vendor/spidermonkey/fdlibm/w_j1.c +0 -106
  193. data/vendor/spidermonkey/fdlibm/w_jn.c +0 -128
  194. data/vendor/spidermonkey/fdlibm/w_lgamma.c +0 -85
  195. data/vendor/spidermonkey/fdlibm/w_lgamma_r.c +0 -81
  196. data/vendor/spidermonkey/fdlibm/w_log.c +0 -78
  197. data/vendor/spidermonkey/fdlibm/w_log10.c +0 -81
  198. data/vendor/spidermonkey/fdlibm/w_pow.c +0 -99
  199. data/vendor/spidermonkey/fdlibm/w_remainder.c +0 -77
  200. data/vendor/spidermonkey/fdlibm/w_scalb.c +0 -95
  201. data/vendor/spidermonkey/fdlibm/w_sinh.c +0 -77
  202. data/vendor/spidermonkey/fdlibm/w_sqrt.c +0 -77
  203. data/vendor/spidermonkey/javascript-trace.d +0 -73
  204. data/vendor/spidermonkey/js.c +0 -3951
  205. data/vendor/spidermonkey/js.mdp +0 -0
  206. data/vendor/spidermonkey/js.msg +0 -308
  207. data/vendor/spidermonkey/js.pkg +0 -2
  208. data/vendor/spidermonkey/js3240.rc +0 -79
  209. data/vendor/spidermonkey/jsOS240.def +0 -654
  210. data/vendor/spidermonkey/jsapi.c +0 -5836
  211. data/vendor/spidermonkey/jsapi.h +0 -2624
  212. data/vendor/spidermonkey/jsarena.c +0 -450
  213. data/vendor/spidermonkey/jsarena.h +0 -318
  214. data/vendor/spidermonkey/jsarray.c +0 -2996
  215. data/vendor/spidermonkey/jsarray.h +0 -127
  216. data/vendor/spidermonkey/jsatom.c +0 -1045
  217. data/vendor/spidermonkey/jsatom.h +0 -442
  218. data/vendor/spidermonkey/jsbit.h +0 -253
  219. data/vendor/spidermonkey/jsbool.c +0 -176
  220. data/vendor/spidermonkey/jsbool.h +0 -73
  221. data/vendor/spidermonkey/jsclist.h +0 -139
  222. data/vendor/spidermonkey/jscntxt.c +0 -1348
  223. data/vendor/spidermonkey/jscntxt.h +0 -1120
  224. data/vendor/spidermonkey/jscompat.h +0 -57
  225. data/vendor/spidermonkey/jsconfig.h +0 -248
  226. data/vendor/spidermonkey/jsconfig.mk +0 -181
  227. data/vendor/spidermonkey/jscpucfg.c +0 -396
  228. data/vendor/spidermonkey/jscpucfg.h +0 -212
  229. data/vendor/spidermonkey/jsdate.c +0 -2390
  230. data/vendor/spidermonkey/jsdate.h +0 -124
  231. data/vendor/spidermonkey/jsdbgapi.c +0 -1802
  232. data/vendor/spidermonkey/jsdbgapi.h +0 -464
  233. data/vendor/spidermonkey/jsdhash.c +0 -868
  234. data/vendor/spidermonkey/jsdhash.h +0 -592
  235. data/vendor/spidermonkey/jsdtoa.c +0 -3167
  236. data/vendor/spidermonkey/jsdtoa.h +0 -130
  237. data/vendor/spidermonkey/jsdtracef.c +0 -317
  238. data/vendor/spidermonkey/jsdtracef.h +0 -77
  239. data/vendor/spidermonkey/jsemit.c +0 -6909
  240. data/vendor/spidermonkey/jsemit.h +0 -741
  241. data/vendor/spidermonkey/jsexn.c +0 -1371
  242. data/vendor/spidermonkey/jsexn.h +0 -96
  243. data/vendor/spidermonkey/jsfile.c +0 -2736
  244. data/vendor/spidermonkey/jsfile.h +0 -56
  245. data/vendor/spidermonkey/jsfile.msg +0 -90
  246. data/vendor/spidermonkey/jsfun.c +0 -2634
  247. data/vendor/spidermonkey/jsfun.h +0 -254
  248. data/vendor/spidermonkey/jsgc.c +0 -3562
  249. data/vendor/spidermonkey/jsgc.h +0 -403
  250. data/vendor/spidermonkey/jshash.c +0 -476
  251. data/vendor/spidermonkey/jshash.h +0 -151
  252. data/vendor/spidermonkey/jsify.pl +0 -485
  253. data/vendor/spidermonkey/jsinterp.c +0 -7007
  254. data/vendor/spidermonkey/jsinterp.h +0 -525
  255. data/vendor/spidermonkey/jsinvoke.c +0 -43
  256. data/vendor/spidermonkey/jsiter.c +0 -1067
  257. data/vendor/spidermonkey/jsiter.h +0 -122
  258. data/vendor/spidermonkey/jskeyword.tbl +0 -124
  259. data/vendor/spidermonkey/jskwgen.c +0 -460
  260. data/vendor/spidermonkey/jslibmath.h +0 -266
  261. data/vendor/spidermonkey/jslock.c +0 -1309
  262. data/vendor/spidermonkey/jslock.h +0 -313
  263. data/vendor/spidermonkey/jslocko.asm +0 -60
  264. data/vendor/spidermonkey/jslog2.c +0 -94
  265. data/vendor/spidermonkey/jslong.c +0 -264
  266. data/vendor/spidermonkey/jslong.h +0 -412
  267. data/vendor/spidermonkey/jsmath.c +0 -567
  268. data/vendor/spidermonkey/jsmath.h +0 -57
  269. data/vendor/spidermonkey/jsnum.c +0 -1239
  270. data/vendor/spidermonkey/jsnum.h +0 -283
  271. data/vendor/spidermonkey/jsobj.c +0 -5282
  272. data/vendor/spidermonkey/jsobj.h +0 -709
  273. data/vendor/spidermonkey/jsopcode.c +0 -5245
  274. data/vendor/spidermonkey/jsopcode.h +0 -394
  275. data/vendor/spidermonkey/jsopcode.tbl +0 -523
  276. data/vendor/spidermonkey/jsotypes.h +0 -202
  277. data/vendor/spidermonkey/jsparse.c +0 -6704
  278. data/vendor/spidermonkey/jsparse.h +0 -511
  279. data/vendor/spidermonkey/jsprf.c +0 -1264
  280. data/vendor/spidermonkey/jsprf.h +0 -150
  281. data/vendor/spidermonkey/jsproto.tbl +0 -128
  282. data/vendor/spidermonkey/jsprvtd.h +0 -267
  283. data/vendor/spidermonkey/jspubtd.h +0 -744
  284. data/vendor/spidermonkey/jsregexp.c +0 -4364
  285. data/vendor/spidermonkey/jsregexp.h +0 -183
  286. data/vendor/spidermonkey/jsreops.tbl +0 -145
  287. data/vendor/spidermonkey/jsscan.c +0 -2012
  288. data/vendor/spidermonkey/jsscan.h +0 -387
  289. data/vendor/spidermonkey/jsscope.c +0 -1957
  290. data/vendor/spidermonkey/jsscope.h +0 -418
  291. data/vendor/spidermonkey/jsscript.c +0 -1832
  292. data/vendor/spidermonkey/jsscript.h +0 -287
  293. data/vendor/spidermonkey/jsshell.msg +0 -50
  294. data/vendor/spidermonkey/jsstddef.h +0 -83
  295. data/vendor/spidermonkey/jsstr.c +0 -5005
  296. data/vendor/spidermonkey/jsstr.h +0 -641
  297. data/vendor/spidermonkey/jstypes.h +0 -475
  298. data/vendor/spidermonkey/jsutil.c +0 -345
  299. data/vendor/spidermonkey/jsutil.h +0 -157
  300. data/vendor/spidermonkey/jsxdrapi.c +0 -800
  301. data/vendor/spidermonkey/jsxdrapi.h +0 -218
  302. data/vendor/spidermonkey/jsxml.c +0 -8476
  303. data/vendor/spidermonkey/jsxml.h +0 -349
  304. data/vendor/spidermonkey/lock_SunOS.s +0 -119
  305. data/vendor/spidermonkey/perfect.js +0 -39
  306. data/vendor/spidermonkey/plify_jsdhash.sed +0 -36
  307. data/vendor/spidermonkey/prmjtime.c +0 -846
  308. data/vendor/spidermonkey/prmjtime.h +0 -103
  309. data/vendor/spidermonkey/resource.h +0 -15
  310. data/vendor/spidermonkey/rules.mk +0 -197
  311. data/vendor/spidermonkey/win32.order +0 -384
@@ -1,1264 +0,0 @@
1
- /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2
- /* ***** BEGIN LICENSE BLOCK *****
3
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
4
- *
5
- * The contents of this file are subject to the Mozilla Public License Version
6
- * 1.1 (the "License"); you may not use this file except in compliance with
7
- * the License. You may obtain a copy of the License at
8
- * http://www.mozilla.org/MPL/
9
- *
10
- * Software distributed under the License is distributed on an "AS IS" basis,
11
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12
- * for the specific language governing rights and limitations under the
13
- * License.
14
- *
15
- * The Original Code is Mozilla Communicator client code, released
16
- * March 31, 1998.
17
- *
18
- * The Initial Developer of the Original Code is
19
- * Netscape Communications Corporation.
20
- * Portions created by the Initial Developer are Copyright (C) 1998
21
- * the Initial Developer. All Rights Reserved.
22
- *
23
- * Contributor(s):
24
- *
25
- * Alternatively, the contents of this file may be used under the terms of
26
- * either of the GNU General Public License Version 2 or later (the "GPL"),
27
- * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
28
- * in which case the provisions of the GPL or the LGPL are applicable instead
29
- * of those above. If you wish to allow use of your version of this file only
30
- * under the terms of either the GPL or the LGPL, and not to allow others to
31
- * use your version of this file under the terms of the MPL, indicate your
32
- * decision by deleting the provisions above and replace them with the notice
33
- * and other provisions required by the GPL or the LGPL. If you do not delete
34
- * the provisions above, a recipient may use your version of this file under
35
- * the terms of any one of the MPL, the GPL or the LGPL.
36
- *
37
- * ***** END LICENSE BLOCK ***** */
38
-
39
- /*
40
- ** Portable safe sprintf code.
41
- **
42
- ** Author: Kipp E.B. Hickman
43
- */
44
- #include "jsstddef.h"
45
- #include <stdarg.h>
46
- #include <stdio.h>
47
- #include <string.h>
48
- #include <stdlib.h>
49
- #include "jsprf.h"
50
- #include "jslong.h"
51
- #include "jsutil.h" /* Added by JSIFY */
52
- #include "jspubtd.h"
53
- #include "jsstr.h"
54
-
55
- /*
56
- ** Note: on some platforms va_list is defined as an array,
57
- ** and requires array notation.
58
- */
59
- #ifdef HAVE_VA_COPY
60
- #define VARARGS_ASSIGN(foo, bar) VA_COPY(foo,bar)
61
- #elif defined(va_copy)
62
- #define VARARGS_ASSIGN(foo, bar) va_copy(foo,bar)
63
- #elif defined(HAVE_VA_LIST_AS_ARRAY)
64
- #define VARARGS_ASSIGN(foo, bar) foo[0] = bar[0]
65
- #else
66
- #define VARARGS_ASSIGN(foo, bar) (foo) = (bar)
67
- #endif
68
-
69
- /*
70
- ** WARNING: This code may *NOT* call JS_LOG (because JS_LOG calls it)
71
- */
72
-
73
- /*
74
- ** XXX This needs to be internationalized!
75
- */
76
-
77
- typedef struct SprintfStateStr SprintfState;
78
-
79
- struct SprintfStateStr {
80
- int (*stuff)(SprintfState *ss, const char *sp, JSUint32 len);
81
-
82
- char *base;
83
- char *cur;
84
- JSUint32 maxlen;
85
-
86
- int (*func)(void *arg, const char *sp, JSUint32 len);
87
- void *arg;
88
- };
89
-
90
- /*
91
- ** Numbered Arguement State
92
- */
93
- struct NumArgState{
94
- int type; /* type of the current ap */
95
- va_list ap; /* point to the corresponding position on ap */
96
- };
97
-
98
- #define NAS_DEFAULT_NUM 20 /* default number of NumberedArgumentState array */
99
-
100
-
101
- #define TYPE_INT16 0
102
- #define TYPE_UINT16 1
103
- #define TYPE_INTN 2
104
- #define TYPE_UINTN 3
105
- #define TYPE_INT32 4
106
- #define TYPE_UINT32 5
107
- #define TYPE_INT64 6
108
- #define TYPE_UINT64 7
109
- #define TYPE_STRING 8
110
- #define TYPE_DOUBLE 9
111
- #define TYPE_INTSTR 10
112
- #define TYPE_WSTRING 11
113
- #define TYPE_UNKNOWN 20
114
-
115
- #define FLAG_LEFT 0x1
116
- #define FLAG_SIGNED 0x2
117
- #define FLAG_SPACED 0x4
118
- #define FLAG_ZEROS 0x8
119
- #define FLAG_NEG 0x10
120
-
121
- /*
122
- ** Fill into the buffer using the data in src
123
- */
124
- static int fill2(SprintfState *ss, const char *src, int srclen, int width,
125
- int flags)
126
- {
127
- char space = ' ';
128
- int rv;
129
-
130
- width -= srclen;
131
- if ((width > 0) && ((flags & FLAG_LEFT) == 0)) { /* Right adjusting */
132
- if (flags & FLAG_ZEROS) {
133
- space = '0';
134
- }
135
- while (--width >= 0) {
136
- rv = (*ss->stuff)(ss, &space, 1);
137
- if (rv < 0) {
138
- return rv;
139
- }
140
- }
141
- }
142
-
143
- /* Copy out the source data */
144
- rv = (*ss->stuff)(ss, src, (JSUint32)srclen);
145
- if (rv < 0) {
146
- return rv;
147
- }
148
-
149
- if ((width > 0) && ((flags & FLAG_LEFT) != 0)) { /* Left adjusting */
150
- while (--width >= 0) {
151
- rv = (*ss->stuff)(ss, &space, 1);
152
- if (rv < 0) {
153
- return rv;
154
- }
155
- }
156
- }
157
- return 0;
158
- }
159
-
160
- /*
161
- ** Fill a number. The order is: optional-sign zero-filling conversion-digits
162
- */
163
- static int fill_n(SprintfState *ss, const char *src, int srclen, int width,
164
- int prec, int type, int flags)
165
- {
166
- int zerowidth = 0;
167
- int precwidth = 0;
168
- int signwidth = 0;
169
- int leftspaces = 0;
170
- int rightspaces = 0;
171
- int cvtwidth;
172
- int rv;
173
- char sign;
174
-
175
- if ((type & 1) == 0) {
176
- if (flags & FLAG_NEG) {
177
- sign = '-';
178
- signwidth = 1;
179
- } else if (flags & FLAG_SIGNED) {
180
- sign = '+';
181
- signwidth = 1;
182
- } else if (flags & FLAG_SPACED) {
183
- sign = ' ';
184
- signwidth = 1;
185
- }
186
- }
187
- cvtwidth = signwidth + srclen;
188
-
189
- if (prec > 0) {
190
- if (prec > srclen) {
191
- precwidth = prec - srclen; /* Need zero filling */
192
- cvtwidth += precwidth;
193
- }
194
- }
195
-
196
- if ((flags & FLAG_ZEROS) && (prec < 0)) {
197
- if (width > cvtwidth) {
198
- zerowidth = width - cvtwidth; /* Zero filling */
199
- cvtwidth += zerowidth;
200
- }
201
- }
202
-
203
- if (flags & FLAG_LEFT) {
204
- if (width > cvtwidth) {
205
- /* Space filling on the right (i.e. left adjusting) */
206
- rightspaces = width - cvtwidth;
207
- }
208
- } else {
209
- if (width > cvtwidth) {
210
- /* Space filling on the left (i.e. right adjusting) */
211
- leftspaces = width - cvtwidth;
212
- }
213
- }
214
- while (--leftspaces >= 0) {
215
- rv = (*ss->stuff)(ss, " ", 1);
216
- if (rv < 0) {
217
- return rv;
218
- }
219
- }
220
- if (signwidth) {
221
- rv = (*ss->stuff)(ss, &sign, 1);
222
- if (rv < 0) {
223
- return rv;
224
- }
225
- }
226
- while (--precwidth >= 0) {
227
- rv = (*ss->stuff)(ss, "0", 1);
228
- if (rv < 0) {
229
- return rv;
230
- }
231
- }
232
- while (--zerowidth >= 0) {
233
- rv = (*ss->stuff)(ss, "0", 1);
234
- if (rv < 0) {
235
- return rv;
236
- }
237
- }
238
- rv = (*ss->stuff)(ss, src, (JSUint32)srclen);
239
- if (rv < 0) {
240
- return rv;
241
- }
242
- while (--rightspaces >= 0) {
243
- rv = (*ss->stuff)(ss, " ", 1);
244
- if (rv < 0) {
245
- return rv;
246
- }
247
- }
248
- return 0;
249
- }
250
-
251
- /*
252
- ** Convert a long into its printable form
253
- */
254
- static int cvt_l(SprintfState *ss, long num, int width, int prec, int radix,
255
- int type, int flags, const char *hexp)
256
- {
257
- char cvtbuf[100];
258
- char *cvt;
259
- int digits;
260
-
261
- /* according to the man page this needs to happen */
262
- if ((prec == 0) && (num == 0)) {
263
- return 0;
264
- }
265
-
266
- /*
267
- ** Converting decimal is a little tricky. In the unsigned case we
268
- ** need to stop when we hit 10 digits. In the signed case, we can
269
- ** stop when the number is zero.
270
- */
271
- cvt = cvtbuf + sizeof(cvtbuf);
272
- digits = 0;
273
- while (num) {
274
- int digit = (((unsigned long)num) % radix) & 0xF;
275
- *--cvt = hexp[digit];
276
- digits++;
277
- num = (long)(((unsigned long)num) / radix);
278
- }
279
- if (digits == 0) {
280
- *--cvt = '0';
281
- digits++;
282
- }
283
-
284
- /*
285
- ** Now that we have the number converted without its sign, deal with
286
- ** the sign and zero padding.
287
- */
288
- return fill_n(ss, cvt, digits, width, prec, type, flags);
289
- }
290
-
291
- /*
292
- ** Convert a 64-bit integer into its printable form
293
- */
294
- static int cvt_ll(SprintfState *ss, JSInt64 num, int width, int prec, int radix,
295
- int type, int flags, const char *hexp)
296
- {
297
- char cvtbuf[100];
298
- char *cvt;
299
- int digits;
300
- JSInt64 rad;
301
-
302
- /* according to the man page this needs to happen */
303
- if ((prec == 0) && (JSLL_IS_ZERO(num))) {
304
- return 0;
305
- }
306
-
307
- /*
308
- ** Converting decimal is a little tricky. In the unsigned case we
309
- ** need to stop when we hit 10 digits. In the signed case, we can
310
- ** stop when the number is zero.
311
- */
312
- JSLL_I2L(rad, radix);
313
- cvt = cvtbuf + sizeof(cvtbuf);
314
- digits = 0;
315
- while (!JSLL_IS_ZERO(num)) {
316
- JSInt32 digit;
317
- JSInt64 quot, rem;
318
- JSLL_UDIVMOD(&quot, &rem, num, rad);
319
- JSLL_L2I(digit, rem);
320
- *--cvt = hexp[digit & 0xf];
321
- digits++;
322
- num = quot;
323
- }
324
- if (digits == 0) {
325
- *--cvt = '0';
326
- digits++;
327
- }
328
-
329
- /*
330
- ** Now that we have the number converted without its sign, deal with
331
- ** the sign and zero padding.
332
- */
333
- return fill_n(ss, cvt, digits, width, prec, type, flags);
334
- }
335
-
336
- /*
337
- ** Convert a double precision floating point number into its printable
338
- ** form.
339
- **
340
- ** XXX stop using sprintf to convert floating point
341
- */
342
- static int cvt_f(SprintfState *ss, double d, const char *fmt0, const char *fmt1)
343
- {
344
- char fin[20];
345
- char fout[300];
346
- int amount = fmt1 - fmt0;
347
-
348
- JS_ASSERT((amount > 0) && (amount < (int)sizeof(fin)));
349
- if (amount >= (int)sizeof(fin)) {
350
- /* Totally bogus % command to sprintf. Just ignore it */
351
- return 0;
352
- }
353
- memcpy(fin, fmt0, (size_t)amount);
354
- fin[amount] = 0;
355
-
356
- /* Convert floating point using the native sprintf code */
357
- #ifdef DEBUG
358
- {
359
- const char *p = fin;
360
- while (*p) {
361
- JS_ASSERT(*p != 'L');
362
- p++;
363
- }
364
- }
365
- #endif
366
- sprintf(fout, fin, d);
367
-
368
- /*
369
- ** This assert will catch overflow's of fout, when building with
370
- ** debugging on. At least this way we can track down the evil piece
371
- ** of calling code and fix it!
372
- */
373
- JS_ASSERT(strlen(fout) < sizeof(fout));
374
-
375
- return (*ss->stuff)(ss, fout, strlen(fout));
376
- }
377
-
378
- /*
379
- ** Convert a string into its printable form. "width" is the output
380
- ** width. "prec" is the maximum number of characters of "s" to output,
381
- ** where -1 means until NUL.
382
- */
383
- static int cvt_s(SprintfState *ss, const char *s, int width, int prec,
384
- int flags)
385
- {
386
- int slen;
387
-
388
- if (prec == 0)
389
- return 0;
390
-
391
- /* Limit string length by precision value */
392
- slen = s ? strlen(s) : 6;
393
- if (prec > 0) {
394
- if (prec < slen) {
395
- slen = prec;
396
- }
397
- }
398
-
399
- /* and away we go */
400
- return fill2(ss, s ? s : "(null)", slen, width, flags);
401
- }
402
-
403
- static int cvt_ws(SprintfState *ss, const jschar *ws, int width, int prec,
404
- int flags)
405
- {
406
- int result;
407
- /*
408
- * Supply NULL as the JSContext; errors are not reported,
409
- * and malloc() is used to allocate the buffer buffer.
410
- */
411
- if (ws) {
412
- int slen = js_strlen(ws);
413
- char *s = js_DeflateString(NULL, ws, slen);
414
- if (!s)
415
- return -1; /* JSStuffFunc error indicator. */
416
- result = cvt_s(ss, s, width, prec, flags);
417
- free(s);
418
- } else {
419
- result = cvt_s(ss, NULL, width, prec, flags);
420
- }
421
- return result;
422
- }
423
-
424
- /*
425
- ** BuildArgArray stands for Numbered Argument list Sprintf
426
- ** for example,
427
- ** fmp = "%4$i, %2$d, %3s, %1d";
428
- ** the number must start from 1, and no gap among them
429
- */
430
-
431
- static struct NumArgState* BuildArgArray( const char *fmt, va_list ap, int* rv, struct NumArgState* nasArray )
432
- {
433
- int number = 0, cn = 0, i;
434
- const char *p;
435
- char c;
436
- struct NumArgState *nas;
437
-
438
-
439
- /*
440
- ** first pass:
441
- ** detemine how many legal % I have got, then allocate space
442
- */
443
-
444
- p = fmt;
445
- *rv = 0;
446
- i = 0;
447
- while( ( c = *p++ ) != 0 ){
448
- if( c != '%' )
449
- continue;
450
- if( ( c = *p++ ) == '%' ) /* skip %% case */
451
- continue;
452
-
453
- while( c != 0 ){
454
- if( c > '9' || c < '0' ){
455
- if( c == '$' ){ /* numbered argument csae */
456
- if( i > 0 ){
457
- *rv = -1;
458
- return NULL;
459
- }
460
- number++;
461
- } else { /* non-numbered argument case */
462
- if( number > 0 ){
463
- *rv = -1;
464
- return NULL;
465
- }
466
- i = 1;
467
- }
468
- break;
469
- }
470
-
471
- c = *p++;
472
- }
473
- }
474
-
475
- if( number == 0 ){
476
- return NULL;
477
- }
478
-
479
-
480
- if( number > NAS_DEFAULT_NUM ){
481
- nas = (struct NumArgState*)malloc( number * sizeof( struct NumArgState ) );
482
- if( !nas ){
483
- *rv = -1;
484
- return NULL;
485
- }
486
- } else {
487
- nas = nasArray;
488
- }
489
-
490
- for( i = 0; i < number; i++ ){
491
- nas[i].type = TYPE_UNKNOWN;
492
- }
493
-
494
-
495
- /*
496
- ** second pass:
497
- ** set nas[].type
498
- */
499
-
500
- p = fmt;
501
- while( ( c = *p++ ) != 0 ){
502
- if( c != '%' ) continue;
503
- c = *p++;
504
- if( c == '%' ) continue;
505
-
506
- cn = 0;
507
- while( c && c != '$' ){ /* should improve error check later */
508
- cn = cn*10 + c - '0';
509
- c = *p++;
510
- }
511
-
512
- if( !c || cn < 1 || cn > number ){
513
- *rv = -1;
514
- break;
515
- }
516
-
517
- /* nas[cn] starts from 0, and make sure nas[cn].type is not assigned */
518
- cn--;
519
- if( nas[cn].type != TYPE_UNKNOWN )
520
- continue;
521
-
522
- c = *p++;
523
-
524
- /* width */
525
- if (c == '*') {
526
- /* not supported feature, for the argument is not numbered */
527
- *rv = -1;
528
- break;
529
- }
530
-
531
- while ((c >= '0') && (c <= '9')) {
532
- c = *p++;
533
- }
534
-
535
- /* precision */
536
- if (c == '.') {
537
- c = *p++;
538
- if (c == '*') {
539
- /* not supported feature, for the argument is not numbered */
540
- *rv = -1;
541
- break;
542
- }
543
-
544
- while ((c >= '0') && (c <= '9')) {
545
- c = *p++;
546
- }
547
- }
548
-
549
- /* size */
550
- nas[cn].type = TYPE_INTN;
551
- if (c == 'h') {
552
- nas[cn].type = TYPE_INT16;
553
- c = *p++;
554
- } else if (c == 'L') {
555
- /* XXX not quite sure here */
556
- nas[cn].type = TYPE_INT64;
557
- c = *p++;
558
- } else if (c == 'l') {
559
- nas[cn].type = TYPE_INT32;
560
- c = *p++;
561
- if (c == 'l') {
562
- nas[cn].type = TYPE_INT64;
563
- c = *p++;
564
- }
565
- }
566
-
567
- /* format */
568
- switch (c) {
569
- case 'd':
570
- case 'c':
571
- case 'i':
572
- case 'o':
573
- case 'u':
574
- case 'x':
575
- case 'X':
576
- break;
577
-
578
- case 'e':
579
- case 'f':
580
- case 'g':
581
- nas[ cn ].type = TYPE_DOUBLE;
582
- break;
583
-
584
- case 'p':
585
- /* XXX should use cpp */
586
- if (sizeof(void *) == sizeof(JSInt32)) {
587
- nas[ cn ].type = TYPE_UINT32;
588
- } else if (sizeof(void *) == sizeof(JSInt64)) {
589
- nas[ cn ].type = TYPE_UINT64;
590
- } else if (sizeof(void *) == sizeof(JSIntn)) {
591
- nas[ cn ].type = TYPE_UINTN;
592
- } else {
593
- nas[ cn ].type = TYPE_UNKNOWN;
594
- }
595
- break;
596
-
597
- case 'C':
598
- case 'S':
599
- case 'E':
600
- case 'G':
601
- /* XXX not supported I suppose */
602
- JS_ASSERT(0);
603
- nas[ cn ].type = TYPE_UNKNOWN;
604
- break;
605
-
606
- case 's':
607
- nas[ cn ].type = (nas[ cn ].type == TYPE_UINT16) ? TYPE_WSTRING : TYPE_STRING;
608
- break;
609
-
610
- case 'n':
611
- nas[ cn ].type = TYPE_INTSTR;
612
- break;
613
-
614
- default:
615
- JS_ASSERT(0);
616
- nas[ cn ].type = TYPE_UNKNOWN;
617
- break;
618
- }
619
-
620
- /* get a legal para. */
621
- if( nas[ cn ].type == TYPE_UNKNOWN ){
622
- *rv = -1;
623
- break;
624
- }
625
- }
626
-
627
-
628
- /*
629
- ** third pass
630
- ** fill the nas[cn].ap
631
- */
632
-
633
- if( *rv < 0 ){
634
- if( nas != nasArray )
635
- free( nas );
636
- return NULL;
637
- }
638
-
639
- cn = 0;
640
- while( cn < number ){
641
- if( nas[cn].type == TYPE_UNKNOWN ){
642
- cn++;
643
- continue;
644
- }
645
-
646
- VARARGS_ASSIGN(nas[cn].ap, ap);
647
-
648
- switch( nas[cn].type ){
649
- case TYPE_INT16:
650
- case TYPE_UINT16:
651
- case TYPE_INTN:
652
- case TYPE_UINTN: (void)va_arg( ap, JSIntn ); break;
653
-
654
- case TYPE_INT32: (void)va_arg( ap, JSInt32 ); break;
655
-
656
- case TYPE_UINT32: (void)va_arg( ap, JSUint32 ); break;
657
-
658
- case TYPE_INT64: (void)va_arg( ap, JSInt64 ); break;
659
-
660
- case TYPE_UINT64: (void)va_arg( ap, JSUint64 ); break;
661
-
662
- case TYPE_STRING: (void)va_arg( ap, char* ); break;
663
-
664
- case TYPE_WSTRING: (void)va_arg( ap, jschar* ); break;
665
-
666
- case TYPE_INTSTR: (void)va_arg( ap, JSIntn* ); break;
667
-
668
- case TYPE_DOUBLE: (void)va_arg( ap, double ); break;
669
-
670
- default:
671
- if( nas != nasArray )
672
- free( nas );
673
- *rv = -1;
674
- return NULL;
675
- }
676
-
677
- cn++;
678
- }
679
-
680
-
681
- return nas;
682
- }
683
-
684
- /*
685
- ** The workhorse sprintf code.
686
- */
687
- static int dosprintf(SprintfState *ss, const char *fmt, va_list ap)
688
- {
689
- char c;
690
- int flags, width, prec, radix, type;
691
- union {
692
- char ch;
693
- jschar wch;
694
- int i;
695
- long l;
696
- JSInt64 ll;
697
- double d;
698
- const char *s;
699
- const jschar* ws;
700
- int *ip;
701
- } u;
702
- const char *fmt0;
703
- static char *hex = "0123456789abcdef";
704
- static char *HEX = "0123456789ABCDEF";
705
- char *hexp;
706
- int rv, i;
707
- struct NumArgState *nas = NULL;
708
- struct NumArgState nasArray[ NAS_DEFAULT_NUM ];
709
- char pattern[20];
710
- const char *dolPt = NULL; /* in "%4$.2f", dolPt will poiont to . */
711
- uint8 utf8buf[6];
712
- int utf8len;
713
-
714
- /*
715
- ** build an argument array, IF the fmt is numbered argument
716
- ** list style, to contain the Numbered Argument list pointers
717
- */
718
-
719
- nas = BuildArgArray( fmt, ap, &rv, nasArray );
720
- if( rv < 0 ){
721
- /* the fmt contains error Numbered Argument format, jliu@netscape.com */
722
- JS_ASSERT(0);
723
- return rv;
724
- }
725
-
726
- while ((c = *fmt++) != 0) {
727
- if (c != '%') {
728
- rv = (*ss->stuff)(ss, fmt - 1, 1);
729
- if (rv < 0) {
730
- return rv;
731
- }
732
- continue;
733
- }
734
- fmt0 = fmt - 1;
735
-
736
- /*
737
- ** Gobble up the % format string. Hopefully we have handled all
738
- ** of the strange cases!
739
- */
740
- flags = 0;
741
- c = *fmt++;
742
- if (c == '%') {
743
- /* quoting a % with %% */
744
- rv = (*ss->stuff)(ss, fmt - 1, 1);
745
- if (rv < 0) {
746
- return rv;
747
- }
748
- continue;
749
- }
750
-
751
- if( nas != NULL ){
752
- /* the fmt contains the Numbered Arguments feature */
753
- i = 0;
754
- while( c && c != '$' ){ /* should imporve error check later */
755
- i = ( i * 10 ) + ( c - '0' );
756
- c = *fmt++;
757
- }
758
-
759
- if( nas[i-1].type == TYPE_UNKNOWN ){
760
- if( nas && ( nas != nasArray ) )
761
- free( nas );
762
- return -1;
763
- }
764
-
765
- ap = nas[i-1].ap;
766
- dolPt = fmt;
767
- c = *fmt++;
768
- }
769
-
770
- /*
771
- * Examine optional flags. Note that we do not implement the
772
- * '#' flag of sprintf(). The ANSI C spec. of the '#' flag is
773
- * somewhat ambiguous and not ideal, which is perhaps why
774
- * the various sprintf() implementations are inconsistent
775
- * on this feature.
776
- */
777
- while ((c == '-') || (c == '+') || (c == ' ') || (c == '0')) {
778
- if (c == '-') flags |= FLAG_LEFT;
779
- if (c == '+') flags |= FLAG_SIGNED;
780
- if (c == ' ') flags |= FLAG_SPACED;
781
- if (c == '0') flags |= FLAG_ZEROS;
782
- c = *fmt++;
783
- }
784
- if (flags & FLAG_SIGNED) flags &= ~FLAG_SPACED;
785
- if (flags & FLAG_LEFT) flags &= ~FLAG_ZEROS;
786
-
787
- /* width */
788
- if (c == '*') {
789
- c = *fmt++;
790
- width = va_arg(ap, int);
791
- } else {
792
- width = 0;
793
- while ((c >= '0') && (c <= '9')) {
794
- width = (width * 10) + (c - '0');
795
- c = *fmt++;
796
- }
797
- }
798
-
799
- /* precision */
800
- prec = -1;
801
- if (c == '.') {
802
- c = *fmt++;
803
- if (c == '*') {
804
- c = *fmt++;
805
- prec = va_arg(ap, int);
806
- } else {
807
- prec = 0;
808
- while ((c >= '0') && (c <= '9')) {
809
- prec = (prec * 10) + (c - '0');
810
- c = *fmt++;
811
- }
812
- }
813
- }
814
-
815
- /* size */
816
- type = TYPE_INTN;
817
- if (c == 'h') {
818
- type = TYPE_INT16;
819
- c = *fmt++;
820
- } else if (c == 'L') {
821
- /* XXX not quite sure here */
822
- type = TYPE_INT64;
823
- c = *fmt++;
824
- } else if (c == 'l') {
825
- type = TYPE_INT32;
826
- c = *fmt++;
827
- if (c == 'l') {
828
- type = TYPE_INT64;
829
- c = *fmt++;
830
- }
831
- }
832
-
833
- /* format */
834
- hexp = hex;
835
- switch (c) {
836
- case 'd': case 'i': /* decimal/integer */
837
- radix = 10;
838
- goto fetch_and_convert;
839
-
840
- case 'o': /* octal */
841
- radix = 8;
842
- type |= 1;
843
- goto fetch_and_convert;
844
-
845
- case 'u': /* unsigned decimal */
846
- radix = 10;
847
- type |= 1;
848
- goto fetch_and_convert;
849
-
850
- case 'x': /* unsigned hex */
851
- radix = 16;
852
- type |= 1;
853
- goto fetch_and_convert;
854
-
855
- case 'X': /* unsigned HEX */
856
- radix = 16;
857
- hexp = HEX;
858
- type |= 1;
859
- goto fetch_and_convert;
860
-
861
- fetch_and_convert:
862
- switch (type) {
863
- case TYPE_INT16:
864
- u.l = va_arg(ap, int);
865
- if (u.l < 0) {
866
- u.l = -u.l;
867
- flags |= FLAG_NEG;
868
- }
869
- goto do_long;
870
- case TYPE_UINT16:
871
- u.l = va_arg(ap, int) & 0xffff;
872
- goto do_long;
873
- case TYPE_INTN:
874
- u.l = va_arg(ap, int);
875
- if (u.l < 0) {
876
- u.l = -u.l;
877
- flags |= FLAG_NEG;
878
- }
879
- goto do_long;
880
- case TYPE_UINTN:
881
- u.l = (long)va_arg(ap, unsigned int);
882
- goto do_long;
883
-
884
- case TYPE_INT32:
885
- u.l = va_arg(ap, JSInt32);
886
- if (u.l < 0) {
887
- u.l = -u.l;
888
- flags |= FLAG_NEG;
889
- }
890
- goto do_long;
891
- case TYPE_UINT32:
892
- u.l = (long)va_arg(ap, JSUint32);
893
- do_long:
894
- rv = cvt_l(ss, u.l, width, prec, radix, type, flags, hexp);
895
- if (rv < 0) {
896
- return rv;
897
- }
898
- break;
899
-
900
- case TYPE_INT64:
901
- u.ll = va_arg(ap, JSInt64);
902
- if (!JSLL_GE_ZERO(u.ll)) {
903
- JSLL_NEG(u.ll, u.ll);
904
- flags |= FLAG_NEG;
905
- }
906
- goto do_longlong;
907
- case TYPE_UINT64:
908
- u.ll = va_arg(ap, JSUint64);
909
- do_longlong:
910
- rv = cvt_ll(ss, u.ll, width, prec, radix, type, flags, hexp);
911
- if (rv < 0) {
912
- return rv;
913
- }
914
- break;
915
- }
916
- break;
917
-
918
- case 'e':
919
- case 'E':
920
- case 'f':
921
- case 'g':
922
- u.d = va_arg(ap, double);
923
- if( nas != NULL ){
924
- i = fmt - dolPt;
925
- if( i < (int)sizeof( pattern ) ){
926
- pattern[0] = '%';
927
- memcpy( &pattern[1], dolPt, (size_t)i );
928
- rv = cvt_f(ss, u.d, pattern, &pattern[i+1] );
929
- }
930
- } else
931
- rv = cvt_f(ss, u.d, fmt0, fmt);
932
-
933
- if (rv < 0) {
934
- return rv;
935
- }
936
- break;
937
-
938
- case 'c':
939
- if ((flags & FLAG_LEFT) == 0) {
940
- while (width-- > 1) {
941
- rv = (*ss->stuff)(ss, " ", 1);
942
- if (rv < 0) {
943
- return rv;
944
- }
945
- }
946
- }
947
- switch (type) {
948
- case TYPE_INT16:
949
- /* Treat %hc as %c unless js_CStringsAreUTF8. */
950
- if (js_CStringsAreUTF8) {
951
- u.wch = va_arg(ap, int);
952
- utf8len = js_OneUcs4ToUtf8Char (utf8buf, u.wch);
953
- rv = (*ss->stuff)(ss, (char *)utf8buf, utf8len);
954
- break;
955
- }
956
- case TYPE_INTN:
957
- u.ch = va_arg(ap, int);
958
- rv = (*ss->stuff)(ss, &u.ch, 1);
959
- break;
960
- }
961
- if (rv < 0) {
962
- return rv;
963
- }
964
- if (flags & FLAG_LEFT) {
965
- while (width-- > 1) {
966
- rv = (*ss->stuff)(ss, " ", 1);
967
- if (rv < 0) {
968
- return rv;
969
- }
970
- }
971
- }
972
- break;
973
-
974
- case 'p':
975
- if (sizeof(void *) == sizeof(JSInt32)) {
976
- type = TYPE_UINT32;
977
- } else if (sizeof(void *) == sizeof(JSInt64)) {
978
- type = TYPE_UINT64;
979
- } else if (sizeof(void *) == sizeof(int)) {
980
- type = TYPE_UINTN;
981
- } else {
982
- JS_ASSERT(0);
983
- break;
984
- }
985
- radix = 16;
986
- goto fetch_and_convert;
987
-
988
- #if 0
989
- case 'C':
990
- case 'S':
991
- case 'E':
992
- case 'G':
993
- /* XXX not supported I suppose */
994
- JS_ASSERT(0);
995
- break;
996
- #endif
997
-
998
- case 's':
999
- if(type == TYPE_INT16) {
1000
- /*
1001
- * This would do a simple string/byte conversion
1002
- * unless js_CStringsAreUTF8.
1003
- */
1004
- u.ws = va_arg(ap, const jschar*);
1005
- rv = cvt_ws(ss, u.ws, width, prec, flags);
1006
- } else {
1007
- u.s = va_arg(ap, const char*);
1008
- rv = cvt_s(ss, u.s, width, prec, flags);
1009
- }
1010
- if (rv < 0) {
1011
- return rv;
1012
- }
1013
- break;
1014
-
1015
- case 'n':
1016
- u.ip = va_arg(ap, int*);
1017
- if (u.ip) {
1018
- *u.ip = ss->cur - ss->base;
1019
- }
1020
- break;
1021
-
1022
- default:
1023
- /* Not a % token after all... skip it */
1024
- #if 0
1025
- JS_ASSERT(0);
1026
- #endif
1027
- rv = (*ss->stuff)(ss, "%", 1);
1028
- if (rv < 0) {
1029
- return rv;
1030
- }
1031
- rv = (*ss->stuff)(ss, fmt - 1, 1);
1032
- if (rv < 0) {
1033
- return rv;
1034
- }
1035
- }
1036
- }
1037
-
1038
- /* Stuff trailing NUL */
1039
- rv = (*ss->stuff)(ss, "\0", 1);
1040
-
1041
- if( nas && ( nas != nasArray ) ){
1042
- free( nas );
1043
- }
1044
-
1045
- return rv;
1046
- }
1047
-
1048
- /************************************************************************/
1049
-
1050
- static int FuncStuff(SprintfState *ss, const char *sp, JSUint32 len)
1051
- {
1052
- int rv;
1053
-
1054
- rv = (*ss->func)(ss->arg, sp, len);
1055
- if (rv < 0) {
1056
- return rv;
1057
- }
1058
- ss->maxlen += len;
1059
- return 0;
1060
- }
1061
-
1062
- JS_PUBLIC_API(JSUint32) JS_sxprintf(JSStuffFunc func, void *arg,
1063
- const char *fmt, ...)
1064
- {
1065
- va_list ap;
1066
- int rv;
1067
-
1068
- va_start(ap, fmt);
1069
- rv = JS_vsxprintf(func, arg, fmt, ap);
1070
- va_end(ap);
1071
- return rv;
1072
- }
1073
-
1074
- JS_PUBLIC_API(JSUint32) JS_vsxprintf(JSStuffFunc func, void *arg,
1075
- const char *fmt, va_list ap)
1076
- {
1077
- SprintfState ss;
1078
- int rv;
1079
-
1080
- ss.stuff = FuncStuff;
1081
- ss.func = func;
1082
- ss.arg = arg;
1083
- ss.maxlen = 0;
1084
- rv = dosprintf(&ss, fmt, ap);
1085
- return (rv < 0) ? (JSUint32)-1 : ss.maxlen;
1086
- }
1087
-
1088
- /*
1089
- ** Stuff routine that automatically grows the malloc'd output buffer
1090
- ** before it overflows.
1091
- */
1092
- static int GrowStuff(SprintfState *ss, const char *sp, JSUint32 len)
1093
- {
1094
- ptrdiff_t off;
1095
- char *newbase;
1096
- JSUint32 newlen;
1097
-
1098
- off = ss->cur - ss->base;
1099
- if (off + len >= ss->maxlen) {
1100
- /* Grow the buffer */
1101
- newlen = ss->maxlen + ((len > 32) ? len : 32);
1102
- if (ss->base) {
1103
- newbase = (char*) realloc(ss->base, newlen);
1104
- } else {
1105
- newbase = (char*) malloc(newlen);
1106
- }
1107
- if (!newbase) {
1108
- /* Ran out of memory */
1109
- return -1;
1110
- }
1111
- ss->base = newbase;
1112
- ss->maxlen = newlen;
1113
- ss->cur = ss->base + off;
1114
- }
1115
-
1116
- /* Copy data */
1117
- while (len) {
1118
- --len;
1119
- *ss->cur++ = *sp++;
1120
- }
1121
- JS_ASSERT((JSUint32)(ss->cur - ss->base) <= ss->maxlen);
1122
- return 0;
1123
- }
1124
-
1125
- /*
1126
- ** sprintf into a malloc'd buffer
1127
- */
1128
- JS_PUBLIC_API(char *) JS_smprintf(const char *fmt, ...)
1129
- {
1130
- va_list ap;
1131
- char *rv;
1132
-
1133
- va_start(ap, fmt);
1134
- rv = JS_vsmprintf(fmt, ap);
1135
- va_end(ap);
1136
- return rv;
1137
- }
1138
-
1139
- /*
1140
- ** Free memory allocated, for the caller, by JS_smprintf
1141
- */
1142
- JS_PUBLIC_API(void) JS_smprintf_free(char *mem)
1143
- {
1144
- free(mem);
1145
- }
1146
-
1147
- JS_PUBLIC_API(char *) JS_vsmprintf(const char *fmt, va_list ap)
1148
- {
1149
- SprintfState ss;
1150
- int rv;
1151
-
1152
- ss.stuff = GrowStuff;
1153
- ss.base = 0;
1154
- ss.cur = 0;
1155
- ss.maxlen = 0;
1156
- rv = dosprintf(&ss, fmt, ap);
1157
- if (rv < 0) {
1158
- if (ss.base) {
1159
- free(ss.base);
1160
- }
1161
- return 0;
1162
- }
1163
- return ss.base;
1164
- }
1165
-
1166
- /*
1167
- ** Stuff routine that discards overflow data
1168
- */
1169
- static int LimitStuff(SprintfState *ss, const char *sp, JSUint32 len)
1170
- {
1171
- JSUint32 limit = ss->maxlen - (ss->cur - ss->base);
1172
-
1173
- if (len > limit) {
1174
- len = limit;
1175
- }
1176
- while (len) {
1177
- --len;
1178
- *ss->cur++ = *sp++;
1179
- }
1180
- return 0;
1181
- }
1182
-
1183
- /*
1184
- ** sprintf into a fixed size buffer. Make sure there is a NUL at the end
1185
- ** when finished.
1186
- */
1187
- JS_PUBLIC_API(JSUint32) JS_snprintf(char *out, JSUint32 outlen, const char *fmt, ...)
1188
- {
1189
- va_list ap;
1190
- int rv;
1191
-
1192
- JS_ASSERT((JSInt32)outlen > 0);
1193
- if ((JSInt32)outlen <= 0) {
1194
- return 0;
1195
- }
1196
-
1197
- va_start(ap, fmt);
1198
- rv = JS_vsnprintf(out, outlen, fmt, ap);
1199
- va_end(ap);
1200
- return rv;
1201
- }
1202
-
1203
- JS_PUBLIC_API(JSUint32) JS_vsnprintf(char *out, JSUint32 outlen,const char *fmt,
1204
- va_list ap)
1205
- {
1206
- SprintfState ss;
1207
- JSUint32 n;
1208
-
1209
- JS_ASSERT((JSInt32)outlen > 0);
1210
- if ((JSInt32)outlen <= 0) {
1211
- return 0;
1212
- }
1213
-
1214
- ss.stuff = LimitStuff;
1215
- ss.base = out;
1216
- ss.cur = out;
1217
- ss.maxlen = outlen;
1218
- (void) dosprintf(&ss, fmt, ap);
1219
-
1220
- /* If we added chars, and we didn't append a null, do it now. */
1221
- if( (ss.cur != ss.base) && (ss.cur[-1] != '\0') )
1222
- ss.cur[-1] = '\0';
1223
-
1224
- n = ss.cur - ss.base;
1225
- return n ? n - 1 : n;
1226
- }
1227
-
1228
- JS_PUBLIC_API(char *) JS_sprintf_append(char *last, const char *fmt, ...)
1229
- {
1230
- va_list ap;
1231
- char *rv;
1232
-
1233
- va_start(ap, fmt);
1234
- rv = JS_vsprintf_append(last, fmt, ap);
1235
- va_end(ap);
1236
- return rv;
1237
- }
1238
-
1239
- JS_PUBLIC_API(char *) JS_vsprintf_append(char *last, const char *fmt, va_list ap)
1240
- {
1241
- SprintfState ss;
1242
- int rv;
1243
-
1244
- ss.stuff = GrowStuff;
1245
- if (last) {
1246
- int lastlen = strlen(last);
1247
- ss.base = last;
1248
- ss.cur = last + lastlen;
1249
- ss.maxlen = lastlen;
1250
- } else {
1251
- ss.base = 0;
1252
- ss.cur = 0;
1253
- ss.maxlen = 0;
1254
- }
1255
- rv = dosprintf(&ss, fmt, ap);
1256
- if (rv < 0) {
1257
- if (ss.base) {
1258
- free(ss.base);
1259
- }
1260
- return 0;
1261
- }
1262
- return ss.base;
1263
- }
1264
-