distil 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (552) hide show
  1. data/Rakefile +28 -0
  2. data/VERSION +1 -0
  3. data/bin/distil +45 -0
  4. data/distil.gemspec +586 -0
  5. data/lib/bootstrap-template.js +56 -0
  6. data/lib/configurable.rb +125 -0
  7. data/lib/file-set.rb +42 -0
  8. data/lib/file-types/css-file.rb +75 -0
  9. data/lib/file-types/html-file.rb +11 -0
  10. data/lib/file-types/javascript-file.rb +98 -0
  11. data/lib/file-types/json-file.rb +14 -0
  12. data/lib/file-types/nib-file.rb +9 -0
  13. data/lib/jsdoc.conf +18 -0
  14. data/lib/jsl.conf +121 -0
  15. data/lib/project.rb +96 -0
  16. data/lib/source-file.rb +181 -0
  17. data/lib/target.rb +96 -0
  18. data/lib/task.rb +239 -0
  19. data/lib/tasks/copy-task.rb +21 -0
  20. data/lib/tasks/css-task.rb +18 -0
  21. data/lib/tasks/javascript-task.rb +125 -0
  22. data/lib/tasks/multiple-output-task.rb +134 -0
  23. data/lib/tasks/nib-task.rb +83 -0
  24. data/lib/tasks/output-task.rb +73 -0
  25. data/lib/tasks/single-output-task.rb +83 -0
  26. data/lib/tasks/test-task.rb +280 -0
  27. data/lib/test/HtmlTestReporter.js +127 -0
  28. data/lib/test/Test.js +248 -0
  29. data/lib/test/TestReporter.js +79 -0
  30. data/lib/test/TestRunner.js +132 -0
  31. data/lib/test/browser.rb +97 -0
  32. data/lib/test/scriptwrapper.html +10 -0
  33. data/lib/test/unittest.html +127 -0
  34. data/vendor/Makefile +35 -0
  35. data/vendor/extconf.rb +3 -0
  36. data/vendor/jsdoc-extras/plugins/distil-plugin.js +142 -0
  37. data/vendor/jsdoc-extras/plugins/interface-plugin.js +36 -0
  38. data/vendor/jsdoc-extras/templates/coherent/allclasses.tmpl +17 -0
  39. data/vendor/jsdoc-extras/templates/coherent/allfiles.tmpl +53 -0
  40. data/vendor/jsdoc-extras/templates/coherent/class.tmpl +803 -0
  41. data/vendor/jsdoc-extras/templates/coherent/index.tmpl +37 -0
  42. data/vendor/jsdoc-extras/templates/coherent/publish.js +242 -0
  43. data/vendor/jsdoc-extras/templates/coherent/showdown.js +421 -0
  44. data/vendor/jsdoc-extras/templates/coherent/static/code-footer.html +3 -0
  45. data/vendor/jsdoc-extras/templates/coherent/static/code-header.html +7 -0
  46. data/vendor/jsdoc-extras/templates/coherent/static/default.css +297 -0
  47. data/vendor/jsdoc-extras/templates/coherent/static/header.html +2 -0
  48. data/vendor/jsdoc-extras/templates/coherent/static/index.html +19 -0
  49. data/vendor/jsdoc-extras/templates/coherent/symbol.tmpl +35 -0
  50. data/vendor/jsdoc-toolkit/README.txt +183 -0
  51. data/vendor/jsdoc-toolkit/app/frame/Chain.js +102 -0
  52. data/vendor/jsdoc-toolkit/app/frame/Dumper.js +144 -0
  53. data/vendor/jsdoc-toolkit/app/frame/Hash.js +84 -0
  54. data/vendor/jsdoc-toolkit/app/frame/Link.js +171 -0
  55. data/vendor/jsdoc-toolkit/app/frame/Namespace.js +10 -0
  56. data/vendor/jsdoc-toolkit/app/frame/Opt.js +134 -0
  57. data/vendor/jsdoc-toolkit/app/frame/Reflection.js +26 -0
  58. data/vendor/jsdoc-toolkit/app/frame/String.js +93 -0
  59. data/vendor/jsdoc-toolkit/app/frame/Testrun.js +129 -0
  60. data/vendor/jsdoc-toolkit/app/frame.js +33 -0
  61. data/vendor/jsdoc-toolkit/app/handlers/FOODOC.js +26 -0
  62. data/vendor/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js +159 -0
  63. data/vendor/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js +16 -0
  64. data/vendor/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js +292 -0
  65. data/vendor/jsdoc-toolkit/app/handlers/XMLDOC.js +26 -0
  66. data/vendor/jsdoc-toolkit/app/lib/JSDOC/DocComment.js +204 -0
  67. data/vendor/jsdoc-toolkit/app/lib/JSDOC/DocTag.js +300 -0
  68. data/vendor/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js +126 -0
  69. data/vendor/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js +109 -0
  70. data/vendor/jsdoc-toolkit/app/lib/JSDOC/Lang.js +144 -0
  71. data/vendor/jsdoc-toolkit/app/lib/JSDOC/Parser.js +144 -0
  72. data/vendor/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js +33 -0
  73. data/vendor/jsdoc-toolkit/app/lib/JSDOC/Symbol.js +644 -0
  74. data/vendor/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js +241 -0
  75. data/vendor/jsdoc-toolkit/app/lib/JSDOC/TextStream.js +41 -0
  76. data/vendor/jsdoc-toolkit/app/lib/JSDOC/Token.js +18 -0
  77. data/vendor/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js +332 -0
  78. data/vendor/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js +133 -0
  79. data/vendor/jsdoc-toolkit/app/lib/JSDOC/Util.js +32 -0
  80. data/vendor/jsdoc-toolkit/app/lib/JSDOC/Walker.js +499 -0
  81. data/vendor/jsdoc-toolkit/app/lib/JSDOC.js +106 -0
  82. data/vendor/jsdoc-toolkit/app/main.js +129 -0
  83. data/vendor/jsdoc-toolkit/app/plugins/commentSrcJson.js +20 -0
  84. data/vendor/jsdoc-toolkit/app/plugins/frameworkPrototype.js +16 -0
  85. data/vendor/jsdoc-toolkit/app/plugins/functionCall.js +10 -0
  86. data/vendor/jsdoc-toolkit/app/plugins/publishSrcHilite.js +54 -0
  87. data/vendor/jsdoc-toolkit/app/plugins/symbolLink.js +10 -0
  88. data/vendor/jsdoc-toolkit/app/plugins/tagParamConfig.js +31 -0
  89. data/vendor/jsdoc-toolkit/app/plugins/tagSynonyms.js +43 -0
  90. data/vendor/jsdoc-toolkit/app/run.js +348 -0
  91. data/vendor/jsdoc-toolkit/app/t/TestDoc.js +144 -0
  92. data/vendor/jsdoc-toolkit/app/t/runner.js +13 -0
  93. data/vendor/jsdoc-toolkit/app/test/addon.js +24 -0
  94. data/vendor/jsdoc-toolkit/app/test/anon_inner.js +14 -0
  95. data/vendor/jsdoc-toolkit/app/test/augments.js +31 -0
  96. data/vendor/jsdoc-toolkit/app/test/augments2.js +26 -0
  97. data/vendor/jsdoc-toolkit/app/test/borrows.js +46 -0
  98. data/vendor/jsdoc-toolkit/app/test/borrows2.js +23 -0
  99. data/vendor/jsdoc-toolkit/app/test/config.js +22 -0
  100. data/vendor/jsdoc-toolkit/app/test/constructs.js +18 -0
  101. data/vendor/jsdoc-toolkit/app/test/encoding.js +10 -0
  102. data/vendor/jsdoc-toolkit/app/test/encoding_other.js +12 -0
  103. data/vendor/jsdoc-toolkit/app/test/event.js +54 -0
  104. data/vendor/jsdoc-toolkit/app/test/exports.js +14 -0
  105. data/vendor/jsdoc-toolkit/app/test/functions_anon.js +39 -0
  106. data/vendor/jsdoc-toolkit/app/test/functions_nested.js +33 -0
  107. data/vendor/jsdoc-toolkit/app/test/global.js +13 -0
  108. data/vendor/jsdoc-toolkit/app/test/globals.js +25 -0
  109. data/vendor/jsdoc-toolkit/app/test/ignore.js +10 -0
  110. data/vendor/jsdoc-toolkit/app/test/inner.js +16 -0
  111. data/vendor/jsdoc-toolkit/app/test/jsdoc_test.js +477 -0
  112. data/vendor/jsdoc-toolkit/app/test/lend.js +33 -0
  113. data/vendor/jsdoc-toolkit/app/test/memberof.js +19 -0
  114. data/vendor/jsdoc-toolkit/app/test/memberof2.js +38 -0
  115. data/vendor/jsdoc-toolkit/app/test/memberof3.js +33 -0
  116. data/vendor/jsdoc-toolkit/app/test/memberof_constructor.js +17 -0
  117. data/vendor/jsdoc-toolkit/app/test/module.js +17 -0
  118. data/vendor/jsdoc-toolkit/app/test/name.js +19 -0
  119. data/vendor/jsdoc-toolkit/app/test/namespace_nested.js +23 -0
  120. data/vendor/jsdoc-toolkit/app/test/nocode.js +13 -0
  121. data/vendor/jsdoc-toolkit/app/test/oblit_anon.js +20 -0
  122. data/vendor/jsdoc-toolkit/app/test/overview.js +20 -0
  123. data/vendor/jsdoc-toolkit/app/test/param_inline.js +37 -0
  124. data/vendor/jsdoc-toolkit/app/test/params_optional.js +8 -0
  125. data/vendor/jsdoc-toolkit/app/test/prototype.js +17 -0
  126. data/vendor/jsdoc-toolkit/app/test/prototype_nested.js +9 -0
  127. data/vendor/jsdoc-toolkit/app/test/prototype_oblit.js +13 -0
  128. data/vendor/jsdoc-toolkit/app/test/prototype_oblit_constructor.js +24 -0
  129. data/vendor/jsdoc-toolkit/app/test/public.js +10 -0
  130. data/vendor/jsdoc-toolkit/app/test/scripts/code.js +5 -0
  131. data/vendor/jsdoc-toolkit/app/test/scripts/notcode.txt +5 -0
  132. data/vendor/jsdoc-toolkit/app/test/shared.js +42 -0
  133. data/vendor/jsdoc-toolkit/app/test/shared2.js +2 -0
  134. data/vendor/jsdoc-toolkit/app/test/shortcuts.js +22 -0
  135. data/vendor/jsdoc-toolkit/app/test/static_this.js +13 -0
  136. data/vendor/jsdoc-toolkit/app/test/synonyms.js +31 -0
  137. data/vendor/jsdoc-toolkit/app/test/tosource.js +23 -0
  138. data/vendor/jsdoc-toolkit/app/test/variable_redefine.js +14 -0
  139. data/vendor/jsdoc-toolkit/app/test.js +342 -0
  140. data/vendor/jsdoc-toolkit/changes.txt +116 -0
  141. data/vendor/jsdoc-toolkit/conf/sample.conf +31 -0
  142. data/vendor/jsdoc-toolkit/java/build.xml +36 -0
  143. data/vendor/jsdoc-toolkit/java/build_1.4.xml +36 -0
  144. data/vendor/jsdoc-toolkit/java/classes/js.jar +0 -0
  145. data/vendor/jsdoc-toolkit/java/src/JsDebugRun.java +21 -0
  146. data/vendor/jsdoc-toolkit/java/src/JsRun.java +21 -0
  147. data/vendor/jsdoc-toolkit/jsdebug.jar +0 -0
  148. data/vendor/jsdoc-toolkit/jsrun.jar +0 -0
  149. data/vendor/jsdoc-toolkit/jsrun.sh +53 -0
  150. data/vendor/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl +17 -0
  151. data/vendor/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl +56 -0
  152. data/vendor/jsdoc-toolkit/templates/jsdoc/class.tmpl +649 -0
  153. data/vendor/jsdoc-toolkit/templates/jsdoc/index.tmpl +39 -0
  154. data/vendor/jsdoc-toolkit/templates/jsdoc/publish.js +201 -0
  155. data/vendor/jsdoc-toolkit/templates/jsdoc/static/code-footer.html +3 -0
  156. data/vendor/jsdoc-toolkit/templates/jsdoc/static/code-header.html +14 -0
  157. data/vendor/jsdoc-toolkit/templates/jsdoc/static/default.css +162 -0
  158. data/vendor/jsdoc-toolkit/templates/jsdoc/static/header.html +2 -0
  159. data/vendor/jsdoc-toolkit/templates/jsdoc/static/index.html +19 -0
  160. data/vendor/jsdoc-toolkit/templates/jsdoc/symbol.tmpl +35 -0
  161. data/vendor/jsl-0.3.0/src/JavaScriptLintAPI.cpp +333 -0
  162. data/vendor/jsl-0.3.0/src/JavaScriptLintAPI.h +86 -0
  163. data/vendor/jsl-0.3.0/src/Makefile.in +375 -0
  164. data/vendor/jsl-0.3.0/src/Makefile.ref +372 -0
  165. data/vendor/jsl-0.3.0/src/README.html +826 -0
  166. data/vendor/jsl-0.3.0/src/SpiderMonkey.rsp +12 -0
  167. data/vendor/jsl-0.3.0/src/_jsl_online.php +223 -0
  168. data/vendor/jsl-0.3.0/src/config/AIX4.1.mk +65 -0
  169. data/vendor/jsl-0.3.0/src/config/AIX4.2.mk +64 -0
  170. data/vendor/jsl-0.3.0/src/config/AIX4.3.mk +65 -0
  171. data/vendor/jsl-0.3.0/src/config/Darwin.mk +81 -0
  172. data/vendor/jsl-0.3.0/src/config/Darwin1.3.mk +81 -0
  173. data/vendor/jsl-0.3.0/src/config/Darwin1.4.mk +41 -0
  174. data/vendor/jsl-0.3.0/src/config/Darwin5.2.mk +81 -0
  175. data/vendor/jsl-0.3.0/src/config/Darwin5.3.mk +81 -0
  176. data/vendor/jsl-0.3.0/src/config/HP-UXB.10.10.mk +77 -0
  177. data/vendor/jsl-0.3.0/src/config/HP-UXB.10.20.mk +77 -0
  178. data/vendor/jsl-0.3.0/src/config/HP-UXB.11.00.mk +80 -0
  179. data/vendor/jsl-0.3.0/src/config/IRIX.mk +87 -0
  180. data/vendor/jsl-0.3.0/src/config/IRIX5.3.mk +44 -0
  181. data/vendor/jsl-0.3.0/src/config/IRIX6.1.mk +44 -0
  182. data/vendor/jsl-0.3.0/src/config/IRIX6.2.mk +44 -0
  183. data/vendor/jsl-0.3.0/src/config/IRIX6.3.mk +44 -0
  184. data/vendor/jsl-0.3.0/src/config/IRIX6.5.mk +44 -0
  185. data/vendor/jsl-0.3.0/src/config/Linux_All.mk +103 -0
  186. data/vendor/jsl-0.3.0/src/config/Mac_OS10.0.mk +82 -0
  187. data/vendor/jsl-0.3.0/src/config/OSF1V4.0.mk +72 -0
  188. data/vendor/jsl-0.3.0/src/config/OSF1V5.0.mk +69 -0
  189. data/vendor/jsl-0.3.0/src/config/SunOS4.1.4.mk +101 -0
  190. data/vendor/jsl-0.3.0/src/config/SunOS5.3.mk +91 -0
  191. data/vendor/jsl-0.3.0/src/config/SunOS5.4.mk +92 -0
  192. data/vendor/jsl-0.3.0/src/config/SunOS5.5.1.mk +44 -0
  193. data/vendor/jsl-0.3.0/src/config/SunOS5.5.mk +87 -0
  194. data/vendor/jsl-0.3.0/src/config/SunOS5.6.mk +89 -0
  195. data/vendor/jsl-0.3.0/src/config/SunOS5.7.mk +44 -0
  196. data/vendor/jsl-0.3.0/src/config/SunOS5.8.mk +44 -0
  197. data/vendor/jsl-0.3.0/src/config/SunOS5.9.mk +44 -0
  198. data/vendor/jsl-0.3.0/src/config/WINNT4.0.mk +112 -0
  199. data/vendor/jsl-0.3.0/src/config/WINNT5.0.mk +112 -0
  200. data/vendor/jsl-0.3.0/src/config/WINNT5.1.mk +112 -0
  201. data/vendor/jsl-0.3.0/src/config/WINNT5.2.mk +112 -0
  202. data/vendor/jsl-0.3.0/src/config/dgux.mk +64 -0
  203. data/vendor/jsl-0.3.0/src/config.mk +166 -0
  204. data/vendor/jsl-0.3.0/src/editline/Makefile.ref +144 -0
  205. data/vendor/jsl-0.3.0/src/editline/README +83 -0
  206. data/vendor/jsl-0.3.0/src/editline/editline.3 +175 -0
  207. data/vendor/jsl-0.3.0/src/editline/editline.c +1369 -0
  208. data/vendor/jsl-0.3.0/src/editline/editline.h +135 -0
  209. data/vendor/jsl-0.3.0/src/editline/sysunix.c +182 -0
  210. data/vendor/jsl-0.3.0/src/editline/unix.h +82 -0
  211. data/vendor/jsl-0.3.0/src/fdlibm/Makefile.in +127 -0
  212. data/vendor/jsl-0.3.0/src/fdlibm/Makefile.ref +192 -0
  213. data/vendor/jsl-0.3.0/src/fdlibm/e_acos.c +147 -0
  214. data/vendor/jsl-0.3.0/src/fdlibm/e_acosh.c +105 -0
  215. data/vendor/jsl-0.3.0/src/fdlibm/e_asin.c +156 -0
  216. data/vendor/jsl-0.3.0/src/fdlibm/e_atan2.c +165 -0
  217. data/vendor/jsl-0.3.0/src/fdlibm/e_atanh.c +110 -0
  218. data/vendor/jsl-0.3.0/src/fdlibm/e_cosh.c +133 -0
  219. data/vendor/jsl-0.3.0/src/fdlibm/e_exp.c +202 -0
  220. data/vendor/jsl-0.3.0/src/fdlibm/e_fmod.c +184 -0
  221. data/vendor/jsl-0.3.0/src/fdlibm/e_gamma.c +71 -0
  222. data/vendor/jsl-0.3.0/src/fdlibm/e_gamma_r.c +70 -0
  223. data/vendor/jsl-0.3.0/src/fdlibm/e_hypot.c +173 -0
  224. data/vendor/jsl-0.3.0/src/fdlibm/e_j0.c +524 -0
  225. data/vendor/jsl-0.3.0/src/fdlibm/e_j1.c +523 -0
  226. data/vendor/jsl-0.3.0/src/fdlibm/e_jn.c +315 -0
  227. data/vendor/jsl-0.3.0/src/fdlibm/e_lgamma.c +71 -0
  228. data/vendor/jsl-0.3.0/src/fdlibm/e_lgamma_r.c +347 -0
  229. data/vendor/jsl-0.3.0/src/fdlibm/e_log.c +184 -0
  230. data/vendor/jsl-0.3.0/src/fdlibm/e_log10.c +134 -0
  231. data/vendor/jsl-0.3.0/src/fdlibm/e_pow.c +386 -0
  232. data/vendor/jsl-0.3.0/src/fdlibm/e_rem_pio2.c +221 -0
  233. data/vendor/jsl-0.3.0/src/fdlibm/e_remainder.c +120 -0
  234. data/vendor/jsl-0.3.0/src/fdlibm/e_scalb.c +89 -0
  235. data/vendor/jsl-0.3.0/src/fdlibm/e_sinh.c +122 -0
  236. data/vendor/jsl-0.3.0/src/fdlibm/e_sqrt.c +497 -0
  237. data/vendor/jsl-0.3.0/src/fdlibm/fdlibm.dsp +160 -0
  238. data/vendor/jsl-0.3.0/src/fdlibm/fdlibm.h +273 -0
  239. data/vendor/jsl-0.3.0/src/fdlibm/fdlibm.mak +1453 -0
  240. data/vendor/jsl-0.3.0/src/fdlibm/fdlibm.mdp +0 -0
  241. data/vendor/jsl-0.3.0/src/fdlibm/k_cos.c +134 -0
  242. data/vendor/jsl-0.3.0/src/fdlibm/k_rem_pio2.c +354 -0
  243. data/vendor/jsl-0.3.0/src/fdlibm/k_sin.c +114 -0
  244. data/vendor/jsl-0.3.0/src/fdlibm/k_standard.c +785 -0
  245. data/vendor/jsl-0.3.0/src/fdlibm/k_tan.c +170 -0
  246. data/vendor/jsl-0.3.0/src/fdlibm/s_asinh.c +101 -0
  247. data/vendor/jsl-0.3.0/src/fdlibm/s_atan.c +175 -0
  248. data/vendor/jsl-0.3.0/src/fdlibm/s_cbrt.c +133 -0
  249. data/vendor/jsl-0.3.0/src/fdlibm/s_ceil.c +120 -0
  250. data/vendor/jsl-0.3.0/src/fdlibm/s_copysign.c +72 -0
  251. data/vendor/jsl-0.3.0/src/fdlibm/s_cos.c +118 -0
  252. data/vendor/jsl-0.3.0/src/fdlibm/s_erf.c +356 -0
  253. data/vendor/jsl-0.3.0/src/fdlibm/s_expm1.c +267 -0
  254. data/vendor/jsl-0.3.0/src/fdlibm/s_fabs.c +70 -0
  255. data/vendor/jsl-0.3.0/src/fdlibm/s_finite.c +71 -0
  256. data/vendor/jsl-0.3.0/src/fdlibm/s_floor.c +121 -0
  257. data/vendor/jsl-0.3.0/src/fdlibm/s_frexp.c +99 -0
  258. data/vendor/jsl-0.3.0/src/fdlibm/s_ilogb.c +85 -0
  259. data/vendor/jsl-0.3.0/src/fdlibm/s_isnan.c +74 -0
  260. data/vendor/jsl-0.3.0/src/fdlibm/s_ldexp.c +66 -0
  261. data/vendor/jsl-0.3.0/src/fdlibm/s_lib_version.c +73 -0
  262. data/vendor/jsl-0.3.0/src/fdlibm/s_log1p.c +211 -0
  263. data/vendor/jsl-0.3.0/src/fdlibm/s_logb.c +79 -0
  264. data/vendor/jsl-0.3.0/src/fdlibm/s_matherr.c +64 -0
  265. data/vendor/jsl-0.3.0/src/fdlibm/s_modf.c +132 -0
  266. data/vendor/jsl-0.3.0/src/fdlibm/s_nextafter.c +124 -0
  267. data/vendor/jsl-0.3.0/src/fdlibm/s_rint.c +131 -0
  268. data/vendor/jsl-0.3.0/src/fdlibm/s_scalbn.c +107 -0
  269. data/vendor/jsl-0.3.0/src/fdlibm/s_signgam.c +40 -0
  270. data/vendor/jsl-0.3.0/src/fdlibm/s_significand.c +68 -0
  271. data/vendor/jsl-0.3.0/src/fdlibm/s_sin.c +118 -0
  272. data/vendor/jsl-0.3.0/src/fdlibm/s_tan.c +112 -0
  273. data/vendor/jsl-0.3.0/src/fdlibm/s_tanh.c +122 -0
  274. data/vendor/jsl-0.3.0/src/fdlibm/w_acos.c +78 -0
  275. data/vendor/jsl-0.3.0/src/fdlibm/w_acosh.c +78 -0
  276. data/vendor/jsl-0.3.0/src/fdlibm/w_asin.c +80 -0
  277. data/vendor/jsl-0.3.0/src/fdlibm/w_atan2.c +79 -0
  278. data/vendor/jsl-0.3.0/src/fdlibm/w_atanh.c +81 -0
  279. data/vendor/jsl-0.3.0/src/fdlibm/w_cosh.c +77 -0
  280. data/vendor/jsl-0.3.0/src/fdlibm/w_exp.c +88 -0
  281. data/vendor/jsl-0.3.0/src/fdlibm/w_fmod.c +78 -0
  282. data/vendor/jsl-0.3.0/src/fdlibm/w_gamma.c +85 -0
  283. data/vendor/jsl-0.3.0/src/fdlibm/w_gamma_r.c +81 -0
  284. data/vendor/jsl-0.3.0/src/fdlibm/w_hypot.c +78 -0
  285. data/vendor/jsl-0.3.0/src/fdlibm/w_j0.c +105 -0
  286. data/vendor/jsl-0.3.0/src/fdlibm/w_j1.c +106 -0
  287. data/vendor/jsl-0.3.0/src/fdlibm/w_jn.c +128 -0
  288. data/vendor/jsl-0.3.0/src/fdlibm/w_lgamma.c +85 -0
  289. data/vendor/jsl-0.3.0/src/fdlibm/w_lgamma_r.c +81 -0
  290. data/vendor/jsl-0.3.0/src/fdlibm/w_log.c +78 -0
  291. data/vendor/jsl-0.3.0/src/fdlibm/w_log10.c +81 -0
  292. data/vendor/jsl-0.3.0/src/fdlibm/w_pow.c +99 -0
  293. data/vendor/jsl-0.3.0/src/fdlibm/w_remainder.c +77 -0
  294. data/vendor/jsl-0.3.0/src/fdlibm/w_scalb.c +95 -0
  295. data/vendor/jsl-0.3.0/src/fdlibm/w_sinh.c +77 -0
  296. data/vendor/jsl-0.3.0/src/fdlibm/w_sqrt.c +77 -0
  297. data/vendor/jsl-0.3.0/src/js.c +2447 -0
  298. data/vendor/jsl-0.3.0/src/js.dsp +420 -0
  299. data/vendor/jsl-0.3.0/src/js.mak +4025 -0
  300. data/vendor/jsl-0.3.0/src/js.mdp +0 -0
  301. data/vendor/jsl-0.3.0/src/js.msg +291 -0
  302. data/vendor/jsl-0.3.0/src/js.pkg +2 -0
  303. data/vendor/jsl-0.3.0/src/js3240.rc +79 -0
  304. data/vendor/jsl-0.3.0/src/jsOS240.def +654 -0
  305. data/vendor/jsl-0.3.0/src/jsapi.c +4405 -0
  306. data/vendor/jsl-0.3.0/src/jsapi.h +1856 -0
  307. data/vendor/jsl-0.3.0/src/jsarena.c +567 -0
  308. data/vendor/jsl-0.3.0/src/jsarena.h +302 -0
  309. data/vendor/jsl-0.3.0/src/jsarray.c +1428 -0
  310. data/vendor/jsl-0.3.0/src/jsarray.h +77 -0
  311. data/vendor/jsl-0.3.0/src/jsatom.c +927 -0
  312. data/vendor/jsl-0.3.0/src/jsatom.h +426 -0
  313. data/vendor/jsl-0.3.0/src/jsbit.h +113 -0
  314. data/vendor/jsl-0.3.0/src/jsbool.c +220 -0
  315. data/vendor/jsl-0.3.0/src/jsbool.h +62 -0
  316. data/vendor/jsl-0.3.0/src/jsclist.h +139 -0
  317. data/vendor/jsl-0.3.0/src/jscntxt.c +1036 -0
  318. data/vendor/jsl-0.3.0/src/jscntxt.h +608 -0
  319. data/vendor/jsl-0.3.0/src/jscompat.h +57 -0
  320. data/vendor/jsl-0.3.0/src/jsconfig.h +489 -0
  321. data/vendor/jsl-0.3.0/src/jsconfig.mk +181 -0
  322. data/vendor/jsl-0.3.0/src/jscpucfg.c +377 -0
  323. data/vendor/jsl-0.3.0/src/jscpucfg.h +204 -0
  324. data/vendor/jsl-0.3.0/src/jsdate.c +2238 -0
  325. data/vendor/jsl-0.3.0/src/jsdate.h +118 -0
  326. data/vendor/jsl-0.3.0/src/jsdbgapi.c +1260 -0
  327. data/vendor/jsl-0.3.0/src/jsdbgapi.h +345 -0
  328. data/vendor/jsl-0.3.0/src/jsdhash.c +763 -0
  329. data/vendor/jsl-0.3.0/src/jsdhash.h +579 -0
  330. data/vendor/jsl-0.3.0/src/jsdtoa.c +3135 -0
  331. data/vendor/jsl-0.3.0/src/jsdtoa.h +130 -0
  332. data/vendor/jsl-0.3.0/src/jsemit.c +4851 -0
  333. data/vendor/jsl-0.3.0/src/jsemit.h +576 -0
  334. data/vendor/jsl-0.3.0/src/jsexn.c +1084 -0
  335. data/vendor/jsl-0.3.0/src/jsexn.h +102 -0
  336. data/vendor/jsl-0.3.0/src/jsfile.c +2610 -0
  337. data/vendor/jsl-0.3.0/src/jsfile.h +50 -0
  338. data/vendor/jsl-0.3.0/src/jsfile.msg +89 -0
  339. data/vendor/jsl-0.3.0/src/jsfun.c +2015 -0
  340. data/vendor/jsl-0.3.0/src/jsfun.h +158 -0
  341. data/vendor/jsl-0.3.0/src/jsgc.c +1441 -0
  342. data/vendor/jsl-0.3.0/src/jsgc.h +230 -0
  343. data/vendor/jsl-0.3.0/src/jshash.c +471 -0
  344. data/vendor/jsl-0.3.0/src/jshash.h +152 -0
  345. data/vendor/jsl-0.3.0/src/jsify.pl +485 -0
  346. data/vendor/jsl-0.3.0/src/jsinterp.c +4797 -0
  347. data/vendor/jsl-0.3.0/src/jsinterp.h +302 -0
  348. data/vendor/jsl-0.3.0/src/jsl-test.js +28 -0
  349. data/vendor/jsl-0.3.0/src/jsl.c +2371 -0
  350. data/vendor/jsl-0.3.0/src/jsl.conf +127 -0
  351. data/vendor/jsl-0.3.0/src/jsl.conf.old +124 -0
  352. data/vendor/jsl-0.3.0/src/jsl.dsp +242 -0
  353. data/vendor/jsl-0.3.0/src/jsl.dsw +59 -0
  354. data/vendor/jsl-0.3.0/src/jslibmath.h +290 -0
  355. data/vendor/jsl-0.3.0/src/jslock.c +1261 -0
  356. data/vendor/jsl-0.3.0/src/jslock.h +289 -0
  357. data/vendor/jsl-0.3.0/src/jslocko.asm +59 -0
  358. data/vendor/jsl-0.3.0/src/jslog2.c +83 -0
  359. data/vendor/jsl-0.3.0/src/jslong.c +281 -0
  360. data/vendor/jsl-0.3.0/src/jslong.h +437 -0
  361. data/vendor/jsl-0.3.0/src/jsmath.c +477 -0
  362. data/vendor/jsl-0.3.0/src/jsmath.h +55 -0
  363. data/vendor/jsl-0.3.0/src/jsnum.c +1148 -0
  364. data/vendor/jsl-0.3.0/src/jsnum.h +257 -0
  365. data/vendor/jsl-0.3.0/src/jsobj.c +4066 -0
  366. data/vendor/jsl-0.3.0/src/jsobj.h +475 -0
  367. data/vendor/jsl-0.3.0/src/jsopcode.c +2730 -0
  368. data/vendor/jsl-0.3.0/src/jsopcode.h +275 -0
  369. data/vendor/jsl-0.3.0/src/jsopcode.tbl +344 -0
  370. data/vendor/jsl-0.3.0/src/jsosdep.h +127 -0
  371. data/vendor/jsl-0.3.0/src/jsotypes.h +211 -0
  372. data/vendor/jsl-0.3.0/src/jsparse.c +4438 -0
  373. data/vendor/jsl-0.3.0/src/jsparse.h +345 -0
  374. data/vendor/jsl-0.3.0/src/jsprf.c +1212 -0
  375. data/vendor/jsl-0.3.0/src/jsprf.h +148 -0
  376. data/vendor/jsl-0.3.0/src/jsprvtd.h +174 -0
  377. data/vendor/jsl-0.3.0/src/jspubtd.h +586 -0
  378. data/vendor/jsl-0.3.0/src/jsregexp.c +3831 -0
  379. data/vendor/jsl-0.3.0/src/jsregexp.h +180 -0
  380. data/vendor/jsl-0.3.0/src/jsscan.c +1814 -0
  381. data/vendor/jsl-0.3.0/src/jsscan.h +267 -0
  382. data/vendor/jsl-0.3.0/src/jsscope.c +1639 -0
  383. data/vendor/jsl-0.3.0/src/jsscope.h +389 -0
  384. data/vendor/jsl-0.3.0/src/jsscript.c +1284 -0
  385. data/vendor/jsl-0.3.0/src/jsscript.h +179 -0
  386. data/vendor/jsl-0.3.0/src/jsshell.msg +50 -0
  387. data/vendor/jsl-0.3.0/src/jsstddef.h +83 -0
  388. data/vendor/jsl-0.3.0/src/jsstr.c +4502 -0
  389. data/vendor/jsl-0.3.0/src/jsstr.h +448 -0
  390. data/vendor/jsl-0.3.0/src/jstypes.h +391 -0
  391. data/vendor/jsl-0.3.0/src/jsutil.c +157 -0
  392. data/vendor/jsl-0.3.0/src/jsutil.h +75 -0
  393. data/vendor/jsl-0.3.0/src/jsxdrapi.c +686 -0
  394. data/vendor/jsl-0.3.0/src/jsxdrapi.h +193 -0
  395. data/vendor/jsl-0.3.0/src/liveconnect/LiveConnect.dsp +157 -0
  396. data/vendor/jsl-0.3.0/src/liveconnect/LiveConnectShell.dsp +120 -0
  397. data/vendor/jsl-0.3.0/src/liveconnect/LiveConnectShell.dsw +44 -0
  398. data/vendor/jsl-0.3.0/src/liveconnect/Makefile.in +106 -0
  399. data/vendor/jsl-0.3.0/src/liveconnect/Makefile.ref +169 -0
  400. data/vendor/jsl-0.3.0/src/liveconnect/README.html +719 -0
  401. data/vendor/jsl-0.3.0/src/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
  402. data/vendor/jsl-0.3.0/src/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
  403. data/vendor/jsl-0.3.0/src/liveconnect/classes/Makefile.in +89 -0
  404. data/vendor/jsl-0.3.0/src/liveconnect/classes/Makefile.ref +57 -0
  405. data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/Makefile.ref +47 -0
  406. data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/JSException.java +140 -0
  407. data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
  408. data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
  409. data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
  410. data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
  411. data/vendor/jsl-0.3.0/src/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
  412. data/vendor/jsl-0.3.0/src/liveconnect/config/AIX4.1.mk +45 -0
  413. data/vendor/jsl-0.3.0/src/liveconnect/config/AIX4.2.mk +45 -0
  414. data/vendor/jsl-0.3.0/src/liveconnect/config/AIX4.3.mk +50 -0
  415. data/vendor/jsl-0.3.0/src/liveconnect/config/HP-UXB.10.10.mk +43 -0
  416. data/vendor/jsl-0.3.0/src/liveconnect/config/HP-UXB.10.20.mk +43 -0
  417. data/vendor/jsl-0.3.0/src/liveconnect/config/HP-UXB.11.00.mk +43 -0
  418. data/vendor/jsl-0.3.0/src/liveconnect/config/IRIX6.2.mk +43 -0
  419. data/vendor/jsl-0.3.0/src/liveconnect/config/IRIX6.3.mk +43 -0
  420. data/vendor/jsl-0.3.0/src/liveconnect/config/IRIX6.5.mk +43 -0
  421. data/vendor/jsl-0.3.0/src/liveconnect/config/Linux_All.mk +73 -0
  422. data/vendor/jsl-0.3.0/src/liveconnect/config/OSF1V4.0.mk +65 -0
  423. data/vendor/jsl-0.3.0/src/liveconnect/config/OSF1V5.0.mk +62 -0
  424. data/vendor/jsl-0.3.0/src/liveconnect/config/SunOS5.5.1.mk +55 -0
  425. data/vendor/jsl-0.3.0/src/liveconnect/config/SunOS5.6.mk +39 -0
  426. data/vendor/jsl-0.3.0/src/liveconnect/config/SunOS5.7.mk +39 -0
  427. data/vendor/jsl-0.3.0/src/liveconnect/config/SunOS5.8.mk +39 -0
  428. data/vendor/jsl-0.3.0/src/liveconnect/config/WINNT4.0.mk +53 -0
  429. data/vendor/jsl-0.3.0/src/liveconnect/jsj.c +884 -0
  430. data/vendor/jsl-0.3.0/src/liveconnect/jsj.msg +98 -0
  431. data/vendor/jsl-0.3.0/src/liveconnect/jsj_JSObject.c +1379 -0
  432. data/vendor/jsl-0.3.0/src/liveconnect/jsj_JavaArray.c +481 -0
  433. data/vendor/jsl-0.3.0/src/liveconnect/jsj_JavaClass.c +749 -0
  434. data/vendor/jsl-0.3.0/src/liveconnect/jsj_JavaMember.c +186 -0
  435. data/vendor/jsl-0.3.0/src/liveconnect/jsj_JavaObject.c +1099 -0
  436. data/vendor/jsl-0.3.0/src/liveconnect/jsj_JavaPackage.c +548 -0
  437. data/vendor/jsl-0.3.0/src/liveconnect/jsj_array.c +207 -0
  438. data/vendor/jsl-0.3.0/src/liveconnect/jsj_class.c +765 -0
  439. data/vendor/jsl-0.3.0/src/liveconnect/jsj_convert.c +954 -0
  440. data/vendor/jsl-0.3.0/src/liveconnect/jsj_field.c +421 -0
  441. data/vendor/jsl-0.3.0/src/liveconnect/jsj_hash.c +504 -0
  442. data/vendor/jsl-0.3.0/src/liveconnect/jsj_hash.h +161 -0
  443. data/vendor/jsl-0.3.0/src/liveconnect/jsj_method.c +1823 -0
  444. data/vendor/jsl-0.3.0/src/liveconnect/jsj_nodl.c +1 -0
  445. data/vendor/jsl-0.3.0/src/liveconnect/jsj_private.h +689 -0
  446. data/vendor/jsl-0.3.0/src/liveconnect/jsj_simpleapi.c +219 -0
  447. data/vendor/jsl-0.3.0/src/liveconnect/jsj_utils.c +513 -0
  448. data/vendor/jsl-0.3.0/src/liveconnect/jsjava.h +313 -0
  449. data/vendor/jsl-0.3.0/src/liveconnect/liveconnect.pkg +3 -0
  450. data/vendor/jsl-0.3.0/src/liveconnect/netscape_javascript_JSObject.h +155 -0
  451. data/vendor/jsl-0.3.0/src/liveconnect/nsCLiveconnect.cpp +785 -0
  452. data/vendor/jsl-0.3.0/src/liveconnect/nsCLiveconnect.h +197 -0
  453. data/vendor/jsl-0.3.0/src/liveconnect/nsCLiveconnectFactory.cpp +163 -0
  454. data/vendor/jsl-0.3.0/src/liveconnect/nsCLiveconnectFactory.h +76 -0
  455. data/vendor/jsl-0.3.0/src/liveconnect/nsILiveconnect.h +195 -0
  456. data/vendor/jsl-0.3.0/src/liveconnect/nsISecureLiveconnect.h +84 -0
  457. data/vendor/jsl-0.3.0/src/liveconnect/nsISecurityContext.h +135 -0
  458. data/vendor/jsl-0.3.0/src/liveconnect/win32.order +6 -0
  459. data/vendor/jsl-0.3.0/src/lock_SunOS.s +114 -0
  460. data/vendor/jsl-0.3.0/src/perfect.js +39 -0
  461. data/vendor/jsl-0.3.0/src/perlconnect/JS.def +6 -0
  462. data/vendor/jsl-0.3.0/src/perlconnect/JS.dsp +107 -0
  463. data/vendor/jsl-0.3.0/src/perlconnect/JS.pm +318 -0
  464. data/vendor/jsl-0.3.0/src/perlconnect/JS.xs +1050 -0
  465. data/vendor/jsl-0.3.0/src/perlconnect/Makefile.PL +67 -0
  466. data/vendor/jsl-0.3.0/src/perlconnect/Makefile.ref +152 -0
  467. data/vendor/jsl-0.3.0/src/perlconnect/PerlConnect.dsp +103 -0
  468. data/vendor/jsl-0.3.0/src/perlconnect/PerlConnect.dsw +59 -0
  469. data/vendor/jsl-0.3.0/src/perlconnect/PerlConnect.pm +126 -0
  470. data/vendor/jsl-0.3.0/src/perlconnect/PerlConnectShell.dsp +89 -0
  471. data/vendor/jsl-0.3.0/src/perlconnect/README.html +345 -0
  472. data/vendor/jsl-0.3.0/src/perlconnect/bg.jpg +0 -0
  473. data/vendor/jsl-0.3.0/src/perlconnect/jsperl.c +1100 -0
  474. data/vendor/jsl-0.3.0/src/perlconnect/jsperl.h +52 -0
  475. data/vendor/jsl-0.3.0/src/perlconnect/jsperlbuild.pl +81 -0
  476. data/vendor/jsl-0.3.0/src/perlconnect/jsperlpvt.h +57 -0
  477. data/vendor/jsl-0.3.0/src/perlconnect/test.js +73 -0
  478. data/vendor/jsl-0.3.0/src/perlconnect/test.pl +244 -0
  479. data/vendor/jsl-0.3.0/src/perlconnect/typemap +121 -0
  480. data/vendor/jsl-0.3.0/src/plify_jsdhash.sed +31 -0
  481. data/vendor/jsl-0.3.0/src/prmjtime.c +646 -0
  482. data/vendor/jsl-0.3.0/src/prmjtime.h +95 -0
  483. data/vendor/jsl-0.3.0/src/resource.h +15 -0
  484. data/vendor/jsl-0.3.0/src/rules.mk +193 -0
  485. data/vendor/jsl-0.3.0/src/win32.order +391 -0
  486. data/vendor/jsl-0.3.0/tests/conf/always_use_option_explicit.js +4 -0
  487. data/vendor/jsl-0.3.0/tests/conf/define.js +8 -0
  488. data/vendor/jsl-0.3.0/tests/conf/jscript_function_extensions-1.js +7 -0
  489. data/vendor/jsl-0.3.0/tests/conf/jscript_function_extensions-2.js +8 -0
  490. data/vendor/jsl-0.3.0/tests/conf/jscript_function_extensions-3.js +27 -0
  491. data/vendor/jsl-0.3.0/tests/conf/jscript_function_extensions-4.js +4 -0
  492. data/vendor/jsl-0.3.0/tests/conf/lambda_assign_requires_semicolon.js +24 -0
  493. data/vendor/jsl-0.3.0/tests/conf/legacy_control_comments.js +8 -0
  494. data/vendor/jsl-0.3.0/tests/control_comments/control_comments.js +33 -0
  495. data/vendor/jsl-0.3.0/tests/control_comments/declare.js +26 -0
  496. data/vendor/jsl-0.3.0/tests/control_comments/import-overflow.js +9 -0
  497. data/vendor/jsl-0.3.0/tests/control_comments/import.js +5 -0
  498. data/vendor/jsl-0.3.0/tests/control_comments/import2.js +2 -0
  499. data/vendor/jsl-0.3.0/tests/control_comments/invalid_fallthru.js +13 -0
  500. data/vendor/jsl-0.3.0/tests/control_comments/option_explicit-with.js +12 -0
  501. data/vendor/jsl-0.3.0/tests/control_comments/option_explicit.js +64 -0
  502. data/vendor/jsl-0.3.0/tests/errors/unterminated_comment.js +8 -0
  503. data/vendor/jsl-0.3.0/tests/html/script_tag_in_js_literal.html +14 -0
  504. data/vendor/jsl-0.3.0/tests/run_tests.pl +71 -0
  505. data/vendor/jsl-0.3.0/tests/warnings/ambiguous_else_stmt.js +21 -0
  506. data/vendor/jsl-0.3.0/tests/warnings/ambiguous_nested_stmt.js +66 -0
  507. data/vendor/jsl-0.3.0/tests/warnings/ambiguous_newline.js +261 -0
  508. data/vendor/jsl-0.3.0/tests/warnings/anon_no_return_value.js +26 -0
  509. data/vendor/jsl-0.3.0/tests/warnings/assign_to_function_call.js +16 -0
  510. data/vendor/jsl-0.3.0/tests/warnings/block_without_braces.js +13 -0
  511. data/vendor/jsl-0.3.0/tests/warnings/comma_separated_stmts.js +17 -0
  512. data/vendor/jsl-0.3.0/tests/warnings/comparison_type_conv.js +44 -0
  513. data/vendor/jsl-0.3.0/tests/warnings/default_not_at_end.js +15 -0
  514. data/vendor/jsl-0.3.0/tests/warnings/dup_option_explicit.js +5 -0
  515. data/vendor/jsl-0.3.0/tests/warnings/duplicate_case_in_switch.js +62 -0
  516. data/vendor/jsl-0.3.0/tests/warnings/duplicate_formal.js +5 -0
  517. data/vendor/jsl-0.3.0/tests/warnings/empty_statement.js +29 -0
  518. data/vendor/jsl-0.3.0/tests/warnings/equal_as_assign.js +7 -0
  519. data/vendor/jsl-0.3.0/tests/warnings/inc_dec_within_stmt-ignore.js +21 -0
  520. data/vendor/jsl-0.3.0/tests/warnings/inc_dec_within_stmt.js +63 -0
  521. data/vendor/jsl-0.3.0/tests/warnings/jsl_cc_not_understood.js +5 -0
  522. data/vendor/jsl-0.3.0/tests/warnings/leading_decimal_point.js +7 -0
  523. data/vendor/jsl-0.3.0/tests/warnings/legacy_cc_not_understood.js +9 -0
  524. data/vendor/jsl-0.3.0/tests/warnings/meaningless_block.js +12 -0
  525. data/vendor/jsl-0.3.0/tests/warnings/misplaced_regex.js +20 -0
  526. data/vendor/jsl-0.3.0/tests/warnings/missing_break.js +87 -0
  527. data/vendor/jsl-0.3.0/tests/warnings/missing_break_for_last_case.js +19 -0
  528. data/vendor/jsl-0.3.0/tests/warnings/missing_default_case.js +51 -0
  529. data/vendor/jsl-0.3.0/tests/warnings/missing_option_explicit.js +5 -0
  530. data/vendor/jsl-0.3.0/tests/warnings/missing_semicolon.js +19 -0
  531. data/vendor/jsl-0.3.0/tests/warnings/multiple_plus_minus.js +10 -0
  532. data/vendor/jsl-0.3.0/tests/warnings/nested_comment.js +6 -0
  533. data/vendor/jsl-0.3.0/tests/warnings/no_return_value.js +25 -0
  534. data/vendor/jsl-0.3.0/tests/warnings/octal_number.js +5 -0
  535. data/vendor/jsl-0.3.0/tests/warnings/parseint_missing_radix.js +15 -0
  536. data/vendor/jsl-0.3.0/tests/warnings/partial_option_explicit.js +5 -0
  537. data/vendor/jsl-0.3.0/tests/warnings/redeclared_var.js +10 -0
  538. data/vendor/jsl-0.3.0/tests/warnings/spidermonkey/bad_backref.js +5 -0
  539. data/vendor/jsl-0.3.0/tests/warnings/spidermonkey/deprecated_usage.js +11 -0
  540. data/vendor/jsl-0.3.0/tests/warnings/spidermonkey/invalid_backref.js +5 -0
  541. data/vendor/jsl-0.3.0/tests/warnings/spidermonkey/trailing_comma.js +5 -0
  542. data/vendor/jsl-0.3.0/tests/warnings/trailing_comma_in_array.js +8 -0
  543. data/vendor/jsl-0.3.0/tests/warnings/trailing_decimal_point.js +7 -0
  544. data/vendor/jsl-0.3.0/tests/warnings/unreachable_code.js +29 -0
  545. data/vendor/jsl-0.3.0/tests/warnings/use_of_label.js +19 -0
  546. data/vendor/jsl-0.3.0/tests/warnings/useless_assign.js +20 -0
  547. data/vendor/jsl-0.3.0/tests/warnings/useless_comparison.js +55 -0
  548. data/vendor/jsl-0.3.0/tests/warnings/useless_void.js +6 -0
  549. data/vendor/jsl-0.3.0/tests/warnings/var_hides_arg.js +4 -0
  550. data/vendor/jsl-0.3.0/tests/warnings/with_statement.js +7 -0
  551. data/vendor/yuicompressor-2.4.2.jar +0 -0
  552. metadata +605 -0
@@ -0,0 +1,4502 @@
1
+ /* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2
+ *
3
+ * ***** BEGIN LICENSE BLOCK *****
4
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
5
+ *
6
+ * The contents of this file are subject to the Mozilla Public License Version
7
+ * 1.1 (the "License"); you may not use this file except in compliance with
8
+ * the License. You may obtain a copy of the License at
9
+ * http://www.mozilla.org/MPL/
10
+ *
11
+ * Software distributed under the License is distributed on an "AS IS" basis,
12
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
13
+ * for the specific language governing rights and limitations under the
14
+ * License.
15
+ *
16
+ * The Original Code is Mozilla Communicator client code, released
17
+ * March 31, 1998.
18
+ *
19
+ * The Initial Developer of the Original Code is
20
+ * Netscape Communications Corporation.
21
+ * Portions created by the Initial Developer are Copyright (C) 1998
22
+ * the Initial Developer. All Rights Reserved.
23
+ *
24
+ * Contributor(s):
25
+ *
26
+ * Alternatively, the contents of this file may be used under the terms of
27
+ * either of the GNU General Public License Version 2 or later (the "GPL"),
28
+ * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29
+ * in which case the provisions of the GPL or the LGPL are applicable instead
30
+ * of those above. If you wish to allow use of your version of this file only
31
+ * under the terms of either the GPL or the LGPL, and not to allow others to
32
+ * use your version of this file under the terms of the MPL, indicate your
33
+ * decision by deleting the provisions above and replace them with the notice
34
+ * and other provisions required by the GPL or the LGPL. If you do not delete
35
+ * the provisions above, a recipient may use your version of this file under
36
+ * the terms of any one of the MPL, the GPL or the LGPL.
37
+ *
38
+ * ***** END LICENSE BLOCK ***** */
39
+
40
+ /*
41
+ * JS string type implementation.
42
+ *
43
+ * In order to avoid unnecessary js_LockGCThing/js_UnlockGCThing calls, these
44
+ * native methods store strings (possibly newborn) converted from their 'this'
45
+ * parameter and arguments on the stack: 'this' conversions at argv[-1], arg
46
+ * conversions at their index (argv[0], argv[1]). This is a legitimate method
47
+ * of rooting things that might lose their newborn root due to subsequent GC
48
+ * allocations in the same native method.
49
+ */
50
+ #include "jsstddef.h"
51
+ #include <stdlib.h>
52
+ #include <string.h>
53
+ #include "jstypes.h"
54
+ #include "jsutil.h" /* Added by JSIFY */
55
+ #include "jshash.h" /* Added by JSIFY */
56
+ #include "jsprf.h"
57
+ #include "jsapi.h"
58
+ #include "jsarray.h"
59
+ #include "jsatom.h"
60
+ #include "jsbool.h"
61
+ #include "jscntxt.h"
62
+ #include "jsconfig.h"
63
+ #include "jsgc.h"
64
+ #include "jsinterp.h"
65
+ #include "jslock.h"
66
+ #include "jsnum.h"
67
+ #include "jsobj.h"
68
+ #include "jsopcode.h"
69
+ #include "jsregexp.h"
70
+ #include "jsstr.h"
71
+
72
+ #if JS_HAS_REPLACE_LAMBDA
73
+ #include "jsinterp.h"
74
+ #endif
75
+
76
+ #define JSSTRDEP_RECURSION_LIMIT 100
77
+
78
+ size_t
79
+ js_MinimizeDependentStrings(JSString *str, int level, JSString **basep)
80
+ {
81
+ JSString *base;
82
+ size_t start, length;
83
+
84
+ JS_ASSERT(JSSTRING_IS_DEPENDENT(str));
85
+ base = JSSTRDEP_BASE(str);
86
+ start = JSSTRDEP_START(str);
87
+ if (JSSTRING_IS_DEPENDENT(base)) {
88
+ if (level < JSSTRDEP_RECURSION_LIMIT) {
89
+ start += js_MinimizeDependentStrings(base, level + 1, &base);
90
+ } else {
91
+ do {
92
+ start += JSSTRDEP_START(base);
93
+ base = JSSTRDEP_BASE(base);
94
+ } while (JSSTRING_IS_DEPENDENT(base));
95
+ }
96
+ if (start == 0) {
97
+ JS_ASSERT(JSSTRING_IS_PREFIX(str));
98
+ JSPREFIX_SET_BASE(str, base);
99
+ } else if (start <= JSSTRDEP_START_MASK) {
100
+ length = JSSTRDEP_LENGTH(str);
101
+ JSSTRDEP_SET_START_AND_LENGTH(str, start, length);
102
+ JSSTRDEP_SET_BASE(str, base);
103
+ }
104
+ }
105
+ *basep = base;
106
+ return start;
107
+ }
108
+
109
+ jschar *
110
+ js_GetDependentStringChars(JSString *str)
111
+ {
112
+ size_t start;
113
+ JSString *base;
114
+
115
+ start = js_MinimizeDependentStrings(str, 0, &base);
116
+ JS_ASSERT(!JSSTRING_IS_DEPENDENT(base));
117
+ JS_ASSERT(start < base->length);
118
+ return base->chars + start;
119
+ }
120
+
121
+ jschar *
122
+ js_GetStringChars(JSString *str)
123
+ {
124
+ if (JSSTRING_IS_DEPENDENT(str) && !js_UndependString(NULL, str))
125
+ return NULL;
126
+
127
+ *js_GetGCThingFlags(str) &= ~GCF_MUTABLE;
128
+ return str->chars;
129
+ }
130
+
131
+ JSString *
132
+ js_ConcatStrings(JSContext *cx, JSString *left, JSString *right)
133
+ {
134
+ size_t rn, ln, lrdist, n;
135
+ jschar *rs, *ls, *s;
136
+ JSDependentString *ldep; /* non-null if left should become dependent */
137
+ JSString *str;
138
+
139
+ if (JSSTRING_IS_DEPENDENT(right)) {
140
+ rn = JSSTRDEP_LENGTH(right);
141
+ rs = JSSTRDEP_CHARS(right);
142
+ } else {
143
+ rn = right->length;
144
+ rs = right->chars;
145
+ }
146
+ if (rn == 0)
147
+ return left;
148
+
149
+ if (JSSTRING_IS_DEPENDENT(left) ||
150
+ !(*js_GetGCThingFlags(left) & GCF_MUTABLE)) {
151
+ /* We must copy if left does not own a buffer to realloc. */
152
+ ln = JSSTRING_LENGTH(left);
153
+ if (ln == 0)
154
+ return right;
155
+ ls = JSSTRING_CHARS(left);
156
+ s = (jschar *) JS_malloc(cx, (ln + rn + 1) * sizeof(jschar));
157
+ if (!s)
158
+ return NULL;
159
+ js_strncpy(s, ls, ln);
160
+ ldep = NULL;
161
+ } else {
162
+ /* We can realloc left's space and make it depend on our result. */
163
+ ln = left->length;
164
+ if (ln == 0)
165
+ return right;
166
+ ls = left->chars;
167
+ s = (jschar *) JS_realloc(cx, ls, (ln + rn + 1) * sizeof(jschar));
168
+ if (!s)
169
+ return NULL;
170
+
171
+ /* Take care: right could depend on left! */
172
+ lrdist = (size_t)(rs - ls);
173
+ if (lrdist < ln)
174
+ rs = s + lrdist;
175
+ left->chars = ls = s;
176
+ ldep = JSSTRDEP(left);
177
+ }
178
+
179
+ js_strncpy(s + ln, rs, rn);
180
+ n = ln + rn;
181
+ s[n] = 0;
182
+ str = js_NewString(cx, s, n, GCF_MUTABLE);
183
+ if (!str) {
184
+ /* Out of memory: clean up any space we (re-)allocated. */
185
+ if (!ldep) {
186
+ JS_free(cx, s);
187
+ } else {
188
+ s = JS_realloc(cx, ls, (ln + 1) * sizeof(jschar));
189
+ if (s)
190
+ left->chars = s;
191
+ }
192
+ } else {
193
+ /* Morph left into a dependent prefix if we realloc'd its buffer. */
194
+ if (ldep) {
195
+ JSPREFIX_SET_LENGTH(ldep, ln);
196
+ JSPREFIX_SET_BASE(ldep, str);
197
+ #ifdef DEBUG
198
+ {
199
+ JSRuntime *rt = cx->runtime;
200
+ JS_RUNTIME_METER(rt, liveDependentStrings);
201
+ JS_RUNTIME_METER(rt, totalDependentStrings);
202
+ JS_LOCK_RUNTIME_VOID(rt,
203
+ (rt->strdepLengthSum += (double)ln,
204
+ rt->strdepLengthSquaredSum += (double)ln * (double)ln));
205
+ }
206
+ #endif
207
+ }
208
+ }
209
+
210
+ return str;
211
+ }
212
+
213
+ /*
214
+ * May be called with null cx by js_GetStringChars, above; and by the jslock.c
215
+ * MAKE_STRING_IMMUTABLE file-local macro.
216
+ */
217
+ const jschar *
218
+ js_UndependString(JSContext *cx, JSString *str)
219
+ {
220
+ size_t n, size;
221
+ jschar *s;
222
+
223
+ if (JSSTRING_IS_DEPENDENT(str)) {
224
+ n = JSSTRDEP_LENGTH(str);
225
+ size = (n + 1) * sizeof(jschar);
226
+ s = (jschar *) (cx ? JS_malloc(cx, size) : malloc(size));
227
+ if (!s)
228
+ return NULL;
229
+
230
+ js_strncpy(s, JSSTRDEP_CHARS(str), n);
231
+ s[n] = 0;
232
+ str->length = n;
233
+ str->chars = s;
234
+
235
+ #ifdef DEBUG
236
+ if (cx) {
237
+ JSRuntime *rt = cx->runtime;
238
+ JS_RUNTIME_UNMETER(rt, liveDependentStrings);
239
+ JS_RUNTIME_UNMETER(rt, totalDependentStrings);
240
+ JS_LOCK_RUNTIME_VOID(rt,
241
+ (rt->strdepLengthSum -= (double)n,
242
+ rt->strdepLengthSquaredSum -= (double)n * (double)n));
243
+ }
244
+ #endif
245
+ }
246
+
247
+ return str->chars;
248
+ }
249
+
250
+ /*
251
+ * Forward declarations for URI encode/decode and helper routines
252
+ */
253
+ static JSBool
254
+ str_decodeURI(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
255
+ jsval *rval);
256
+
257
+ static JSBool
258
+ str_decodeURI_Component(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
259
+ jsval *rval);
260
+
261
+ static JSBool
262
+ str_encodeURI(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
263
+ jsval *rval);
264
+
265
+ static JSBool
266
+ str_encodeURI_Component(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
267
+ jsval *rval);
268
+
269
+ static int
270
+ OneUcs4ToUtf8Char(uint8 *utf8Buffer, uint32 ucs4Char);
271
+
272
+ static uint32
273
+ Utf8ToOneUcs4Char(const uint8 *utf8Buffer, int utf8Length);
274
+
275
+ /*
276
+ * Contributions from the String class to the set of methods defined for the
277
+ * global object. escape and unescape used to be defined in the Mocha library,
278
+ * but as ECMA decided to spec them, they've been moved to the core engine
279
+ * and made ECMA-compliant. (Incomplete escapes are interpreted as literal
280
+ * characters by unescape.)
281
+ */
282
+
283
+ /*
284
+ * Stuff to emulate the old libmocha escape, which took a second argument
285
+ * giving the type of escape to perform. Retained for compatibility, and
286
+ * copied here to avoid reliance on net.h, mkparse.c/NET_EscapeBytes.
287
+ */
288
+
289
+ #define URL_XALPHAS ((uint8) 1)
290
+ #define URL_XPALPHAS ((uint8) 2)
291
+ #define URL_PATH ((uint8) 4)
292
+
293
+ static const uint8 urlCharType[256] =
294
+ /* Bit 0 xalpha -- the alphas
295
+ * Bit 1 xpalpha -- as xalpha but
296
+ * converts spaces to plus and plus to %20
297
+ * Bit 2 ... path -- as xalphas but doesn't escape '/'
298
+ */
299
+ /* 0 1 2 3 4 5 6 7 8 9 A B C D E F */
300
+ { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x */
301
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 1x */
302
+ 0,0,0,0,0,0,0,0,0,0,7,4,0,7,7,4, /* 2x !"#$%&'()*+,-./ */
303
+ 7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0, /* 3x 0123456789:;<=>? */
304
+ 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, /* 4x @ABCDEFGHIJKLMNO */
305
+ 7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,7, /* 5X PQRSTUVWXYZ[\]^_ */
306
+ 0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, /* 6x `abcdefghijklmno */
307
+ 7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0, /* 7X pqrstuvwxyz{\}~ DEL */
308
+ 0, };
309
+
310
+ /* This matches the ECMA escape set when mask is 7 (default.) */
311
+
312
+ #define IS_OK(C, mask) (urlCharType[((uint8) (C))] & (mask))
313
+
314
+ /* See ECMA-262 15.1.2.4. */
315
+ JSBool
316
+ js_str_escape(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
317
+ {
318
+ JSString *str;
319
+ size_t i, ni, length, newlength;
320
+ const jschar *chars;
321
+ jschar *newchars;
322
+ jschar ch;
323
+ jsint mask;
324
+ jsdouble d;
325
+ const char digits[] = {'0', '1', '2', '3', '4', '5', '6', '7',
326
+ '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
327
+
328
+ mask = URL_XALPHAS | URL_XPALPHAS | URL_PATH;
329
+ if (argc > 1) {
330
+ if (!js_ValueToNumber(cx, argv[1], &d))
331
+ return JS_FALSE;
332
+ if (!JSDOUBLE_IS_FINITE(d) ||
333
+ (mask = (jsint)d) != d ||
334
+ mask & ~(URL_XALPHAS | URL_XPALPHAS | URL_PATH))
335
+ {
336
+ char numBuf[12];
337
+ JS_snprintf(numBuf, sizeof numBuf, "%lx", (unsigned long) mask);
338
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
339
+ JSMSG_BAD_STRING_MASK, numBuf);
340
+ return JS_FALSE;
341
+ }
342
+ }
343
+
344
+ str = js_ValueToString(cx, argv[0]);
345
+ if (!str)
346
+ return JS_FALSE;
347
+ argv[0] = STRING_TO_JSVAL(str);
348
+
349
+ chars = JSSTRING_CHARS(str);
350
+ length = newlength = JSSTRING_LENGTH(str);
351
+
352
+ /* Take a first pass and see how big the result string will need to be. */
353
+ for (i = 0; i < length; i++) {
354
+ if ((ch = chars[i]) < 128 && IS_OK(ch, mask))
355
+ continue;
356
+ if (ch < 256) {
357
+ if (mask == URL_XPALPHAS && ch == ' ')
358
+ continue; /* The character will be encoded as '+' */
359
+ newlength += 2; /* The character will be encoded as %XX */
360
+ } else {
361
+ newlength += 5; /* The character will be encoded as %uXXXX */
362
+ }
363
+ }
364
+
365
+ newchars = (jschar *) JS_malloc(cx, (newlength + 1) * sizeof(jschar));
366
+ if (!newchars)
367
+ return JS_FALSE;
368
+ for (i = 0, ni = 0; i < length; i++) {
369
+ if ((ch = chars[i]) < 128 && IS_OK(ch, mask)) {
370
+ newchars[ni++] = ch;
371
+ } else if (ch < 256) {
372
+ if (mask == URL_XPALPHAS && ch == ' ') {
373
+ newchars[ni++] = '+'; /* convert spaces to pluses */
374
+ } else {
375
+ newchars[ni++] = '%';
376
+ newchars[ni++] = digits[ch >> 4];
377
+ newchars[ni++] = digits[ch & 0xF];
378
+ }
379
+ } else {
380
+ newchars[ni++] = '%';
381
+ newchars[ni++] = 'u';
382
+ newchars[ni++] = digits[ch >> 12];
383
+ newchars[ni++] = digits[(ch & 0xF00) >> 8];
384
+ newchars[ni++] = digits[(ch & 0xF0) >> 4];
385
+ newchars[ni++] = digits[ch & 0xF];
386
+ }
387
+ }
388
+ JS_ASSERT(ni == newlength);
389
+ newchars[newlength] = 0;
390
+
391
+ str = js_NewString(cx, newchars, newlength, 0);
392
+ if (!str) {
393
+ JS_free(cx, newchars);
394
+ return JS_FALSE;
395
+ }
396
+ *rval = STRING_TO_JSVAL(str);
397
+ return JS_TRUE;
398
+ }
399
+ #undef IS_OK
400
+
401
+ /* See ECMA-262 15.1.2.5 */
402
+ static JSBool
403
+ str_unescape(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
404
+ {
405
+ JSString *str;
406
+ size_t i, ni, length;
407
+ const jschar *chars;
408
+ jschar *newchars;
409
+ jschar ch;
410
+
411
+ str = js_ValueToString(cx, argv[0]);
412
+ if (!str)
413
+ return JS_FALSE;
414
+ argv[0] = STRING_TO_JSVAL(str);
415
+
416
+ chars = JSSTRING_CHARS(str);
417
+ length = JSSTRING_LENGTH(str);
418
+
419
+ /* Don't bother allocating less space for the new string. */
420
+ newchars = (jschar *) JS_malloc(cx, (length + 1) * sizeof(jschar));
421
+ if (!newchars)
422
+ return JS_FALSE;
423
+ ni = i = 0;
424
+ while (i < length) {
425
+ ch = chars[i++];
426
+ if (ch == '%') {
427
+ if (i + 1 < length &&
428
+ JS7_ISHEX(chars[i]) && JS7_ISHEX(chars[i + 1]))
429
+ {
430
+ ch = JS7_UNHEX(chars[i]) * 16 + JS7_UNHEX(chars[i + 1]);
431
+ i += 2;
432
+ } else if (i + 4 < length && chars[i] == 'u' &&
433
+ JS7_ISHEX(chars[i + 1]) && JS7_ISHEX(chars[i + 2]) &&
434
+ JS7_ISHEX(chars[i + 3]) && JS7_ISHEX(chars[i + 4]))
435
+ {
436
+ ch = (((((JS7_UNHEX(chars[i + 1]) << 4)
437
+ + JS7_UNHEX(chars[i + 2])) << 4)
438
+ + JS7_UNHEX(chars[i + 3])) << 4)
439
+ + JS7_UNHEX(chars[i + 4]);
440
+ i += 5;
441
+ }
442
+ }
443
+ newchars[ni++] = ch;
444
+ }
445
+ newchars[ni] = 0;
446
+
447
+ str = js_NewString(cx, newchars, ni, 0);
448
+ if (!str) {
449
+ JS_free(cx, newchars);
450
+ return JS_FALSE;
451
+ }
452
+ *rval = STRING_TO_JSVAL(str);
453
+ return JS_TRUE;
454
+ }
455
+
456
+ #if JS_HAS_UNEVAL
457
+ static JSBool
458
+ str_uneval(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
459
+ {
460
+ JSString *str;
461
+
462
+ str = js_ValueToSource(cx, argv[0]);
463
+ if (!str)
464
+ return JS_FALSE;
465
+ *rval = STRING_TO_JSVAL(str);
466
+ return JS_TRUE;
467
+ }
468
+ #endif
469
+
470
+ const char js_escape_str[] = "escape";
471
+ const char js_unescape_str[] = "unescape";
472
+ #if JS_HAS_UNEVAL
473
+ const char js_uneval_str[] = "uneval";
474
+ #endif
475
+ const char js_decodeURI_str[] = "decodeURI";
476
+ const char js_encodeURI_str[] = "encodeURI";
477
+ const char js_decodeURIComponent_str[] = "decodeURIComponent";
478
+ const char js_encodeURIComponent_str[] = "encodeURIComponent";
479
+
480
+ static JSFunctionSpec string_functions[] = {
481
+ {js_escape_str, js_str_escape, 1,0,0},
482
+ {js_unescape_str, str_unescape, 1,0,0},
483
+ #if JS_HAS_UNEVAL
484
+ {js_uneval_str, str_uneval, 1,0,0},
485
+ #endif
486
+ {js_decodeURI_str, str_decodeURI, 1,0,0},
487
+ {js_encodeURI_str, str_encodeURI, 1,0,0},
488
+ {js_decodeURIComponent_str, str_decodeURI_Component, 1,0,0},
489
+ {js_encodeURIComponent_str, str_encodeURI_Component, 1,0,0},
490
+
491
+ {0,0,0,0,0}
492
+ };
493
+
494
+ jschar js_empty_ucstr[] = {0};
495
+ JSSubString js_EmptySubString = {0, js_empty_ucstr};
496
+
497
+ enum string_tinyid {
498
+ STRING_LENGTH = -1
499
+ };
500
+
501
+ static JSPropertySpec string_props[] = {
502
+ {js_length_str, STRING_LENGTH,
503
+ JSPROP_READONLY|JSPROP_PERMANENT|JSPROP_SHARED, 0,0},
504
+ {0,0,0,0,0}
505
+ };
506
+
507
+ static JSBool
508
+ str_getProperty(JSContext *cx, JSObject *obj, jsval id, jsval *vp)
509
+ {
510
+ JSString *str;
511
+ jsint slot;
512
+
513
+ if (!JSVAL_IS_INT(id))
514
+ return JS_TRUE;
515
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
516
+ if (!str)
517
+ return JS_FALSE;
518
+ slot = JSVAL_TO_INT(id);
519
+ if (slot == STRING_LENGTH)
520
+ *vp = INT_TO_JSVAL((jsint) JSSTRING_LENGTH(str));
521
+ return JS_TRUE;
522
+ }
523
+
524
+ #define STRING_ELEMENT_ATTRS (JSPROP_ENUMERATE|JSPROP_READONLY|JSPROP_PERMANENT)
525
+
526
+ static JSBool
527
+ str_enumerate(JSContext *cx, JSObject *obj)
528
+ {
529
+ JSString *str, *str1;
530
+ size_t i, length;
531
+
532
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
533
+ if (!str)
534
+ return JS_FALSE;
535
+ length = JSSTRING_LENGTH(str);
536
+ for (i = 0; i < length; i++) {
537
+ str1 = js_NewDependentString(cx, str, i, 1, 0);
538
+ if (!str1)
539
+ return JS_FALSE;
540
+ if (!OBJ_DEFINE_PROPERTY(cx, obj, INT_TO_JSVAL(i),
541
+ STRING_TO_JSVAL(str1), NULL, NULL,
542
+ STRING_ELEMENT_ATTRS, NULL)) {
543
+ return JS_FALSE;
544
+ }
545
+ }
546
+ return JS_TRUE;
547
+ }
548
+
549
+ static JSBool
550
+ str_resolve(JSContext *cx, JSObject *obj, jsval id)
551
+ {
552
+ JSString *str, *str1;
553
+ jsint slot;
554
+
555
+ if (!JSVAL_IS_INT(id))
556
+ return JS_TRUE;
557
+
558
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
559
+ if (!str)
560
+ return JS_FALSE;
561
+ slot = JSVAL_TO_INT(id);
562
+ if ((size_t)slot < JSSTRING_LENGTH(str)) {
563
+ str1 = js_NewDependentString(cx, str, (size_t)slot, 1, 0);
564
+ if (!str1)
565
+ return JS_FALSE;
566
+ if (!OBJ_DEFINE_PROPERTY(cx, obj, INT_TO_JSVAL(slot),
567
+ STRING_TO_JSVAL(str1), NULL, NULL,
568
+ STRING_ELEMENT_ATTRS, NULL)) {
569
+ return JS_FALSE;
570
+ }
571
+ }
572
+ return JS_TRUE;
573
+ }
574
+
575
+ static JSClass string_class = {
576
+ js_String_str,
577
+ JSCLASS_HAS_PRIVATE,
578
+ JS_PropertyStub, JS_PropertyStub, str_getProperty, JS_PropertyStub,
579
+ str_enumerate, str_resolve, JS_ConvertStub, JS_FinalizeStub,
580
+ JSCLASS_NO_OPTIONAL_MEMBERS
581
+ };
582
+
583
+ #if JS_HAS_TOSOURCE
584
+
585
+ /*
586
+ * String.prototype.quote is generic (as are most string methods), unlike
587
+ * toSource, toString, and valueOf.
588
+ */
589
+ static JSBool
590
+ str_quote(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
591
+ {
592
+ JSString *str;
593
+
594
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
595
+ if (!str)
596
+ return JS_FALSE;
597
+ str = js_QuoteString(cx, str, '"');
598
+ if (!str)
599
+ return JS_FALSE;
600
+ *rval = STRING_TO_JSVAL(str);
601
+ return JS_TRUE;
602
+ }
603
+
604
+ static JSBool
605
+ str_toSource(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
606
+ {
607
+ jsval v;
608
+ JSString *str;
609
+ size_t i, j, k, n;
610
+ char buf[16];
611
+ jschar *s, *t;
612
+
613
+ if (!JS_InstanceOf(cx, obj, &string_class, argv))
614
+ return JS_FALSE;
615
+ v = OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE);
616
+ if (!JSVAL_IS_STRING(v))
617
+ return js_obj_toSource(cx, obj, argc, argv, rval);
618
+ str = js_QuoteString(cx, JSVAL_TO_STRING(v), '"');
619
+ if (!str)
620
+ return JS_FALSE;
621
+ j = JS_snprintf(buf, sizeof buf, "(new %s(", string_class.name);
622
+ s = JSSTRING_CHARS(str);
623
+ k = JSSTRING_LENGTH(str);
624
+ n = j + k + 2;
625
+ t = (jschar *) JS_malloc(cx, (n + 1) * sizeof(jschar));
626
+ if (!t)
627
+ return JS_FALSE;
628
+ for (i = 0; i < j; i++)
629
+ t[i] = buf[i];
630
+ for (j = 0; j < k; i++, j++)
631
+ t[i] = s[j];
632
+ t[i++] = ')';
633
+ t[i++] = ')';
634
+ t[i] = 0;
635
+ str = js_NewString(cx, t, n, 0);
636
+ if (!str) {
637
+ JS_free(cx, t);
638
+ return JS_FALSE;
639
+ }
640
+ *rval = STRING_TO_JSVAL(str);
641
+ return JS_TRUE;
642
+ }
643
+
644
+ #endif /* JS_HAS_TOSOURCE */
645
+
646
+ static JSBool
647
+ str_toString(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
648
+ {
649
+ jsval v;
650
+
651
+ if (!JS_InstanceOf(cx, obj, &string_class, argv))
652
+ return JS_FALSE;
653
+ v = OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE);
654
+ if (!JSVAL_IS_STRING(v))
655
+ return js_obj_toString(cx, obj, argc, argv, rval);
656
+ *rval = v;
657
+ return JS_TRUE;
658
+ }
659
+
660
+ static JSBool
661
+ str_valueOf(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
662
+ {
663
+ if (!JS_InstanceOf(cx, obj, &string_class, argv))
664
+ return JS_FALSE;
665
+ *rval = OBJ_GET_SLOT(cx, obj, JSSLOT_PRIVATE);
666
+ return JS_TRUE;
667
+ }
668
+
669
+ /*
670
+ * Java-like string native methods.
671
+ */
672
+ static JSBool
673
+ str_substring(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
674
+ jsval *rval)
675
+ {
676
+ JSString *str;
677
+ jsdouble d;
678
+ jsdouble length, begin, end;
679
+
680
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
681
+ if (!str)
682
+ return JS_FALSE;
683
+ argv[-1] = STRING_TO_JSVAL(str);
684
+
685
+ if (argc != 0) {
686
+ if (!js_ValueToNumber(cx, argv[0], &d))
687
+ return JS_FALSE;
688
+ length = JSSTRING_LENGTH(str);
689
+ begin = js_DoubleToInteger(d);
690
+ if (begin < 0)
691
+ begin = 0;
692
+ else if (begin > length)
693
+ begin = length;
694
+
695
+ if (argc == 1) {
696
+ end = length;
697
+ } else {
698
+ if (!js_ValueToNumber(cx, argv[1], &d))
699
+ return JS_FALSE;
700
+ end = js_DoubleToInteger(d);
701
+ if (end < 0)
702
+ end = 0;
703
+ else if (end > length)
704
+ end = length;
705
+ if (end < begin) {
706
+ if (cx->version != JSVERSION_1_2) {
707
+ /* XXX emulate old JDK1.0 java.lang.String.substring. */
708
+ jsdouble tmp = begin;
709
+ begin = end;
710
+ end = tmp;
711
+ } else {
712
+ end = begin;
713
+ }
714
+ }
715
+ }
716
+
717
+ str = js_NewDependentString(cx, str, (size_t)begin,
718
+ (size_t)(end - begin), 0);
719
+ if (!str)
720
+ return JS_FALSE;
721
+ }
722
+ *rval = STRING_TO_JSVAL(str);
723
+ return JS_TRUE;
724
+ }
725
+
726
+ static JSBool
727
+ str_toLowerCase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
728
+ jsval *rval)
729
+ {
730
+ JSString *str;
731
+ size_t i, n;
732
+ jschar *s, *news;
733
+
734
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
735
+ if (!str)
736
+ return JS_FALSE;
737
+ n = JSSTRING_LENGTH(str);
738
+ news = (jschar *) JS_malloc(cx, (n + 1) * sizeof(jschar));
739
+ if (!news)
740
+ return JS_FALSE;
741
+ s = JSSTRING_CHARS(str);
742
+ for (i = 0; i < n; i++)
743
+ news[i] = JS_TOLOWER(s[i]);
744
+ news[n] = 0;
745
+ str = js_NewString(cx, news, n, 0);
746
+ if (!str) {
747
+ JS_free(cx, news);
748
+ return JS_FALSE;
749
+ }
750
+ *rval = STRING_TO_JSVAL(str);
751
+ return JS_TRUE;
752
+ }
753
+
754
+ static JSBool
755
+ str_toLocaleLowerCase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
756
+ jsval *rval)
757
+ {
758
+ JSString *str;
759
+
760
+ /*
761
+ * Forcefully ignore the first (or any) argument and return toLowerCase(),
762
+ * ECMA has reserved that argument, presumably for defining the locale.
763
+ */
764
+ if (cx->localeCallbacks && cx->localeCallbacks->localeToLowerCase) {
765
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
766
+ if (!str)
767
+ return JS_FALSE;
768
+ return cx->localeCallbacks->localeToLowerCase(cx, str, rval);
769
+ }
770
+ return str_toLowerCase(cx, obj, 0, argv, rval);
771
+ }
772
+
773
+ static JSBool
774
+ str_toUpperCase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
775
+ jsval *rval)
776
+ {
777
+ JSString *str;
778
+ size_t i, n;
779
+ jschar *s, *news;
780
+
781
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
782
+ if (!str)
783
+ return JS_FALSE;
784
+ n = JSSTRING_LENGTH(str);
785
+ news = (jschar *) JS_malloc(cx, (n + 1) * sizeof(jschar));
786
+ if (!news)
787
+ return JS_FALSE;
788
+ s = JSSTRING_CHARS(str);
789
+ for (i = 0; i < n; i++)
790
+ news[i] = JS_TOUPPER(s[i]);
791
+ news[n] = 0;
792
+ str = js_NewString(cx, news, n, 0);
793
+ if (!str) {
794
+ JS_free(cx, news);
795
+ return JS_FALSE;
796
+ }
797
+ *rval = STRING_TO_JSVAL(str);
798
+ return JS_TRUE;
799
+ }
800
+
801
+ static JSBool
802
+ str_toLocaleUpperCase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
803
+ jsval *rval)
804
+ {
805
+ JSString *str;
806
+
807
+ /*
808
+ * Forcefully ignore the first (or any) argument and return toUpperCase(),
809
+ * ECMA has reserved that argument, presumbaly for defining the locale.
810
+ */
811
+ if (cx->localeCallbacks && cx->localeCallbacks->localeToUpperCase) {
812
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
813
+ if (!str)
814
+ return JS_FALSE;
815
+ return cx->localeCallbacks->localeToUpperCase(cx, str, rval);
816
+ }
817
+ return str_toUpperCase(cx, obj, 0, argv, rval);
818
+ }
819
+
820
+ static JSBool
821
+ str_localeCompare(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
822
+ jsval *rval)
823
+ {
824
+ JSString *str, *thatStr;
825
+
826
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
827
+ if (!str)
828
+ return JS_FALSE;
829
+ argv[-1] = STRING_TO_JSVAL(str);
830
+
831
+ if (argc == 0) {
832
+ *rval = JSVAL_ZERO;
833
+ } else {
834
+ thatStr = js_ValueToString(cx, argv[0]);
835
+ if (!thatStr)
836
+ return JS_FALSE;
837
+ if (cx->localeCallbacks && cx->localeCallbacks->localeCompare)
838
+ return cx->localeCallbacks->localeCompare(cx, str, thatStr, rval);
839
+ *rval = INT_TO_JSVAL(js_CompareStrings(str, thatStr));
840
+ }
841
+ return JS_TRUE;
842
+ }
843
+
844
+ static JSBool
845
+ str_charAt(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
846
+ {
847
+ JSString *str;
848
+ jsdouble d;
849
+ size_t index;
850
+
851
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
852
+ if (!str)
853
+ return JS_FALSE;
854
+ argv[-1] = STRING_TO_JSVAL(str);
855
+
856
+ if (argc == 0) {
857
+ d = 0.0;
858
+ } else {
859
+ if (!js_ValueToNumber(cx, argv[0], &d))
860
+ return JS_FALSE;
861
+ d = js_DoubleToInteger(d);
862
+ }
863
+
864
+ if (d < 0 || JSSTRING_LENGTH(str) <= d) {
865
+ *rval = JS_GetEmptyStringValue(cx);
866
+ } else {
867
+ index = (size_t)d;
868
+ str = js_NewDependentString(cx, str, index, 1, 0);
869
+ if (!str)
870
+ return JS_FALSE;
871
+ *rval = STRING_TO_JSVAL(str);
872
+ }
873
+ return JS_TRUE;
874
+ }
875
+
876
+ static JSBool
877
+ str_charCodeAt(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
878
+ jsval *rval)
879
+ {
880
+ JSString *str;
881
+ jsdouble d;
882
+ size_t index;
883
+
884
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
885
+ if (!str)
886
+ return JS_FALSE;
887
+ argv[-1] = STRING_TO_JSVAL(str);
888
+
889
+ if (argc == 0) {
890
+ d = 0.0;
891
+ } else {
892
+ if (!js_ValueToNumber(cx, argv[0], &d))
893
+ return JS_FALSE;
894
+ d = js_DoubleToInteger(d);
895
+ }
896
+
897
+ if (d < 0 || JSSTRING_LENGTH(str) <= d) {
898
+ *rval = JS_GetNaNValue(cx);
899
+ } else {
900
+ index = (size_t)d;
901
+ *rval = INT_TO_JSVAL((jsint) JSSTRING_CHARS(str)[index]);
902
+ }
903
+ return JS_TRUE;
904
+ }
905
+
906
+ jsint
907
+ js_BoyerMooreHorspool(const jschar *text, jsint textlen,
908
+ const jschar *pat, jsint patlen,
909
+ jsint start)
910
+ {
911
+ jsint i, j, k, m;
912
+ uint8 skip[BMH_CHARSET_SIZE];
913
+ jschar c;
914
+
915
+ JS_ASSERT(0 < patlen && patlen <= BMH_PATLEN_MAX);
916
+ for (i = 0; i < BMH_CHARSET_SIZE; i++)
917
+ skip[i] = (uint8)patlen;
918
+ m = patlen - 1;
919
+ for (i = 0; i < m; i++) {
920
+ c = pat[i];
921
+ if (c >= BMH_CHARSET_SIZE)
922
+ return BMH_BAD_PATTERN;
923
+ skip[c] = (uint8)(m - i);
924
+ }
925
+ for (k = start + m;
926
+ k < textlen;
927
+ k += ((c = text[k]) >= BMH_CHARSET_SIZE) ? patlen : skip[c]) {
928
+ for (i = k, j = m; ; i--, j--) {
929
+ if (j < 0)
930
+ return i + 1;
931
+ if (text[i] != pat[j])
932
+ break;
933
+ }
934
+ }
935
+ return -1;
936
+ }
937
+
938
+ static JSBool
939
+ str_indexOf(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
940
+ {
941
+ JSString *str, *str2;
942
+ jsint i, j, index, textlen, patlen;
943
+ const jschar *text, *pat;
944
+ jsdouble d;
945
+
946
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
947
+ if (!str)
948
+ return JS_FALSE;
949
+ argv[-1] = STRING_TO_JSVAL(str);
950
+ text = JSSTRING_CHARS(str);
951
+ textlen = (jsint) JSSTRING_LENGTH(str);
952
+
953
+ str2 = js_ValueToString(cx, argv[0]);
954
+ if (!str2)
955
+ return JS_FALSE;
956
+ argv[0] = STRING_TO_JSVAL(str2);
957
+ pat = JSSTRING_CHARS(str2);
958
+ patlen = (jsint) JSSTRING_LENGTH(str2);
959
+
960
+ if (argc > 1) {
961
+ if (!js_ValueToNumber(cx, argv[1], &d))
962
+ return JS_FALSE;
963
+ d = js_DoubleToInteger(d);
964
+ if (d < 0)
965
+ i = 0;
966
+ else if (d > textlen)
967
+ i = textlen;
968
+ else
969
+ i = (jsint)d;
970
+ } else {
971
+ i = 0;
972
+ }
973
+ if (patlen == 0) {
974
+ *rval = INT_TO_JSVAL(i);
975
+ return JS_TRUE;
976
+ }
977
+
978
+ /* XXX tune the BMH threshold (512) */
979
+ if ((jsuint)(patlen - 2) <= BMH_PATLEN_MAX - 2 && textlen >= 512) {
980
+ index = js_BoyerMooreHorspool(text, textlen, pat, patlen, i);
981
+ if (index != BMH_BAD_PATTERN)
982
+ goto out;
983
+ }
984
+
985
+ index = -1;
986
+ j = 0;
987
+ while (i + j < textlen) {
988
+ if (text[i + j] == pat[j]) {
989
+ if (++j == patlen) {
990
+ index = i;
991
+ break;
992
+ }
993
+ } else {
994
+ i++;
995
+ j = 0;
996
+ }
997
+ }
998
+
999
+ out:
1000
+ *rval = INT_TO_JSVAL(index);
1001
+ return JS_TRUE;
1002
+ }
1003
+
1004
+ static JSBool
1005
+ str_lastIndexOf(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
1006
+ jsval *rval)
1007
+ {
1008
+ JSString *str, *str2;
1009
+ const jschar *text, *pat;
1010
+ jsint i, j, textlen, patlen;
1011
+ jsdouble d;
1012
+
1013
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
1014
+ if (!str)
1015
+ return JS_FALSE;
1016
+ argv[-1] = STRING_TO_JSVAL(str);
1017
+ text = JSSTRING_CHARS(str);
1018
+ textlen = (jsint) JSSTRING_LENGTH(str);
1019
+
1020
+ str2 = js_ValueToString(cx, argv[0]);
1021
+ if (!str2)
1022
+ return JS_FALSE;
1023
+ argv[0] = STRING_TO_JSVAL(str2);
1024
+ pat = JSSTRING_CHARS(str2);
1025
+ patlen = (jsint) JSSTRING_LENGTH(str2);
1026
+
1027
+ if (argc > 1) {
1028
+ if (!js_ValueToNumber(cx, argv[1], &d))
1029
+ return JS_FALSE;
1030
+ if (JSDOUBLE_IS_NaN(d)) {
1031
+ i = textlen;
1032
+ } else {
1033
+ d = js_DoubleToInteger(d);
1034
+ if (d < 0)
1035
+ i = 0;
1036
+ else if (d > textlen - patlen)
1037
+ i = textlen - patlen;
1038
+ else
1039
+ i = (jsint)d;
1040
+ }
1041
+ } else {
1042
+ i = textlen;
1043
+ }
1044
+
1045
+ if (patlen == 0) {
1046
+ *rval = INT_TO_JSVAL(i);
1047
+ return JS_TRUE;
1048
+ }
1049
+
1050
+ j = 0;
1051
+ while (i >= 0) {
1052
+ /* Don't assume that text is NUL-terminated: it could be dependent. */
1053
+ if (i + j < textlen && text[i + j] == pat[j]) {
1054
+ if (++j == patlen)
1055
+ break;
1056
+ } else {
1057
+ i--;
1058
+ j = 0;
1059
+ }
1060
+ }
1061
+ *rval = INT_TO_JSVAL(i);
1062
+ return JS_TRUE;
1063
+ }
1064
+
1065
+ /*
1066
+ * Perl-inspired string functions.
1067
+ */
1068
+ #if JS_HAS_REGEXPS
1069
+ typedef struct GlobData {
1070
+ uintN flags; /* inout: mode and flag bits, see below */
1071
+ uintN optarg; /* in: index of optional flags argument */
1072
+ JSString *str; /* out: 'this' parameter object as string */
1073
+ JSRegExp *regexp; /* out: regexp parameter object private data */
1074
+ } GlobData;
1075
+
1076
+ /*
1077
+ * Mode and flag bit definitions for match_or_replace's GlobData.flags field.
1078
+ */
1079
+ #define MODE_MATCH 0x00 /* in: return match array on success */
1080
+ #define MODE_REPLACE 0x01 /* in: match and replace */
1081
+ #define MODE_SEARCH 0x02 /* in: search only, return match index or -1 */
1082
+ #define GET_MODE(f) ((f) & 0x03)
1083
+ #define FORCE_FLAT 0x04 /* in: force flat (non-regexp) string match */
1084
+ #define KEEP_REGEXP 0x08 /* inout: keep GlobData.regexp alive for caller
1085
+ of match_or_replace; if set on input
1086
+ but clear on output, regexp ownership
1087
+ does not pass to caller */
1088
+ #define GLOBAL_REGEXP 0x10 /* out: regexp had the 'g' flag */
1089
+
1090
+ static JSBool
1091
+ match_or_replace(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
1092
+ JSBool (*glob)(JSContext *cx, jsint count, GlobData *data),
1093
+ GlobData *data, jsval *rval)
1094
+ {
1095
+ JSString *str, *src, *opt;
1096
+ JSObject *reobj;
1097
+ JSRegExp *re;
1098
+ size_t index, length;
1099
+ JSBool ok, test;
1100
+ jsint count;
1101
+
1102
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
1103
+ if (!str)
1104
+ return JS_FALSE;
1105
+ argv[-1] = STRING_TO_JSVAL(str);
1106
+ data->str = str;
1107
+
1108
+ if (JSVAL_IS_REGEXP(cx, argv[0])) {
1109
+ reobj = JSVAL_TO_OBJECT(argv[0]);
1110
+ re = (JSRegExp *) JS_GetPrivate(cx, reobj);
1111
+ } else {
1112
+ src = js_ValueToString(cx, argv[0]);
1113
+ if (!src)
1114
+ return JS_FALSE;
1115
+ if (data->optarg < argc) {
1116
+ argv[0] = STRING_TO_JSVAL(src);
1117
+ opt = js_ValueToString(cx, argv[data->optarg]);
1118
+ if (!opt)
1119
+ return JS_FALSE;
1120
+ } else {
1121
+ opt = NULL;
1122
+ }
1123
+ re = js_NewRegExpOpt(cx, NULL, src, opt,
1124
+ (data->flags & FORCE_FLAT) != 0);
1125
+ if (!re)
1126
+ return JS_FALSE;
1127
+ reobj = NULL;
1128
+ }
1129
+ data->regexp = re;
1130
+
1131
+ if (re->flags & JSREG_GLOB)
1132
+ data->flags |= GLOBAL_REGEXP;
1133
+ index = 0;
1134
+ if (GET_MODE(data->flags) == MODE_SEARCH) {
1135
+ ok = js_ExecuteRegExp(cx, re, str, &index, JS_TRUE, rval);
1136
+ if (ok) {
1137
+ *rval = (*rval == JSVAL_TRUE)
1138
+ ? INT_TO_JSVAL(cx->regExpStatics.leftContext.length)
1139
+ : INT_TO_JSVAL(-1);
1140
+ }
1141
+ } else if (data->flags & GLOBAL_REGEXP) {
1142
+ if (reobj) {
1143
+ /* Set the lastIndex property's reserved slot to 0. */
1144
+ ok = js_SetLastIndex(cx, reobj, 0);
1145
+ if (!ok)
1146
+ return JS_FALSE;
1147
+ } else {
1148
+ ok = JS_TRUE;
1149
+ }
1150
+ length = JSSTRING_LENGTH(str);
1151
+ for (count = 0; index <= length; count++) {
1152
+ ok = js_ExecuteRegExp(cx, re, str, &index, JS_TRUE, rval);
1153
+ if (!ok || *rval != JSVAL_TRUE)
1154
+ break;
1155
+ ok = glob(cx, count, data);
1156
+ if (!ok)
1157
+ break;
1158
+ if (cx->regExpStatics.lastMatch.length == 0) {
1159
+ if (index == length)
1160
+ break;
1161
+ index++;
1162
+ }
1163
+ }
1164
+ } else {
1165
+ if (GET_MODE(data->flags) == MODE_REPLACE) {
1166
+ test = JS_TRUE;
1167
+ } else {
1168
+ /*
1169
+ * MODE_MATCH implies str_match is being called from a script or a
1170
+ * scripted function. If the caller cares only about testing null
1171
+ * vs. non-null return value, optimize away the array object that
1172
+ * would normally be returned in *rval.
1173
+ */
1174
+ JS_ASSERT(*cx->fp->down->pc == JSOP_CALL ||
1175
+ *cx->fp->down->pc == JSOP_NEW);
1176
+ JS_ASSERT(js_CodeSpec[*cx->fp->down->pc].length == 3);
1177
+ switch (cx->fp->down->pc[3]) {
1178
+ case JSOP_POP:
1179
+ case JSOP_IFEQ:
1180
+ case JSOP_IFNE:
1181
+ case JSOP_IFEQX:
1182
+ case JSOP_IFNEX:
1183
+ test = JS_TRUE;
1184
+ break;
1185
+ default:
1186
+ test = JS_FALSE;
1187
+ break;
1188
+ }
1189
+ }
1190
+ ok = js_ExecuteRegExp(cx, re, str, &index, test, rval);
1191
+ }
1192
+
1193
+ if (reobj) {
1194
+ /* Tell our caller that it doesn't need to destroy data->regexp. */
1195
+ data->flags &= ~KEEP_REGEXP;
1196
+ } else if (!(data->flags & KEEP_REGEXP)) {
1197
+ /* Caller didn't want to keep data->regexp, so null and destroy it. */
1198
+ data->regexp = NULL;
1199
+ js_DestroyRegExp(cx, re);
1200
+ }
1201
+ return ok;
1202
+ }
1203
+
1204
+ typedef struct MatchData {
1205
+ GlobData base;
1206
+ jsval *arrayval; /* NB: local root pointer */
1207
+ } MatchData;
1208
+
1209
+ static JSBool
1210
+ match_glob(JSContext *cx, jsint count, GlobData *data)
1211
+ {
1212
+ MatchData *mdata;
1213
+ JSObject *arrayobj;
1214
+ JSSubString *matchsub;
1215
+ JSString *matchstr;
1216
+ jsval v;
1217
+
1218
+ mdata = (MatchData *)data;
1219
+ arrayobj = JSVAL_TO_OBJECT(*mdata->arrayval);
1220
+ if (!arrayobj) {
1221
+ arrayobj = js_ConstructObject(cx, &js_ArrayClass, NULL, NULL, 0, NULL);
1222
+ if (!arrayobj)
1223
+ return JS_FALSE;
1224
+ *mdata->arrayval = OBJECT_TO_JSVAL(arrayobj);
1225
+ }
1226
+ matchsub = &cx->regExpStatics.lastMatch;
1227
+ matchstr = js_NewStringCopyN(cx, matchsub->chars, matchsub->length, 0);
1228
+ if (!matchstr)
1229
+ return JS_FALSE;
1230
+ v = STRING_TO_JSVAL(matchstr);
1231
+ return js_SetProperty(cx, arrayobj, INT_TO_JSVAL(count), &v);
1232
+ }
1233
+
1234
+ static JSBool
1235
+ str_match(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1236
+ {
1237
+ MatchData mdata;
1238
+ JSBool ok;
1239
+
1240
+ mdata.base.flags = MODE_MATCH;
1241
+ mdata.base.optarg = 1;
1242
+ mdata.arrayval = &argv[2];
1243
+ *mdata.arrayval = JSVAL_NULL;
1244
+ ok = match_or_replace(cx, obj, argc, argv, match_glob, &mdata.base, rval);
1245
+ if (ok && !JSVAL_IS_NULL(*mdata.arrayval))
1246
+ *rval = *mdata.arrayval;
1247
+ return ok;
1248
+ }
1249
+
1250
+ static JSBool
1251
+ str_search(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1252
+ {
1253
+ GlobData data;
1254
+
1255
+ data.flags = MODE_SEARCH;
1256
+ data.optarg = 1;
1257
+ return match_or_replace(cx, obj, argc, argv, NULL, &data, rval);
1258
+ }
1259
+
1260
+ typedef struct ReplaceData {
1261
+ GlobData base; /* base struct state */
1262
+ JSObject *lambda; /* replacement function object or null */
1263
+ JSString *repstr; /* replacement string */
1264
+ jschar *dollar; /* null or pointer to first $ in repstr */
1265
+ jschar *dollarEnd; /* limit pointer for js_strchr_limit */
1266
+ jschar *chars; /* result chars, null initially */
1267
+ size_t length; /* result length, 0 initially */
1268
+ jsint index; /* index in result of next replacement */
1269
+ jsint leftIndex; /* left context index in base.str->chars */
1270
+ JSSubString dollarStr; /* for "$$" interpret_dollar result */
1271
+ } ReplaceData;
1272
+
1273
+ static JSSubString *
1274
+ interpret_dollar(JSContext *cx, jschar *dp, ReplaceData *rdata, size_t *skip)
1275
+ {
1276
+ JSRegExpStatics *res;
1277
+ jschar dc, *cp;
1278
+ uintN num, tmp;
1279
+ JSString *str;
1280
+
1281
+ JS_ASSERT(*dp == '$');
1282
+
1283
+ /*
1284
+ * Allow a real backslash (literal "\\" before "$1") to escape "$1", e.g.
1285
+ * Do this only for versions strictly less than ECMAv3.
1286
+ */
1287
+ if (cx->version != JSVERSION_DEFAULT && cx->version <= JSVERSION_1_4) {
1288
+ if (dp > JSSTRING_CHARS(rdata->repstr) && dp[-1] == '\\')
1289
+ return NULL;
1290
+ }
1291
+
1292
+ /* Interpret all Perl match-induced dollar variables. */
1293
+ res = &cx->regExpStatics;
1294
+ dc = dp[1];
1295
+ if (JS7_ISDEC(dc)) {
1296
+ if (cx->version != JSVERSION_DEFAULT && cx->version <= JSVERSION_1_4) {
1297
+ if (dc == '0')
1298
+ return NULL;
1299
+
1300
+ /* Check for overflow to avoid gobbling arbitrary decimal digits. */
1301
+ num = 0;
1302
+ cp = dp;
1303
+ while ((dc = *++cp) != 0 && JS7_ISDEC(dc)) {
1304
+ tmp = 10 * num + JS7_UNDEC(dc);
1305
+ if (tmp < num)
1306
+ break;
1307
+ num = tmp;
1308
+ }
1309
+ } else { /* ECMA 3, 1-9 or 01-99 */
1310
+ num = JS7_UNDEC(dc);
1311
+ if (num > res->parenCount)
1312
+ return NULL;
1313
+ cp = dp + 2;
1314
+ dc = *cp;
1315
+ if ((dc != 0) && JS7_ISDEC(dc)) {
1316
+ tmp = 10 * num + JS7_UNDEC(dc);
1317
+ if (tmp <= res->parenCount) {
1318
+ cp++;
1319
+ num = tmp;
1320
+ }
1321
+ }
1322
+ if (num == 0)
1323
+ return NULL;
1324
+ }
1325
+ /* Adjust num from 1 $n-origin to 0 array-index-origin. */
1326
+ num--;
1327
+ *skip = cp - dp;
1328
+ return REGEXP_PAREN_SUBSTRING(res, num);
1329
+ }
1330
+
1331
+ *skip = 2;
1332
+ switch (dc) {
1333
+ case '$':
1334
+ rdata->dollarStr.chars = dp;
1335
+ rdata->dollarStr.length = 1;
1336
+ return &rdata->dollarStr;
1337
+ case '&':
1338
+ return &res->lastMatch;
1339
+ case '+':
1340
+ return &res->lastParen;
1341
+ case '`':
1342
+ if (cx->version == JSVERSION_1_2) {
1343
+ /*
1344
+ * JS1.2 imitated the Perl4 bug where left context at each step
1345
+ * in an iterative use of a global regexp started from last match,
1346
+ * not from the start of the target string. But Perl4 does start
1347
+ * $` at the beginning of the target string when it is used in a
1348
+ * substitution, so we emulate that special case here.
1349
+ */
1350
+ str = rdata->base.str;
1351
+ res->leftContext.chars = JSSTRING_CHARS(str);
1352
+ res->leftContext.length = res->lastMatch.chars
1353
+ - JSSTRING_CHARS(str);
1354
+ }
1355
+ return &res->leftContext;
1356
+ case '\'':
1357
+ return &res->rightContext;
1358
+ }
1359
+ return NULL;
1360
+ }
1361
+
1362
+ static JSBool
1363
+ find_replen(JSContext *cx, ReplaceData *rdata, size_t *sizep)
1364
+ {
1365
+ JSString *repstr;
1366
+ size_t replen, skip;
1367
+ jschar *dp, *ep;
1368
+ JSSubString *sub;
1369
+ #if JS_HAS_REPLACE_LAMBDA
1370
+ JSObject *lambda;
1371
+
1372
+ lambda = rdata->lambda;
1373
+ if (lambda) {
1374
+ uintN argc, i, j, m, n, p;
1375
+ jsval *sp, *oldsp, rval;
1376
+ void *mark;
1377
+ JSStackFrame *fp;
1378
+ JSBool ok;
1379
+
1380
+ /*
1381
+ * Save the rightContext from the current regexp, since it
1382
+ * gets stuck at the end of the replacement string and may
1383
+ * be clobbered by a RegExp usage in the lambda function.
1384
+ */
1385
+ JSSubString saveRightContext = cx->regExpStatics.rightContext;
1386
+
1387
+ /*
1388
+ * In the lambda case, not only do we find the replacement string's
1389
+ * length, we compute repstr and return it via rdata for use within
1390
+ * do_replace. The lambda is called with arguments ($&, $1, $2, ...,
1391
+ * index, input), i.e., all the properties of a regexp match array.
1392
+ * For $&, etc., we must create string jsvals from cx->regExpStatics.
1393
+ * We grab up stack space to keep the newborn strings GC-rooted.
1394
+ */
1395
+ p = rdata->base.regexp->parenCount;
1396
+ argc = 1 + p + 2;
1397
+ sp = js_AllocStack(cx, 2 + argc, &mark);
1398
+ if (!sp)
1399
+ return JS_FALSE;
1400
+
1401
+ /* Push lambda and its 'this' parameter. */
1402
+ *sp++ = OBJECT_TO_JSVAL(lambda);
1403
+ *sp++ = OBJECT_TO_JSVAL(OBJ_GET_PARENT(cx, lambda));
1404
+
1405
+ #define PUSH_REGEXP_STATIC(sub) \
1406
+ JS_BEGIN_MACRO \
1407
+ JSString *str = js_NewStringCopyN(cx, \
1408
+ cx->regExpStatics.sub.chars, \
1409
+ cx->regExpStatics.sub.length, \
1410
+ 0); \
1411
+ if (!str) { \
1412
+ ok = JS_FALSE; \
1413
+ goto lambda_out; \
1414
+ } \
1415
+ *sp++ = STRING_TO_JSVAL(str); \
1416
+ JS_END_MACRO
1417
+
1418
+ /* Push $&, $1, $2, ... */
1419
+ PUSH_REGEXP_STATIC(lastMatch);
1420
+ i = 0;
1421
+ m = cx->regExpStatics.parenCount;
1422
+ n = JS_MIN(m, 9);
1423
+ for (j = 0; i < n; i++, j++)
1424
+ PUSH_REGEXP_STATIC(parens[j]);
1425
+ for (j = 0; i < m; i++, j++)
1426
+ PUSH_REGEXP_STATIC(moreParens[j]);
1427
+
1428
+ #undef PUSH_REGEXP_STATIC
1429
+
1430
+ /* Make sure to push undefined for any unmatched parens. */
1431
+ for (; i < p; i++)
1432
+ *sp++ = JSVAL_VOID;
1433
+
1434
+ /* Push match index and input string. */
1435
+ *sp++ = INT_TO_JSVAL((jsint)cx->regExpStatics.leftContext.length);
1436
+ *sp++ = STRING_TO_JSVAL(rdata->base.str);
1437
+
1438
+ /* Lift current frame to include the args and do the call. */
1439
+ fp = cx->fp;
1440
+ oldsp = fp->sp;
1441
+ fp->sp = sp;
1442
+ ok = js_Invoke(cx, argc, JSINVOKE_INTERNAL);
1443
+ rval = fp->sp[-1];
1444
+ fp->sp = oldsp;
1445
+
1446
+ if (ok) {
1447
+ /*
1448
+ * NB: we count on the newborn string root to hold any string
1449
+ * created by this js_ValueToString that would otherwise be GC-
1450
+ * able, until we use rdata->repstr in do_replace.
1451
+ */
1452
+ repstr = js_ValueToString(cx, rval);
1453
+ if (!repstr) {
1454
+ ok = JS_FALSE;
1455
+ } else {
1456
+ rdata->repstr = repstr;
1457
+ *sizep = JSSTRING_LENGTH(repstr);
1458
+ }
1459
+ }
1460
+
1461
+ lambda_out:
1462
+ js_FreeStack(cx, mark);
1463
+ cx->regExpStatics.rightContext = saveRightContext;
1464
+ return ok;
1465
+ }
1466
+ #endif /* JS_HAS_REPLACE_LAMBDA */
1467
+
1468
+ repstr = rdata->repstr;
1469
+ replen = JSSTRING_LENGTH(repstr);
1470
+ for (dp = rdata->dollar, ep = rdata->dollarEnd; dp;
1471
+ dp = js_strchr_limit(dp, '$', ep)) {
1472
+ sub = interpret_dollar(cx, dp, rdata, &skip);
1473
+ if (sub) {
1474
+ replen += sub->length - skip;
1475
+ dp += skip;
1476
+ }
1477
+ else
1478
+ dp++;
1479
+ }
1480
+ *sizep = replen;
1481
+ return JS_TRUE;
1482
+ }
1483
+
1484
+ static void
1485
+ do_replace(JSContext *cx, ReplaceData *rdata, jschar *chars)
1486
+ {
1487
+ JSString *repstr;
1488
+ jschar *bp, *cp, *dp, *ep;
1489
+ size_t len, skip;
1490
+ JSSubString *sub;
1491
+
1492
+ repstr = rdata->repstr;
1493
+ bp = cp = JSSTRING_CHARS(repstr);
1494
+ for (dp = rdata->dollar, ep = rdata->dollarEnd; dp;
1495
+ dp = js_strchr_limit(dp, '$', ep)) {
1496
+ len = dp - cp;
1497
+ js_strncpy(chars, cp, len);
1498
+ chars += len;
1499
+ cp = dp;
1500
+ sub = interpret_dollar(cx, dp, rdata, &skip);
1501
+ if (sub) {
1502
+ len = sub->length;
1503
+ js_strncpy(chars, sub->chars, len);
1504
+ chars += len;
1505
+ cp += skip;
1506
+ dp += skip;
1507
+ } else {
1508
+ dp++;
1509
+ }
1510
+ }
1511
+ js_strncpy(chars, cp, JSSTRING_LENGTH(repstr) - (cp - bp));
1512
+ }
1513
+
1514
+ static JSBool
1515
+ replace_glob(JSContext *cx, jsint count, GlobData *data)
1516
+ {
1517
+ ReplaceData *rdata;
1518
+ JSString *str;
1519
+ size_t leftoff, leftlen, replen, growth;
1520
+ const jschar *left;
1521
+ jschar *chars;
1522
+
1523
+ rdata = (ReplaceData *)data;
1524
+ str = data->str;
1525
+ leftoff = rdata->leftIndex;
1526
+ left = JSSTRING_CHARS(str) + leftoff;
1527
+ leftlen = cx->regExpStatics.lastMatch.chars - left;
1528
+ rdata->leftIndex = cx->regExpStatics.lastMatch.chars - JSSTRING_CHARS(str);
1529
+ rdata->leftIndex += cx->regExpStatics.lastMatch.length;
1530
+ if (!find_replen(cx, rdata, &replen))
1531
+ return JS_FALSE;
1532
+ growth = leftlen + replen;
1533
+ chars = (jschar *)
1534
+ (rdata->chars
1535
+ ? JS_realloc(cx, rdata->chars, (rdata->length + growth + 1)
1536
+ * sizeof(jschar))
1537
+ : JS_malloc(cx, (growth + 1) * sizeof(jschar)));
1538
+ if (!chars) {
1539
+ JS_free(cx, rdata->chars);
1540
+ rdata->chars = NULL;
1541
+ return JS_FALSE;
1542
+ }
1543
+ rdata->chars = chars;
1544
+ rdata->length += growth;
1545
+ chars += rdata->index;
1546
+ rdata->index += growth;
1547
+ js_strncpy(chars, left, leftlen);
1548
+ chars += leftlen;
1549
+ do_replace(cx, rdata, chars);
1550
+ return JS_TRUE;
1551
+ }
1552
+
1553
+ static JSBool
1554
+ str_replace(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1555
+ {
1556
+ JSObject *lambda;
1557
+ JSString *repstr, *str;
1558
+ ReplaceData rdata;
1559
+ JSBool ok;
1560
+ jschar *chars;
1561
+ size_t leftlen, rightlen, length;
1562
+
1563
+ #if JS_HAS_REPLACE_LAMBDA
1564
+ if (JS_TypeOfValue(cx, argv[1]) == JSTYPE_FUNCTION) {
1565
+ lambda = JSVAL_TO_OBJECT(argv[1]);
1566
+ repstr = NULL;
1567
+ } else
1568
+ #endif
1569
+ {
1570
+ if (!JS_ConvertValue(cx, argv[1], JSTYPE_STRING, &argv[1]))
1571
+ return JS_FALSE;
1572
+ repstr = JSVAL_TO_STRING(argv[1]);
1573
+ lambda = NULL;
1574
+ }
1575
+
1576
+ /*
1577
+ * For ECMA Edition 3, the first argument is to be converted to a string
1578
+ * to match in a "flat" sense (without regular expression metachars having
1579
+ * special meanings) UNLESS the first arg is a RegExp object.
1580
+ */
1581
+ rdata.base.flags = MODE_REPLACE | KEEP_REGEXP;
1582
+ if (cx->version == JSVERSION_DEFAULT || cx->version > JSVERSION_1_4)
1583
+ rdata.base.flags |= FORCE_FLAT;
1584
+ rdata.base.optarg = 2;
1585
+
1586
+ rdata.lambda = lambda;
1587
+ rdata.repstr = repstr;
1588
+ if (repstr) {
1589
+ rdata.dollarEnd = JSSTRING_CHARS(repstr) + JSSTRING_LENGTH(repstr);
1590
+ rdata.dollar = js_strchr_limit(JSSTRING_CHARS(repstr), '$',
1591
+ rdata.dollarEnd);
1592
+ } else {
1593
+ rdata.dollar = rdata.dollarEnd = NULL;
1594
+ }
1595
+ rdata.chars = NULL;
1596
+ rdata.length = 0;
1597
+ rdata.index = 0;
1598
+ rdata.leftIndex = 0;
1599
+
1600
+ ok = match_or_replace(cx, obj, argc, argv, replace_glob, &rdata.base, rval);
1601
+ if (!ok)
1602
+ return JS_FALSE;
1603
+
1604
+ if (!rdata.chars) {
1605
+ if ((rdata.base.flags & GLOBAL_REGEXP) || *rval != JSVAL_TRUE) {
1606
+ /* Didn't match even once. */
1607
+ *rval = STRING_TO_JSVAL(rdata.base.str);
1608
+ goto out;
1609
+ }
1610
+ leftlen = cx->regExpStatics.leftContext.length;
1611
+ ok = find_replen(cx, &rdata, &length);
1612
+ if (!ok)
1613
+ goto out;
1614
+ length += leftlen;
1615
+ chars = (jschar *) JS_malloc(cx, (length + 1) * sizeof(jschar));
1616
+ if (!chars) {
1617
+ ok = JS_FALSE;
1618
+ goto out;
1619
+ }
1620
+ js_strncpy(chars, cx->regExpStatics.leftContext.chars, leftlen);
1621
+ do_replace(cx, &rdata, chars + leftlen);
1622
+ rdata.chars = chars;
1623
+ rdata.length = length;
1624
+ }
1625
+
1626
+ rightlen = cx->regExpStatics.rightContext.length;
1627
+ length = rdata.length + rightlen;
1628
+ chars = (jschar *)
1629
+ JS_realloc(cx, rdata.chars, (length + 1) * sizeof(jschar));
1630
+ if (!chars) {
1631
+ JS_free(cx, rdata.chars);
1632
+ ok = JS_FALSE;
1633
+ goto out;
1634
+ }
1635
+ js_strncpy(chars + rdata.length, cx->regExpStatics.rightContext.chars,
1636
+ rightlen);
1637
+ chars[length] = 0;
1638
+
1639
+ str = js_NewString(cx, chars, length, 0);
1640
+ if (!str) {
1641
+ JS_free(cx, chars);
1642
+ ok = JS_FALSE;
1643
+ goto out;
1644
+ }
1645
+ *rval = STRING_TO_JSVAL(str);
1646
+
1647
+ out:
1648
+ /* If KEEP_REGEXP is still set, it's our job to destroy regexp now. */
1649
+ if (rdata.base.flags & KEEP_REGEXP)
1650
+ js_DestroyRegExp(cx, rdata.base.regexp);
1651
+ return ok;
1652
+ }
1653
+ #endif /* JS_HAS_REGEXPS */
1654
+
1655
+ /*
1656
+ * Subroutine used by str_split to find the next split point in str, starting
1657
+ * at offset *ip and looking either for the separator substring given by sep,
1658
+ * or for the next re match. In the re case, return the matched separator in
1659
+ * *sep, and the possibly updated offset in *ip.
1660
+ *
1661
+ * Return -2 on error, -1 on end of string, >= 0 for a valid index of the next
1662
+ * separator occurrence if found, or str->length if no separator is found.
1663
+ */
1664
+ static jsint
1665
+ find_split(JSContext *cx, JSString *str, JSRegExp *re, jsint *ip,
1666
+ JSSubString *sep)
1667
+ {
1668
+ jsint i, j, k;
1669
+ jschar *chars;
1670
+ size_t length;
1671
+
1672
+ /*
1673
+ * Stop if past end of string. If at end of string, we will compare the
1674
+ * null char stored there (by js_NewString*) to sep->chars[j] in the while
1675
+ * loop at the end of this function, so that
1676
+ *
1677
+ * "ab,".split(',') => ["ab", ""]
1678
+ *
1679
+ * and the resulting array converts back to the string "ab," for symmetry.
1680
+ * However, we ape Perl and do this only if there is a sufficiently large
1681
+ * limit argument (see str_split).
1682
+ */
1683
+ i = *ip;
1684
+ if ((size_t)i > JSSTRING_LENGTH(str))
1685
+ return -1;
1686
+
1687
+ /*
1688
+ * Perl4 special case for str.split(' '), only if the user has selected
1689
+ * JavaScript1.2 explicitly. Split on whitespace, and skip leading w/s.
1690
+ * Strange but true, apparently modeled after awk.
1691
+ *
1692
+ * NB: we set sep->length to the length of the w/s run, so we must test
1693
+ * sep->chars[1] == 0 to make sure sep is just one space.
1694
+ */
1695
+ chars = JSSTRING_CHARS(str);
1696
+ length = JSSTRING_LENGTH(str);
1697
+ if (cx->version == JSVERSION_1_2 &&
1698
+ !re && *sep->chars == ' ' && sep->chars[1] == 0) {
1699
+
1700
+ /* Skip leading whitespace if at front of str. */
1701
+ if (i == 0) {
1702
+ while (JS_ISSPACE(chars[i]))
1703
+ i++;
1704
+ *ip = i;
1705
+ }
1706
+
1707
+ /* Don't delimit whitespace at end of string. */
1708
+ if ((size_t)i == length)
1709
+ return -1;
1710
+
1711
+ /* Skip over the non-whitespace chars. */
1712
+ while ((size_t)i < length && !JS_ISSPACE(chars[i]))
1713
+ i++;
1714
+
1715
+ /* Now skip the next run of whitespace. */
1716
+ j = i;
1717
+ while ((size_t)j < length && JS_ISSPACE(chars[j]))
1718
+ j++;
1719
+
1720
+ /* Update sep->length to count delimiter chars. */
1721
+ sep->length = (size_t)(j - i);
1722
+ return i;
1723
+ }
1724
+
1725
+ #if JS_HAS_REGEXPS
1726
+ /*
1727
+ * Match a regular expression against the separator at or above index i.
1728
+ * Call js_ExecuteRegExp with true for the test argument. On successful
1729
+ * match, get the separator from cx->regExpStatics.lastMatch.
1730
+ */
1731
+ if (re) {
1732
+ size_t index;
1733
+ jsval rval;
1734
+
1735
+ again:
1736
+ /* JS1.2 deviated from Perl by never matching at end of string. */
1737
+ index = (size_t)i;
1738
+ if (!js_ExecuteRegExp(cx, re, str, &index, JS_TRUE, &rval))
1739
+ return -2;
1740
+ if (rval != JSVAL_TRUE) {
1741
+ /* Mismatch: ensure our caller advances i past end of string. */
1742
+ sep->length = 1;
1743
+ return length;
1744
+ }
1745
+ i = (jsint)index;
1746
+ *sep = cx->regExpStatics.lastMatch;
1747
+ if (sep->length == 0) {
1748
+ /*
1749
+ * Empty string match: never split on an empty match at the start
1750
+ * of a find_split cycle. Same rule as for an empty global match
1751
+ * in match_or_replace.
1752
+ */
1753
+ if (i == *ip) {
1754
+ /*
1755
+ * "Bump-along" to avoid sticking at an empty match, but don't
1756
+ * bump past end of string -- our caller must do that by adding
1757
+ * sep->length to our return value.
1758
+ */
1759
+ if ((size_t)i == length) {
1760
+ if (cx->version == JSVERSION_1_2) {
1761
+ sep->length = 1;
1762
+ return i;
1763
+ }
1764
+ return -1;
1765
+ }
1766
+ i++;
1767
+ goto again;
1768
+ }
1769
+ }
1770
+ JS_ASSERT((size_t)i >= sep->length);
1771
+ return i - sep->length;
1772
+ }
1773
+ #endif /* JS_HAS_REGEXPS */
1774
+
1775
+ /*
1776
+ * Deviate from ECMA by never splitting an empty string by any separator
1777
+ * string into a non-empty array (an array of length 1 that contains the
1778
+ * empty string).
1779
+ */
1780
+ if (!JSVERSION_IS_ECMA(cx->version) && length == 0)
1781
+ return -1;
1782
+
1783
+ /*
1784
+ * Special case: if sep is the empty string, split str into one character
1785
+ * substrings. Let our caller worry about whether to split once at end of
1786
+ * string into an empty substring.
1787
+ *
1788
+ * For 1.2 compatibility, at the end of the string, we return the length as
1789
+ * the result, and set the separator length to 1 -- this allows the caller
1790
+ * to include an additional null string at the end of the substring list.
1791
+ */
1792
+ if (sep->length == 0) {
1793
+ if (cx->version == JSVERSION_1_2) {
1794
+ if ((size_t)i == length) {
1795
+ sep->length = 1;
1796
+ return i;
1797
+ }
1798
+ return i + 1;
1799
+ }
1800
+ return ((size_t)i == length) ? -1 : i + 1;
1801
+ }
1802
+
1803
+ /*
1804
+ * Now that we know sep is non-empty, search starting at i in str for an
1805
+ * occurrence of all of sep's chars. If we find them, return the index of
1806
+ * the first separator char. Otherwise, return length.
1807
+ */
1808
+ j = 0;
1809
+ while ((size_t)(k = i + j) < length) {
1810
+ if (chars[k] == sep->chars[j]) {
1811
+ if ((size_t)++j == sep->length)
1812
+ return i;
1813
+ } else {
1814
+ i++;
1815
+ j = 0;
1816
+ }
1817
+ }
1818
+ return k;
1819
+ }
1820
+
1821
+ static JSBool
1822
+ str_split(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1823
+ {
1824
+ JSString *str, *sub;
1825
+ JSObject *arrayobj;
1826
+ jsval v;
1827
+ JSBool ok, limited;
1828
+ JSRegExp *re;
1829
+ JSSubString *sep, tmp;
1830
+ jsdouble d;
1831
+ jsint i, j;
1832
+ uint32 len, limit;
1833
+
1834
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
1835
+ if (!str)
1836
+ return JS_FALSE;
1837
+ argv[-1] = STRING_TO_JSVAL(str);
1838
+
1839
+ arrayobj = js_ConstructObject(cx, &js_ArrayClass, NULL, NULL, 0, NULL);
1840
+ if (!arrayobj)
1841
+ return JS_FALSE;
1842
+ *rval = OBJECT_TO_JSVAL(arrayobj);
1843
+
1844
+ if (argc == 0) {
1845
+ v = STRING_TO_JSVAL(str);
1846
+ ok = JS_SetElement(cx, arrayobj, 0, &v);
1847
+ } else {
1848
+ #if JS_HAS_REGEXPS
1849
+ if (JSVAL_IS_REGEXP(cx, argv[0])) {
1850
+ re = (JSRegExp *) JS_GetPrivate(cx, JSVAL_TO_OBJECT(argv[0]));
1851
+ sep = &tmp;
1852
+
1853
+ /* Set a magic value so we can detect a successful re match. */
1854
+ sep->chars = NULL;
1855
+ } else
1856
+ #endif
1857
+ {
1858
+ JSString *str2 = js_ValueToString(cx, argv[0]);
1859
+ if (!str2)
1860
+ return JS_FALSE;
1861
+ argv[0] = STRING_TO_JSVAL(str2);
1862
+
1863
+ /*
1864
+ * Point sep at a local copy of str2's header because find_split
1865
+ * will modify sep->length.
1866
+ */
1867
+ tmp.length = JSSTRING_LENGTH(str2);
1868
+ tmp.chars = JSSTRING_CHARS(str2);
1869
+ sep = &tmp;
1870
+ re = NULL;
1871
+ }
1872
+
1873
+ /* Use the second argument as the split limit, if given. */
1874
+ limited = (argc > 1) && !JSVAL_IS_VOID(argv[1]);
1875
+ limit = 0; /* Avoid warning. */
1876
+ if (limited) {
1877
+ if (!js_ValueToNumber(cx, argv[1], &d))
1878
+ return JS_FALSE;
1879
+
1880
+ /* Clamp limit between 0 and 1 + string length. */
1881
+ if (!js_DoubleToECMAUint32(cx, d, &limit))
1882
+ return JS_FALSE;
1883
+ if (limit > JSSTRING_LENGTH(str))
1884
+ limit = 1 + JSSTRING_LENGTH(str);
1885
+ }
1886
+
1887
+ len = i = 0;
1888
+ while ((j = find_split(cx, str, re, &i, sep)) >= 0) {
1889
+ if (limited && len >= limit)
1890
+ break;
1891
+ sub = js_NewDependentString(cx, str, i, (size_t)(j - i), 0);
1892
+ if (!sub)
1893
+ return JS_FALSE;
1894
+ v = STRING_TO_JSVAL(sub);
1895
+ if (!JS_SetElement(cx, arrayobj, len, &v))
1896
+ return JS_FALSE;
1897
+ len++;
1898
+ #if JS_HAS_REGEXPS
1899
+ /*
1900
+ * Imitate perl's feature of including parenthesized substrings
1901
+ * that matched part of the delimiter in the new array, after the
1902
+ * split substring that was delimited.
1903
+ */
1904
+ if (re && sep->chars) {
1905
+ uintN num;
1906
+ JSSubString *parsub;
1907
+
1908
+ for (num = 0; num < cx->regExpStatics.parenCount; num++) {
1909
+ if (limited && len >= limit)
1910
+ break;
1911
+ parsub = REGEXP_PAREN_SUBSTRING(&cx->regExpStatics, num);
1912
+ sub = js_NewStringCopyN(cx, parsub->chars, parsub->length,
1913
+ 0);
1914
+ if (!sub)
1915
+ return JS_FALSE;
1916
+ v = STRING_TO_JSVAL(sub);
1917
+ if (!JS_SetElement(cx, arrayobj, len, &v))
1918
+ return JS_FALSE;
1919
+ len++;
1920
+ }
1921
+ sep->chars = NULL;
1922
+ }
1923
+ #endif
1924
+ i = j + sep->length;
1925
+ if (!JSVERSION_IS_ECMA(cx->version)) {
1926
+ /*
1927
+ * Deviate from ECMA to imitate Perl, which omits a final
1928
+ * split unless a limit argument is given and big enough.
1929
+ */
1930
+ if (!limited && (size_t)i == JSSTRING_LENGTH(str))
1931
+ break;
1932
+ }
1933
+ }
1934
+ ok = (j != -2);
1935
+ }
1936
+ return ok;
1937
+ }
1938
+
1939
+ #if JS_HAS_PERL_SUBSTR
1940
+ static JSBool
1941
+ str_substr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1942
+ {
1943
+ JSString *str;
1944
+ jsdouble d;
1945
+ jsdouble length, begin, end;
1946
+
1947
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
1948
+ if (!str)
1949
+ return JS_FALSE;
1950
+
1951
+ if (argc != 0) {
1952
+ if (!js_ValueToNumber(cx, argv[0], &d))
1953
+ return JS_FALSE;
1954
+ length = JSSTRING_LENGTH(str);
1955
+ begin = js_DoubleToInteger(d);
1956
+ if (begin < 0) {
1957
+ begin += length;
1958
+ if (begin < 0)
1959
+ begin = 0;
1960
+ } else if (begin > length) {
1961
+ begin = length;
1962
+ }
1963
+
1964
+ if (argc == 1) {
1965
+ end = length;
1966
+ } else {
1967
+ if (!js_ValueToNumber(cx, argv[1], &d))
1968
+ return JS_FALSE;
1969
+ end = js_DoubleToInteger(d);
1970
+ if (end < 0)
1971
+ end = 0;
1972
+ end += begin;
1973
+ if (end > length)
1974
+ end = length;
1975
+ }
1976
+
1977
+ str = js_NewDependentString(cx, str, (size_t)begin,
1978
+ (size_t)(end - begin), 0);
1979
+ if (!str)
1980
+ return JS_FALSE;
1981
+ }
1982
+ *rval = STRING_TO_JSVAL(str);
1983
+ return JS_TRUE;
1984
+ }
1985
+ #endif /* JS_HAS_PERL_SUBSTR */
1986
+
1987
+ #if JS_HAS_SEQUENCE_OPS
1988
+ /*
1989
+ * Python-esque sequence operations.
1990
+ */
1991
+ static JSBool
1992
+ str_concat(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
1993
+ {
1994
+ JSString *str, *str2;
1995
+ uintN i;
1996
+
1997
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
1998
+ if (!str)
1999
+ return JS_FALSE;
2000
+ argv[-1] = STRING_TO_JSVAL(str);
2001
+
2002
+ for (i = 0; i < argc; i++) {
2003
+ str2 = js_ValueToString(cx, argv[i]);
2004
+ if (!str2)
2005
+ return JS_FALSE;
2006
+ argv[i] = STRING_TO_JSVAL(str2);
2007
+
2008
+ str = js_ConcatStrings(cx, str, str2);
2009
+ if (!str)
2010
+ return JS_FALSE;
2011
+ }
2012
+
2013
+ *rval = STRING_TO_JSVAL(str);
2014
+ return JS_TRUE;
2015
+ }
2016
+
2017
+ static JSBool
2018
+ str_slice(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
2019
+ {
2020
+ JSString *str;
2021
+ jsdouble d;
2022
+ jsdouble length, begin, end;
2023
+
2024
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
2025
+ if (!str)
2026
+ return JS_FALSE;
2027
+ argv[-1] = STRING_TO_JSVAL(str);
2028
+
2029
+ if (argc != 0) {
2030
+ if (!js_ValueToNumber(cx, argv[0], &d))
2031
+ return JS_FALSE;
2032
+ length = JSSTRING_LENGTH(str);
2033
+ begin = js_DoubleToInteger(d);
2034
+ if (begin < 0) {
2035
+ begin += length;
2036
+ if (begin < 0)
2037
+ begin = 0;
2038
+ } else if (begin > length) {
2039
+ begin = length;
2040
+ }
2041
+
2042
+ if (argc == 1) {
2043
+ end = length;
2044
+ } else {
2045
+ if (!js_ValueToNumber(cx, argv[1], &d))
2046
+ return JS_FALSE;
2047
+ end = js_DoubleToInteger(d);
2048
+ if (end < 0) {
2049
+ end += length;
2050
+ if (end < 0)
2051
+ end = 0;
2052
+ } else if (end > length) {
2053
+ end = length;
2054
+ }
2055
+ if (end < begin)
2056
+ end = begin;
2057
+ }
2058
+
2059
+ str = js_NewDependentString(cx, str, (size_t)begin,
2060
+ (size_t)(end - begin), 0);
2061
+ if (!str)
2062
+ return JS_FALSE;
2063
+ }
2064
+ *rval = STRING_TO_JSVAL(str);
2065
+ return JS_TRUE;
2066
+ }
2067
+ #endif /* JS_HAS_SEQUENCE_OPS */
2068
+
2069
+ #if JS_HAS_STR_HTML_HELPERS
2070
+ /*
2071
+ * HTML composition aids.
2072
+ */
2073
+ static JSBool
2074
+ tagify(JSContext *cx, JSObject *obj, jsval *argv,
2075
+ const char *begin, const jschar *param, const char *end,
2076
+ jsval *rval)
2077
+ {
2078
+ JSString *str;
2079
+ jschar *tagbuf;
2080
+ size_t beglen, endlen, parlen, taglen;
2081
+ size_t i, j;
2082
+
2083
+ str = js_ValueToString(cx, OBJECT_TO_JSVAL(obj));
2084
+ if (!str)
2085
+ return JS_FALSE;
2086
+ argv[-1] = STRING_TO_JSVAL(str);
2087
+
2088
+ if (!end)
2089
+ end = begin;
2090
+
2091
+ beglen = strlen(begin);
2092
+ taglen = 1 + beglen + 1; /* '<begin' + '>' */
2093
+ parlen = 0; /* Avoid warning. */
2094
+ if (param) {
2095
+ parlen = js_strlen(param);
2096
+ taglen += 2 + parlen + 1; /* '="param"' */
2097
+ }
2098
+ endlen = strlen(end);
2099
+ taglen += JSSTRING_LENGTH(str) + 2 + endlen + 1; /* 'str</end>' */
2100
+
2101
+ tagbuf = (jschar *) JS_malloc(cx, (taglen + 1) * sizeof(jschar));
2102
+ if (!tagbuf)
2103
+ return JS_FALSE;
2104
+
2105
+ j = 0;
2106
+ tagbuf[j++] = '<';
2107
+ for (i = 0; i < beglen; i++)
2108
+ tagbuf[j++] = (jschar)begin[i];
2109
+ if (param) {
2110
+ tagbuf[j++] = '=';
2111
+ tagbuf[j++] = '"';
2112
+ js_strncpy(&tagbuf[j], param, parlen);
2113
+ j += parlen;
2114
+ tagbuf[j++] = '"';
2115
+ }
2116
+ tagbuf[j++] = '>';
2117
+ js_strncpy(&tagbuf[j], JSSTRING_CHARS(str), JSSTRING_LENGTH(str));
2118
+ j += JSSTRING_LENGTH(str);
2119
+ tagbuf[j++] = '<';
2120
+ tagbuf[j++] = '/';
2121
+ for (i = 0; i < endlen; i++)
2122
+ tagbuf[j++] = (jschar)end[i];
2123
+ tagbuf[j++] = '>';
2124
+ JS_ASSERT(j == taglen);
2125
+ tagbuf[j] = 0;
2126
+
2127
+ str = js_NewString(cx, tagbuf, taglen, 0);
2128
+ if (!str) {
2129
+ free((char *)tagbuf);
2130
+ return JS_FALSE;
2131
+ }
2132
+ *rval = STRING_TO_JSVAL(str);
2133
+ return JS_TRUE;
2134
+ }
2135
+
2136
+ static JSBool
2137
+ tagify_value(JSContext *cx, JSObject *obj, jsval *argv,
2138
+ const char *begin, const char *end,
2139
+ jsval *rval)
2140
+ {
2141
+ JSString *param;
2142
+
2143
+ param = js_ValueToString(cx, argv[0]);
2144
+ if (!param)
2145
+ return JS_FALSE;
2146
+ argv[0] = STRING_TO_JSVAL(param);
2147
+ return tagify(cx, obj, argv, begin, JSSTRING_CHARS(param), end, rval);
2148
+ }
2149
+
2150
+ static JSBool
2151
+ str_bold(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
2152
+ {
2153
+ return tagify(cx, obj, argv, "b", NULL, NULL, rval);
2154
+ }
2155
+
2156
+ static JSBool
2157
+ str_italics(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
2158
+ {
2159
+ return tagify(cx, obj, argv, "i", NULL, NULL, rval);
2160
+ }
2161
+
2162
+ static JSBool
2163
+ str_fixed(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
2164
+ {
2165
+ return tagify(cx, obj, argv, "tt", NULL, NULL, rval);
2166
+ }
2167
+
2168
+ static JSBool
2169
+ str_fontsize(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
2170
+ {
2171
+ return tagify_value(cx, obj, argv, "font size", "font", rval);
2172
+ }
2173
+
2174
+ static JSBool
2175
+ str_fontcolor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
2176
+ jsval *rval)
2177
+ {
2178
+ return tagify_value(cx, obj, argv, "font color", "font", rval);
2179
+ }
2180
+
2181
+ static JSBool
2182
+ str_link(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
2183
+ {
2184
+ return tagify_value(cx, obj, argv, "a href", "a", rval);
2185
+ }
2186
+
2187
+ static JSBool
2188
+ str_anchor(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
2189
+ {
2190
+ return tagify_value(cx, obj, argv, "a name", "a", rval);
2191
+ }
2192
+
2193
+ static JSBool
2194
+ str_strike(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
2195
+ {
2196
+ return tagify(cx, obj, argv, "strike", NULL, NULL, rval);
2197
+ }
2198
+
2199
+ static JSBool
2200
+ str_small(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
2201
+ {
2202
+ return tagify(cx, obj, argv, "small", NULL, NULL, rval);
2203
+ }
2204
+
2205
+ static JSBool
2206
+ str_big(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
2207
+ {
2208
+ return tagify(cx, obj, argv, "big", NULL, NULL, rval);
2209
+ }
2210
+
2211
+ static JSBool
2212
+ str_blink(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
2213
+ {
2214
+ return tagify(cx, obj, argv, "blink", NULL, NULL, rval);
2215
+ }
2216
+
2217
+ static JSBool
2218
+ str_sup(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
2219
+ {
2220
+ return tagify(cx, obj, argv, "sup", NULL, NULL, rval);
2221
+ }
2222
+
2223
+ static JSBool
2224
+ str_sub(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
2225
+ {
2226
+ return tagify(cx, obj, argv, "sub", NULL, NULL, rval);
2227
+ }
2228
+ #endif /* JS_HAS_STR_HTML_HELPERS */
2229
+
2230
+ static JSFunctionSpec string_methods[] = {
2231
+ #if JS_HAS_TOSOURCE
2232
+ {"quote", str_quote, 0,0,0},
2233
+ {js_toSource_str, str_toSource, 0,0,0},
2234
+ #endif
2235
+
2236
+ /* Java-like methods. */
2237
+ {js_toString_str, str_toString, 0,0,0},
2238
+ {js_valueOf_str, str_valueOf, 0,0,0},
2239
+ {"substring", str_substring, 2,0,0},
2240
+ {"toLowerCase", str_toLowerCase, 0,0,0},
2241
+ {"toUpperCase", str_toUpperCase, 0,0,0},
2242
+ {"charAt", str_charAt, 1,0,0},
2243
+ {"charCodeAt", str_charCodeAt, 1,0,0},
2244
+ {"indexOf", str_indexOf, 1,0,0},
2245
+ {"lastIndexOf", str_lastIndexOf, 1,0,0},
2246
+ {"toLocaleLowerCase", str_toLocaleLowerCase, 0,0,0},
2247
+ {"toLocaleUpperCase", str_toLocaleUpperCase, 0,0,0},
2248
+ {"localeCompare", str_localeCompare, 1,0,0},
2249
+
2250
+ /* Perl-ish methods (search is actually Python-esque). */
2251
+ #if JS_HAS_REGEXPS
2252
+ {"match", str_match, 1,0,2},
2253
+ {"search", str_search, 1,0,0},
2254
+ {"replace", str_replace, 2,0,0},
2255
+ {"split", str_split, 2,0,0},
2256
+ #endif
2257
+ #if JS_HAS_PERL_SUBSTR
2258
+ {"substr", str_substr, 2,0,0},
2259
+ #endif
2260
+
2261
+ /* Python-esque sequence methods. */
2262
+ #if JS_HAS_SEQUENCE_OPS
2263
+ {"concat", str_concat, 0,0,0},
2264
+ {"slice", str_slice, 0,0,0},
2265
+ #endif
2266
+
2267
+ /* HTML string methods. */
2268
+ #if JS_HAS_STR_HTML_HELPERS
2269
+ {"bold", str_bold, 0,0,0},
2270
+ {"italics", str_italics, 0,0,0},
2271
+ {"fixed", str_fixed, 0,0,0},
2272
+ {"fontsize", str_fontsize, 1,0,0},
2273
+ {"fontcolor", str_fontcolor, 1,0,0},
2274
+ {"link", str_link, 1,0,0},
2275
+ {"anchor", str_anchor, 1,0,0},
2276
+ {"strike", str_strike, 0,0,0},
2277
+ {"small", str_small, 0,0,0},
2278
+ {"big", str_big, 0,0,0},
2279
+ {"blink", str_blink, 0,0,0},
2280
+ {"sup", str_sup, 0,0,0},
2281
+ {"sub", str_sub, 0,0,0},
2282
+ #endif
2283
+
2284
+ {0,0,0,0,0}
2285
+ };
2286
+
2287
+ static JSBool
2288
+ String(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
2289
+ {
2290
+ JSString *str;
2291
+
2292
+ if (argc > 0) {
2293
+ str = js_ValueToString(cx, argv[0]);
2294
+ if (!str)
2295
+ return JS_FALSE;
2296
+ } else {
2297
+ str = cx->runtime->emptyString;
2298
+ }
2299
+ if (!(cx->fp->flags & JSFRAME_CONSTRUCTING)) {
2300
+ *rval = STRING_TO_JSVAL(str);
2301
+ return JS_TRUE;
2302
+ }
2303
+ OBJ_SET_SLOT(cx, obj, JSSLOT_PRIVATE, STRING_TO_JSVAL(str));
2304
+ return JS_TRUE;
2305
+ }
2306
+
2307
+ static JSBool
2308
+ str_fromCharCode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
2309
+ jsval *rval)
2310
+ {
2311
+ jschar *chars;
2312
+ uintN i;
2313
+ uint16 code;
2314
+ JSString *str;
2315
+
2316
+ chars = (jschar *) JS_malloc(cx, (argc + 1) * sizeof(jschar));
2317
+ if (!chars)
2318
+ return JS_FALSE;
2319
+ for (i = 0; i < argc; i++) {
2320
+ if (!js_ValueToUint16(cx, argv[i], &code)) {
2321
+ JS_free(cx, chars);
2322
+ return JS_FALSE;
2323
+ }
2324
+ chars[i] = (jschar)code;
2325
+ }
2326
+ chars[i] = 0;
2327
+ str = js_NewString(cx, chars, argc, 0);
2328
+ if (!str) {
2329
+ JS_free(cx, chars);
2330
+ return JS_FALSE;
2331
+ }
2332
+ *rval = STRING_TO_JSVAL(str);
2333
+ return JS_TRUE;
2334
+ }
2335
+
2336
+ static JSFunctionSpec string_static_methods[] = {
2337
+ {"fromCharCode", str_fromCharCode, 1,0,0},
2338
+ {0,0,0,0,0}
2339
+ };
2340
+
2341
+ static JSHashTable *deflated_string_cache;
2342
+ #ifdef DEBUG
2343
+ static uint32 deflated_string_cache_bytes;
2344
+ #endif
2345
+ #ifdef JS_THREADSAFE
2346
+ static JSLock *deflated_string_cache_lock;
2347
+ #endif
2348
+
2349
+ JSBool
2350
+ js_InitStringGlobals(void)
2351
+ {
2352
+ #ifdef JS_THREADSAFE
2353
+ /* Must come through here once in primordial thread to init safely! */
2354
+ if (!deflated_string_cache_lock) {
2355
+ deflated_string_cache_lock = JS_NEW_LOCK();
2356
+ if (!deflated_string_cache_lock)
2357
+ return JS_FALSE;
2358
+ }
2359
+ #endif
2360
+ return JS_TRUE;
2361
+ }
2362
+
2363
+ void
2364
+ js_FreeStringGlobals()
2365
+ {
2366
+ if (deflated_string_cache) {
2367
+ JS_HashTableDestroy(deflated_string_cache);
2368
+ deflated_string_cache = NULL;
2369
+ }
2370
+ #ifdef JS_THREADSAFE
2371
+ if (deflated_string_cache_lock) {
2372
+ JS_DESTROY_LOCK(deflated_string_cache_lock);
2373
+ deflated_string_cache_lock = NULL;
2374
+ }
2375
+ #endif
2376
+ }
2377
+
2378
+ JSBool
2379
+ js_InitRuntimeStringState(JSContext *cx)
2380
+ {
2381
+ JSRuntime *rt;
2382
+ JSString *empty;
2383
+
2384
+ rt = cx->runtime;
2385
+ JS_ASSERT(!rt->emptyString);
2386
+
2387
+ /* Make a permanently locked empty string. */
2388
+ empty = js_NewStringCopyN(cx, js_empty_ucstr, 0, GCF_LOCK);
2389
+ if (!empty)
2390
+ return JS_FALSE;
2391
+
2392
+ /* Atomize it for scripts that use '' + x to convert x to string. */
2393
+ if (!js_AtomizeString(cx, empty, ATOM_PINNED))
2394
+ return JS_FALSE;
2395
+
2396
+ rt->emptyString = empty;
2397
+ return JS_TRUE;
2398
+ }
2399
+
2400
+ void
2401
+ js_FinishRuntimeStringState(JSContext *cx)
2402
+ {
2403
+ JSRuntime *rt = cx->runtime;
2404
+
2405
+ js_UnlockGCThingRT(rt, rt->emptyString);
2406
+ rt->emptyString = NULL;
2407
+ }
2408
+
2409
+ JSObject *
2410
+ js_InitStringClass(JSContext *cx, JSObject *obj)
2411
+ {
2412
+ JSObject *proto;
2413
+
2414
+ /* Define the escape, unescape functions in the global object. */
2415
+ if (!JS_DefineFunctions(cx, obj, string_functions))
2416
+ return NULL;
2417
+
2418
+ proto = JS_InitClass(cx, obj, NULL, &string_class, String, 1,
2419
+ string_props, string_methods,
2420
+ NULL, string_static_methods);
2421
+ if (!proto)
2422
+ return NULL;
2423
+ OBJ_SET_SLOT(cx, proto, JSSLOT_PRIVATE,
2424
+ STRING_TO_JSVAL(cx->runtime->emptyString));
2425
+ return proto;
2426
+ }
2427
+
2428
+ JSString *
2429
+ js_NewString(JSContext *cx, jschar *chars, size_t length, uintN gcflag)
2430
+ {
2431
+ JSString *str;
2432
+
2433
+ if (length > JSSTRING_LENGTH_MASK) {
2434
+ JS_ReportOutOfMemory(cx);
2435
+ return NULL;
2436
+ }
2437
+
2438
+ str = (JSString *) js_AllocGCThing(cx, gcflag | GCX_STRING);
2439
+ if (!str)
2440
+ return NULL;
2441
+ str->length = length;
2442
+ str->chars = chars;
2443
+ #ifdef DEBUG
2444
+ {
2445
+ JSRuntime *rt = cx->runtime;
2446
+ JS_RUNTIME_METER(rt, liveStrings);
2447
+ JS_RUNTIME_METER(rt, totalStrings);
2448
+ JS_LOCK_RUNTIME_VOID(rt,
2449
+ (rt->lengthSum += (double)length,
2450
+ rt->lengthSquaredSum += (double)length * (double)length));
2451
+ }
2452
+ #endif
2453
+ return str;
2454
+ }
2455
+
2456
+ JSString *
2457
+ js_NewDependentString(JSContext *cx, JSString *base, size_t start,
2458
+ size_t length, uintN gcflag)
2459
+ {
2460
+ JSDependentString *ds;
2461
+
2462
+ if (length == 0)
2463
+ return cx->runtime->emptyString;
2464
+
2465
+ if (start > JSSTRDEP_START_MASK ||
2466
+ (start != 0 && length > JSSTRDEP_LENGTH_MASK)) {
2467
+ return js_NewStringCopyN(cx, JSSTRING_CHARS(base) + start, length,
2468
+ gcflag);
2469
+ }
2470
+
2471
+ ds = (JSDependentString *) js_AllocGCThing(cx, gcflag | GCX_MUTABLE_STRING);
2472
+ if (!ds)
2473
+ return NULL;
2474
+ if (start == 0) {
2475
+ JSPREFIX_SET_LENGTH(ds, length);
2476
+ JSPREFIX_SET_BASE(ds, base);
2477
+ } else {
2478
+ JSSTRDEP_SET_START_AND_LENGTH(ds, start, length);
2479
+ JSSTRDEP_SET_BASE(ds, base);
2480
+ }
2481
+ #ifdef DEBUG
2482
+ {
2483
+ JSRuntime *rt = cx->runtime;
2484
+ JS_RUNTIME_METER(rt, liveDependentStrings);
2485
+ JS_RUNTIME_METER(rt, totalDependentStrings);
2486
+ JS_RUNTIME_METER(rt, liveStrings);
2487
+ JS_RUNTIME_METER(rt, totalStrings);
2488
+ JS_LOCK_RUNTIME_VOID(rt,
2489
+ (rt->strdepLengthSum += (double)length,
2490
+ rt->strdepLengthSquaredSum += (double)length * (double)length));
2491
+ JS_LOCK_RUNTIME_VOID(rt,
2492
+ (rt->lengthSum += (double)length,
2493
+ rt->lengthSquaredSum += (double)length * (double)length));
2494
+ }
2495
+ #endif
2496
+ return (JSString *)ds;
2497
+ }
2498
+
2499
+ #ifdef DEBUG
2500
+ #include <math.h>
2501
+
2502
+ void printJSStringStats(JSRuntime *rt) {
2503
+ double mean = 0., var = 0., sigma = 0.;
2504
+ jsrefcount count = rt->totalStrings;
2505
+ if (count > 0 && rt->lengthSum >= 0) {
2506
+ mean = rt->lengthSum / count;
2507
+ var = count * rt->lengthSquaredSum - rt->lengthSum * rt->lengthSum;
2508
+ if (var < 0.0 || count <= 1)
2509
+ var = 0.0;
2510
+ else
2511
+ var /= count * (count - 1);
2512
+
2513
+ /* Windows says sqrt(0.0) is "-1.#J" (?!) so we must test. */
2514
+ sigma = (var != 0.) ? sqrt(var) : 0.;
2515
+ }
2516
+ fprintf(stderr, "%lu total strings, mean length %g (sigma %g)\n",
2517
+ (unsigned long)count, mean, sigma);
2518
+
2519
+ mean = var = sigma = 0.;
2520
+ count = rt->totalDependentStrings;
2521
+ if (count > 0 && rt->strdepLengthSum >= 0) {
2522
+ mean = rt->strdepLengthSum / count;
2523
+ var = count * rt->strdepLengthSquaredSum
2524
+ - rt->strdepLengthSum * rt->strdepLengthSum;
2525
+ if (var < 0.0 || count <= 1)
2526
+ var = 0.0;
2527
+ else
2528
+ var /= count * (count - 1);
2529
+
2530
+ /* Windows says sqrt(0.0) is "-1.#J" (?!) so we must test. */
2531
+ sigma = (var != 0.) ? sqrt(var) : 0.;
2532
+ }
2533
+ fprintf(stderr, "%lu total dependent strings, mean length %g (sigma %g)\n",
2534
+ (unsigned long)count, mean, sigma);
2535
+ }
2536
+ #endif
2537
+
2538
+ JSString *
2539
+ js_NewStringCopyN(JSContext *cx, const jschar *s, size_t n, uintN gcflag)
2540
+ {
2541
+ jschar *news;
2542
+ JSString *str;
2543
+
2544
+ news = (jschar *)JS_malloc(cx, (n + 1) * sizeof(jschar));
2545
+ if (!news)
2546
+ return NULL;
2547
+ js_strncpy(news, s, n);
2548
+ news[n] = 0;
2549
+ str = js_NewString(cx, news, n, gcflag);
2550
+ if (!str)
2551
+ JS_free(cx, news);
2552
+ return str;
2553
+ }
2554
+
2555
+ JSString *
2556
+ js_NewStringCopyZ(JSContext *cx, const jschar *s, uintN gcflag)
2557
+ {
2558
+ size_t n, m;
2559
+ jschar *news;
2560
+ JSString *str;
2561
+
2562
+ n = js_strlen(s);
2563
+ m = (n + 1) * sizeof(jschar);
2564
+ news = (jschar *) JS_malloc(cx, m);
2565
+ if (!news)
2566
+ return NULL;
2567
+ memcpy(news, s, m);
2568
+ str = js_NewString(cx, news, n, gcflag);
2569
+ if (!str)
2570
+ JS_free(cx, news);
2571
+ return str;
2572
+ }
2573
+
2574
+ JS_STATIC_DLL_CALLBACK(JSHashNumber)
2575
+ js_hash_string_pointer(const void *key)
2576
+ {
2577
+ return (JSHashNumber)key >> JSVAL_TAGBITS;
2578
+ }
2579
+
2580
+ void
2581
+ js_PurgeDeflatedStringCache(JSString *str)
2582
+ {
2583
+ JSHashNumber hash;
2584
+ JSHashEntry *he, **hep;
2585
+
2586
+ if (!deflated_string_cache)
2587
+ return;
2588
+
2589
+ hash = js_hash_string_pointer(str);
2590
+ JS_ACQUIRE_LOCK(deflated_string_cache_lock);
2591
+ hep = JS_HashTableRawLookup(deflated_string_cache, hash, str);
2592
+ he = *hep;
2593
+ if (he) {
2594
+ #ifdef DEBUG
2595
+ deflated_string_cache_bytes -= JSSTRING_LENGTH(str);
2596
+ #endif
2597
+ free(he->value);
2598
+ JS_HashTableRawRemove(deflated_string_cache, hep, he);
2599
+ }
2600
+ JS_RELEASE_LOCK(deflated_string_cache_lock);
2601
+ }
2602
+
2603
+ void
2604
+ js_FinalizeString(JSContext *cx, JSString *str)
2605
+ {
2606
+ js_FinalizeStringRT(cx->runtime, str);
2607
+ }
2608
+
2609
+ void
2610
+ js_FinalizeStringRT(JSRuntime *rt, JSString *str)
2611
+ {
2612
+ JSBool valid;
2613
+
2614
+ JS_RUNTIME_UNMETER(rt, liveStrings);
2615
+ if (JSSTRING_IS_DEPENDENT(str)) {
2616
+ /* If JSSTRFLAG_DEPENDENT is set, this string must be valid. */
2617
+ JS_ASSERT(JSSTRDEP_BASE(str));
2618
+ JS_RUNTIME_UNMETER(rt, liveDependentStrings);
2619
+ valid = JS_TRUE;
2620
+ } else {
2621
+ /* A stillborn string has null chars, so is not valid. */
2622
+ valid = (str->chars != NULL);
2623
+ if (valid)
2624
+ free(str->chars);
2625
+ }
2626
+ if (valid) {
2627
+ js_PurgeDeflatedStringCache(str);
2628
+ str->chars = NULL;
2629
+ }
2630
+ str->length = 0;
2631
+ }
2632
+
2633
+ JSObject *
2634
+ js_StringToObject(JSContext *cx, JSString *str)
2635
+ {
2636
+ JSObject *obj;
2637
+
2638
+ obj = js_NewObject(cx, &string_class, NULL, NULL);
2639
+ if (!obj)
2640
+ return NULL;
2641
+ OBJ_SET_SLOT(cx, obj, JSSLOT_PRIVATE, STRING_TO_JSVAL(str));
2642
+ return obj;
2643
+ }
2644
+
2645
+ JSString *
2646
+ js_ValueToString(JSContext *cx, jsval v)
2647
+ {
2648
+ JSObject *obj;
2649
+ JSString *str;
2650
+
2651
+ if (JSVAL_IS_OBJECT(v)) {
2652
+ obj = JSVAL_TO_OBJECT(v);
2653
+ if (!obj)
2654
+ return ATOM_TO_STRING(cx->runtime->atomState.nullAtom);
2655
+ if (!OBJ_DEFAULT_VALUE(cx, obj, JSTYPE_STRING, &v))
2656
+ return NULL;
2657
+ }
2658
+ if (JSVAL_IS_STRING(v)) {
2659
+ str = JSVAL_TO_STRING(v);
2660
+ } else if (JSVAL_IS_INT(v)) {
2661
+ str = js_NumberToString(cx, JSVAL_TO_INT(v));
2662
+ } else if (JSVAL_IS_DOUBLE(v)) {
2663
+ str = js_NumberToString(cx, *JSVAL_TO_DOUBLE(v));
2664
+ } else if (JSVAL_IS_BOOLEAN(v)) {
2665
+ str = js_BooleanToString(cx, JSVAL_TO_BOOLEAN(v));
2666
+ } else {
2667
+ str = ATOM_TO_STRING(cx->runtime->atomState.typeAtoms[JSTYPE_VOID]);
2668
+ }
2669
+ return str;
2670
+ }
2671
+
2672
+ JSString *
2673
+ js_ValueToSource(JSContext *cx, jsval v)
2674
+ {
2675
+ if (JSVAL_IS_STRING(v))
2676
+ return js_QuoteString(cx, JSVAL_TO_STRING(v), '"');
2677
+ if (JSVAL_IS_PRIMITIVE(v)) {
2678
+ /* Special case to preserve negative zero, _contra_ toString. */
2679
+ if (JSVAL_IS_DOUBLE(v) && JSDOUBLE_IS_NEGZERO(*JSVAL_TO_DOUBLE(v))) {
2680
+ /* NB: _ucNstr rather than _ucstr to indicate non-terminated. */
2681
+ static const jschar js_negzero_ucNstr[] = {'-', '0'};
2682
+
2683
+ return js_NewStringCopyN(cx, js_negzero_ucNstr, 2, 0);
2684
+ }
2685
+ } else {
2686
+ if (!js_TryMethod(cx, JSVAL_TO_OBJECT(v),
2687
+ cx->runtime->atomState.toSourceAtom,
2688
+ 0, NULL, &v)) {
2689
+ return NULL;
2690
+ }
2691
+ }
2692
+ return js_ValueToString(cx, v);
2693
+ }
2694
+
2695
+ JSHashNumber
2696
+ js_HashString(JSString *str)
2697
+ {
2698
+ JSHashNumber h;
2699
+ const jschar *s;
2700
+ size_t n;
2701
+
2702
+ h = 0;
2703
+ for (s = JSSTRING_CHARS(str), n = JSSTRING_LENGTH(str); n; s++, n--)
2704
+ h = (h >> (JS_HASH_BITS - 4)) ^ (h << 4) ^ *s;
2705
+ return h;
2706
+ }
2707
+
2708
+ intN
2709
+ js_CompareStrings(JSString *str1, JSString *str2)
2710
+ {
2711
+ size_t l1, l2, n, i;
2712
+ const jschar *s1, *s2;
2713
+ intN cmp;
2714
+
2715
+ l1 = JSSTRING_LENGTH(str1), l2 = JSSTRING_LENGTH(str2);
2716
+ s1 = JSSTRING_CHARS(str1), s2 = JSSTRING_CHARS(str2);
2717
+ n = JS_MIN(l1, l2);
2718
+ for (i = 0; i < n; i++) {
2719
+ cmp = s1[i] - s2[i];
2720
+ if (cmp != 0)
2721
+ return cmp;
2722
+ }
2723
+ return (intN)(l1 - l2);
2724
+ }
2725
+
2726
+ size_t
2727
+ js_strlen(const jschar *s)
2728
+ {
2729
+ const jschar *t;
2730
+
2731
+ for (t = s; *t != 0; t++)
2732
+ continue;
2733
+ return (size_t)(t - s);
2734
+ }
2735
+
2736
+ jschar *
2737
+ js_strchr(const jschar *s, jschar c)
2738
+ {
2739
+ while (*s != 0) {
2740
+ if (*s == c)
2741
+ return (jschar *)s;
2742
+ s++;
2743
+ }
2744
+ return NULL;
2745
+ }
2746
+
2747
+ jschar *
2748
+ js_strchr_limit(const jschar *s, jschar c, const jschar *limit)
2749
+ {
2750
+ while (s < limit) {
2751
+ if (*s == c)
2752
+ return (jschar *)s;
2753
+ s++;
2754
+ }
2755
+ return NULL;
2756
+ }
2757
+
2758
+ const jschar *
2759
+ js_SkipWhiteSpace(const jschar *s)
2760
+ {
2761
+ /* JS_ISSPACE is false on a null. */
2762
+ while (JS_ISSPACE(*s))
2763
+ s++;
2764
+ return s;
2765
+ }
2766
+
2767
+ #define INFLATE_STRING_BODY \
2768
+ for (i = 0; i < length; i++) \
2769
+ chars[i] = (unsigned char) bytes[i]; \
2770
+ chars[i] = 0;
2771
+
2772
+ void
2773
+ js_InflateStringToBuffer(jschar *chars, const char *bytes, size_t length)
2774
+ {
2775
+ size_t i;
2776
+
2777
+ INFLATE_STRING_BODY
2778
+ }
2779
+
2780
+ jschar *
2781
+ js_InflateString(JSContext *cx, const char *bytes, size_t length)
2782
+ {
2783
+ jschar *chars;
2784
+ size_t i;
2785
+
2786
+ chars = (jschar *) JS_malloc(cx, (length + 1) * sizeof(jschar));
2787
+ if (!chars)
2788
+ return NULL;
2789
+
2790
+ INFLATE_STRING_BODY
2791
+
2792
+ return chars;
2793
+ }
2794
+
2795
+ /*
2796
+ * May be called with null cx by js_GetStringBytes, see below.
2797
+ */
2798
+ char *
2799
+ js_DeflateString(JSContext *cx, const jschar *chars, size_t length)
2800
+ {
2801
+ size_t i, size;
2802
+ char *bytes;
2803
+
2804
+ size = (length + 1) * sizeof(char);
2805
+ bytes = (char *) (cx ? JS_malloc(cx, size) : malloc(size));
2806
+ if (!bytes)
2807
+ return NULL;
2808
+ for (i = 0; i < length; i++)
2809
+ bytes[i] = (char) chars[i];
2810
+ bytes[i] = 0;
2811
+ return bytes;
2812
+ }
2813
+
2814
+ static JSHashTable *
2815
+ GetDeflatedStringCache(void)
2816
+ {
2817
+ JSHashTable *cache;
2818
+
2819
+ cache = deflated_string_cache;
2820
+ if (!cache) {
2821
+ cache = JS_NewHashTable(8, js_hash_string_pointer,
2822
+ JS_CompareValues, JS_CompareValues,
2823
+ NULL, NULL);
2824
+ deflated_string_cache = cache;
2825
+ }
2826
+ return cache;
2827
+ }
2828
+
2829
+ JSBool
2830
+ js_SetStringBytes(JSString *str, char *bytes, size_t length)
2831
+ {
2832
+ JSHashTable *cache;
2833
+ JSBool ok;
2834
+ JSHashNumber hash;
2835
+ JSHashEntry **hep;
2836
+
2837
+ JS_ACQUIRE_LOCK(deflated_string_cache_lock);
2838
+
2839
+ cache = GetDeflatedStringCache();
2840
+ if (!cache) {
2841
+ ok = JS_FALSE;
2842
+ } else {
2843
+ hash = js_hash_string_pointer(str);
2844
+ hep = JS_HashTableRawLookup(cache, hash, str);
2845
+ JS_ASSERT(*hep == NULL);
2846
+ ok = JS_HashTableRawAdd(cache, hep, hash, str, bytes) != NULL;
2847
+ #ifdef DEBUG
2848
+ if (ok)
2849
+ deflated_string_cache_bytes += length;
2850
+ #endif
2851
+ }
2852
+
2853
+ JS_RELEASE_LOCK(deflated_string_cache_lock);
2854
+ return ok;
2855
+ }
2856
+
2857
+ char *
2858
+ js_GetStringBytes(JSString *str)
2859
+ {
2860
+ JSHashTable *cache;
2861
+ char *bytes;
2862
+ JSHashNumber hash;
2863
+ JSHashEntry *he, **hep;
2864
+
2865
+ JS_ACQUIRE_LOCK(deflated_string_cache_lock);
2866
+
2867
+ cache = GetDeflatedStringCache();
2868
+ if (!cache) {
2869
+ bytes = NULL;
2870
+ } else {
2871
+ hash = js_hash_string_pointer(str);
2872
+ hep = JS_HashTableRawLookup(cache, hash, str);
2873
+ he = *hep;
2874
+ if (he) {
2875
+ bytes = (char *) he->value;
2876
+
2877
+ /* Try to catch failure to JS_ShutDown between runtime epochs. */
2878
+ JS_ASSERT((*bytes == '\0' && JSSTRING_LENGTH(str) == 0) ||
2879
+ *bytes == (char) JSSTRING_CHARS(str)[0]);
2880
+ } else {
2881
+ bytes = js_DeflateString(NULL, JSSTRING_CHARS(str),
2882
+ JSSTRING_LENGTH(str));
2883
+ if (bytes) {
2884
+ if (JS_HashTableRawAdd(cache, hep, hash, str, bytes)) {
2885
+ #ifdef DEBUG
2886
+ deflated_string_cache_bytes += JSSTRING_LENGTH(str);
2887
+ #endif
2888
+ } else {
2889
+ free(bytes);
2890
+ bytes = NULL;
2891
+ }
2892
+ }
2893
+ }
2894
+ }
2895
+
2896
+ JS_RELEASE_LOCK(deflated_string_cache_lock);
2897
+ return bytes;
2898
+ }
2899
+
2900
+ /*
2901
+ * From java.lang.Character.java:
2902
+ *
2903
+ * The character properties are currently encoded into 32 bits in the
2904
+ * following manner:
2905
+ *
2906
+ * 10 bits signed offset used for converting case
2907
+ * 1 bit if 1, adding the signed offset converts the character to
2908
+ * lowercase
2909
+ * 1 bit if 1, subtracting the signed offset converts the character to
2910
+ * uppercase
2911
+ * 1 bit if 1, character has a titlecase equivalent (possibly itself)
2912
+ * 3 bits 0 may not be part of an identifier
2913
+ * 1 ignorable control; may continue a Unicode identifier or JS
2914
+ * identifier
2915
+ * 2 may continue a JS identifier but not a Unicode identifier
2916
+ * (unused)
2917
+ * 3 may continue a Unicode identifier or JS identifier
2918
+ * 4 is a JS whitespace character
2919
+ * 5 may start or continue a JS identifier;
2920
+ * may continue but not start a Unicode identifier (_)
2921
+ * 6 may start or continue a JS identifier but not a Unicode
2922
+ * identifier ($)
2923
+ * 7 may start or continue a Unicode identifier or JS identifier
2924
+ * Thus:
2925
+ * 5, 6, 7 may start a JS identifier
2926
+ * 1, 2, 3, 5, 6, 7 may continue a JS identifier
2927
+ * 7 may start a Unicode identifier
2928
+ * 1, 3, 5, 7 may continue a Unicode identifier
2929
+ * 1 is ignorable within an identifier
2930
+ * 4 is JS whitespace
2931
+ * 2 bits 0 this character has no numeric property
2932
+ * 1 adding the digit offset to the character code and then
2933
+ * masking with 0x1F will produce the desired numeric value
2934
+ * 2 this character has a "strange" numeric value
2935
+ * 3 a JS supradecimal digit: adding the digit offset to the
2936
+ * character code, then masking with 0x1F, then adding 10
2937
+ * will produce the desired numeric value
2938
+ * 5 bits digit offset
2939
+ * 4 bits reserved for future use
2940
+ * 5 bits character type
2941
+ */
2942
+
2943
+ /* The X table has 1024 entries for a total of 1024 bytes. */
2944
+
2945
+ const uint8 js_X[] = {
2946
+ 0, 1, 2, 3, 4, 5, 6, 7, /* 0x0000 */
2947
+ 8, 9, 10, 11, 12, 13, 14, 15, /* 0x0200 */
2948
+ 16, 17, 18, 19, 20, 21, 22, 23, /* 0x0400 */
2949
+ 24, 25, 26, 27, 28, 28, 28, 28, /* 0x0600 */
2950
+ 28, 28, 28, 28, 29, 30, 31, 32, /* 0x0800 */
2951
+ 33, 34, 35, 36, 37, 38, 39, 40, /* 0x0A00 */
2952
+ 41, 42, 43, 44, 45, 46, 28, 28, /* 0x0C00 */
2953
+ 47, 48, 49, 50, 51, 52, 53, 28, /* 0x0E00 */
2954
+ 28, 28, 54, 55, 56, 57, 58, 59, /* 0x1000 */
2955
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x1200 */
2956
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x1400 */
2957
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x1600 */
2958
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x1800 */
2959
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x1A00 */
2960
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x1C00 */
2961
+ 60, 60, 61, 62, 63, 64, 65, 66, /* 0x1E00 */
2962
+ 67, 68, 69, 70, 71, 72, 73, 74, /* 0x2000 */
2963
+ 75, 75, 75, 76, 77, 78, 28, 28, /* 0x2200 */
2964
+ 79, 80, 81, 82, 83, 83, 84, 85, /* 0x2400 */
2965
+ 86, 85, 28, 28, 87, 88, 89, 28, /* 0x2600 */
2966
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x2800 */
2967
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x2A00 */
2968
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x2C00 */
2969
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x2E00 */
2970
+ 90, 91, 92, 93, 94, 56, 95, 28, /* 0x3000 */
2971
+ 96, 97, 98, 99, 83, 100, 83, 101, /* 0x3200 */
2972
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x3400 */
2973
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x3600 */
2974
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x3800 */
2975
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x3A00 */
2976
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x3C00 */
2977
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x3E00 */
2978
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x4000 */
2979
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x4200 */
2980
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x4400 */
2981
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x4600 */
2982
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x4800 */
2983
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x4A00 */
2984
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0x4C00 */
2985
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x4E00 */
2986
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x5000 */
2987
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x5200 */
2988
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x5400 */
2989
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x5600 */
2990
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x5800 */
2991
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x5A00 */
2992
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x5C00 */
2993
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x5E00 */
2994
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x6000 */
2995
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x6200 */
2996
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x6400 */
2997
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x6600 */
2998
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x6800 */
2999
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x6A00 */
3000
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x6C00 */
3001
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x6E00 */
3002
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x7000 */
3003
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x7200 */
3004
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x7400 */
3005
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x7600 */
3006
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x7800 */
3007
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x7A00 */
3008
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x7C00 */
3009
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x7E00 */
3010
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x8000 */
3011
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x8200 */
3012
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x8400 */
3013
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x8600 */
3014
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x8800 */
3015
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x8A00 */
3016
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x8C00 */
3017
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x8E00 */
3018
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x9000 */
3019
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x9200 */
3020
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x9400 */
3021
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x9600 */
3022
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x9800 */
3023
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x9A00 */
3024
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0x9C00 */
3025
+ 56, 56, 56, 56, 56, 56, 102, 28, /* 0x9E00 */
3026
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0xA000 */
3027
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0xA200 */
3028
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0xA400 */
3029
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0xA600 */
3030
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0xA800 */
3031
+ 28, 28, 28, 28, 28, 28, 28, 28, /* 0xAA00 */
3032
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xAC00 */
3033
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xAE00 */
3034
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xB000 */
3035
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xB200 */
3036
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xB400 */
3037
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xB600 */
3038
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xB800 */
3039
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xBA00 */
3040
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xBC00 */
3041
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xBE00 */
3042
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xC000 */
3043
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xC200 */
3044
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xC400 */
3045
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xC600 */
3046
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xC800 */
3047
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xCA00 */
3048
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xCC00 */
3049
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xCE00 */
3050
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xD000 */
3051
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xD200 */
3052
+ 56, 56, 56, 56, 56, 56, 56, 56, /* 0xD400 */
3053
+ 56, 56, 56, 56, 56, 56, 103, 28, /* 0xD600 */
3054
+ 104, 104, 104, 104, 104, 104, 104, 104, /* 0xD800 */
3055
+ 104, 104, 104, 104, 104, 104, 104, 104, /* 0xDA00 */
3056
+ 104, 104, 104, 104, 104, 104, 104, 104, /* 0xDC00 */
3057
+ 104, 104, 104, 104, 104, 104, 104, 104, /* 0xDE00 */
3058
+ 105, 105, 105, 105, 105, 105, 105, 105, /* 0xE000 */
3059
+ 105, 105, 105, 105, 105, 105, 105, 105, /* 0xE200 */
3060
+ 105, 105, 105, 105, 105, 105, 105, 105, /* 0xE400 */
3061
+ 105, 105, 105, 105, 105, 105, 105, 105, /* 0xE600 */
3062
+ 105, 105, 105, 105, 105, 105, 105, 105, /* 0xE800 */
3063
+ 105, 105, 105, 105, 105, 105, 105, 105, /* 0xEA00 */
3064
+ 105, 105, 105, 105, 105, 105, 105, 105, /* 0xEC00 */
3065
+ 105, 105, 105, 105, 105, 105, 105, 105, /* 0xEE00 */
3066
+ 105, 105, 105, 105, 105, 105, 105, 105, /* 0xF000 */
3067
+ 105, 105, 105, 105, 105, 105, 105, 105, /* 0xF200 */
3068
+ 105, 105, 105, 105, 105, 105, 105, 105, /* 0xF400 */
3069
+ 105, 105, 105, 105, 105, 105, 105, 105, /* 0xF600 */
3070
+ 105, 105, 105, 105, 56, 56, 56, 56, /* 0xF800 */
3071
+ 106, 28, 28, 28, 107, 108, 109, 110, /* 0xFA00 */
3072
+ 56, 56, 56, 56, 111, 112, 113, 114, /* 0xFC00 */
3073
+ 115, 116, 56, 117, 118, 119, 120, 121 /* 0xFE00 */
3074
+ };
3075
+
3076
+ /* The Y table has 7808 entries for a total of 7808 bytes. */
3077
+
3078
+ const uint8 js_Y[] = {
3079
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0 */
3080
+ 0, 1, 1, 1, 1, 1, 0, 0, /* 0 */
3081
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0 */
3082
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0 */
3083
+ 2, 3, 3, 3, 4, 3, 3, 3, /* 0 */
3084
+ 5, 6, 3, 7, 3, 8, 3, 3, /* 0 */
3085
+ 9, 9, 9, 9, 9, 9, 9, 9, /* 0 */
3086
+ 9, 9, 3, 3, 7, 7, 7, 3, /* 0 */
3087
+ 3, 10, 10, 10, 10, 10, 10, 10, /* 1 */
3088
+ 10, 10, 10, 10, 10, 10, 10, 10, /* 1 */
3089
+ 10, 10, 10, 10, 10, 10, 10, 10, /* 1 */
3090
+ 10, 10, 10, 5, 3, 6, 11, 12, /* 1 */
3091
+ 11, 13, 13, 13, 13, 13, 13, 13, /* 1 */
3092
+ 13, 13, 13, 13, 13, 13, 13, 13, /* 1 */
3093
+ 13, 13, 13, 13, 13, 13, 13, 13, /* 1 */
3094
+ 13, 13, 13, 5, 7, 6, 7, 0, /* 1 */
3095
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 2 */
3096
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 2 */
3097
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 2 */
3098
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 2 */
3099
+ 2, 3, 4, 4, 4, 4, 15, 15, /* 2 */
3100
+ 11, 15, 16, 5, 7, 8, 15, 11, /* 2 */
3101
+ 15, 7, 17, 17, 11, 16, 15, 3, /* 2 */
3102
+ 11, 18, 16, 6, 19, 19, 19, 3, /* 2 */
3103
+ 20, 20, 20, 20, 20, 20, 20, 20, /* 3 */
3104
+ 20, 20, 20, 20, 20, 20, 20, 20, /* 3 */
3105
+ 20, 20, 20, 20, 20, 20, 20, 7, /* 3 */
3106
+ 20, 20, 20, 20, 20, 20, 20, 16, /* 3 */
3107
+ 21, 21, 21, 21, 21, 21, 21, 21, /* 3 */
3108
+ 21, 21, 21, 21, 21, 21, 21, 21, /* 3 */
3109
+ 21, 21, 21, 21, 21, 21, 21, 7, /* 3 */
3110
+ 21, 21, 21, 21, 21, 21, 21, 22, /* 3 */
3111
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 4 */
3112
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 4 */
3113
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 4 */
3114
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 4 */
3115
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 4 */
3116
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 4 */
3117
+ 25, 26, 23, 24, 23, 24, 23, 24, /* 4 */
3118
+ 16, 23, 24, 23, 24, 23, 24, 23, /* 4 */
3119
+ 24, 23, 24, 23, 24, 23, 24, 23, /* 5 */
3120
+ 24, 16, 23, 24, 23, 24, 23, 24, /* 5 */
3121
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 5 */
3122
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 5 */
3123
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 5 */
3124
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 5 */
3125
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 5 */
3126
+ 27, 23, 24, 23, 24, 23, 24, 28, /* 5 */
3127
+ 16, 29, 23, 24, 23, 24, 30, 23, /* 6 */
3128
+ 24, 31, 31, 23, 24, 16, 32, 32, /* 6 */
3129
+ 33, 23, 24, 31, 34, 16, 35, 36, /* 6 */
3130
+ 23, 24, 16, 16, 35, 37, 16, 38, /* 6 */
3131
+ 23, 24, 23, 24, 23, 24, 38, 23, /* 6 */
3132
+ 24, 39, 40, 16, 23, 24, 39, 23, /* 6 */
3133
+ 24, 41, 41, 23, 24, 23, 24, 42, /* 6 */
3134
+ 23, 24, 16, 40, 23, 24, 40, 40, /* 6 */
3135
+ 40, 40, 40, 40, 43, 44, 45, 43, /* 7 */
3136
+ 44, 45, 43, 44, 45, 23, 24, 23, /* 7 */
3137
+ 24, 23, 24, 23, 24, 23, 24, 23, /* 7 */
3138
+ 24, 23, 24, 23, 24, 16, 23, 24, /* 7 */
3139
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 7 */
3140
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 7 */
3141
+ 16, 43, 44, 45, 23, 24, 46, 46, /* 7 */
3142
+ 46, 46, 23, 24, 23, 24, 23, 24, /* 7 */
3143
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 8 */
3144
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 8 */
3145
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 8 */
3146
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 8 */
3147
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 8 */
3148
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 8 */
3149
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 8 */
3150
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 8 */
3151
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 9 */
3152
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 9 */
3153
+ 16, 16, 16, 47, 48, 16, 49, 49, /* 9 */
3154
+ 50, 50, 16, 51, 16, 16, 16, 16, /* 9 */
3155
+ 49, 16, 16, 52, 16, 16, 16, 16, /* 9 */
3156
+ 53, 54, 16, 16, 16, 16, 16, 54, /* 9 */
3157
+ 16, 16, 55, 16, 16, 16, 16, 16, /* 9 */
3158
+ 16, 16, 16, 16, 16, 16, 16, 16, /* 9 */
3159
+ 16, 16, 16, 56, 16, 16, 16, 16, /* 10 */
3160
+ 56, 16, 57, 57, 16, 16, 16, 16, /* 10 */
3161
+ 16, 16, 58, 16, 16, 16, 16, 16, /* 10 */
3162
+ 16, 16, 16, 16, 16, 16, 16, 16, /* 10 */
3163
+ 16, 16, 16, 16, 16, 16, 16, 16, /* 10 */
3164
+ 16, 46, 46, 46, 46, 46, 46, 46, /* 10 */
3165
+ 59, 59, 59, 59, 59, 59, 59, 59, /* 10 */
3166
+ 59, 11, 11, 59, 59, 59, 59, 59, /* 10 */
3167
+ 59, 59, 11, 11, 11, 11, 11, 11, /* 11 */
3168
+ 11, 11, 11, 11, 11, 11, 11, 11, /* 11 */
3169
+ 59, 59, 11, 11, 11, 11, 11, 11, /* 11 */
3170
+ 11, 11, 11, 11, 11, 11, 11, 46, /* 11 */
3171
+ 59, 59, 59, 59, 59, 11, 11, 11, /* 11 */
3172
+ 11, 11, 46, 46, 46, 46, 46, 46, /* 11 */
3173
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 11 */
3174
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 11 */
3175
+ 60, 60, 60, 60, 60, 60, 60, 60, /* 12 */
3176
+ 60, 60, 60, 60, 60, 60, 60, 60, /* 12 */
3177
+ 60, 60, 60, 60, 60, 60, 60, 60, /* 12 */
3178
+ 60, 60, 60, 60, 60, 60, 60, 60, /* 12 */
3179
+ 60, 60, 60, 60, 60, 60, 60, 60, /* 12 */
3180
+ 60, 60, 60, 60, 60, 60, 60, 60, /* 12 */
3181
+ 60, 60, 60, 60, 60, 60, 60, 60, /* 12 */
3182
+ 60, 60, 60, 60, 60, 60, 60, 60, /* 12 */
3183
+ 60, 60, 60, 60, 60, 60, 46, 46, /* 13 */
3184
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 13 */
3185
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 13 */
3186
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 13 */
3187
+ 60, 60, 46, 46, 46, 46, 46, 46, /* 13 */
3188
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 13 */
3189
+ 46, 46, 46, 46, 3, 3, 46, 46, /* 13 */
3190
+ 46, 46, 59, 46, 46, 46, 3, 46, /* 13 */
3191
+ 46, 46, 46, 46, 11, 11, 61, 3, /* 14 */
3192
+ 62, 62, 62, 46, 63, 46, 64, 64, /* 14 */
3193
+ 16, 20, 20, 20, 20, 20, 20, 20, /* 14 */
3194
+ 20, 20, 20, 20, 20, 20, 20, 20, /* 14 */
3195
+ 20, 20, 46, 20, 20, 20, 20, 20, /* 14 */
3196
+ 20, 20, 20, 20, 65, 66, 66, 66, /* 14 */
3197
+ 16, 21, 21, 21, 21, 21, 21, 21, /* 14 */
3198
+ 21, 21, 21, 21, 21, 21, 21, 21, /* 14 */
3199
+ 21, 21, 16, 21, 21, 21, 21, 21, /* 15 */
3200
+ 21, 21, 21, 21, 67, 68, 68, 46, /* 15 */
3201
+ 69, 70, 38, 38, 38, 71, 72, 46, /* 15 */
3202
+ 46, 46, 38, 46, 38, 46, 38, 46, /* 15 */
3203
+ 38, 46, 23, 24, 23, 24, 23, 24, /* 15 */
3204
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 15 */
3205
+ 73, 74, 16, 40, 46, 46, 46, 46, /* 15 */
3206
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 15 */
3207
+ 46, 75, 75, 75, 75, 75, 75, 75, /* 16 */
3208
+ 75, 75, 75, 75, 75, 46, 75, 75, /* 16 */
3209
+ 20, 20, 20, 20, 20, 20, 20, 20, /* 16 */
3210
+ 20, 20, 20, 20, 20, 20, 20, 20, /* 16 */
3211
+ 20, 20, 20, 20, 20, 20, 20, 20, /* 16 */
3212
+ 20, 20, 20, 20, 20, 20, 20, 20, /* 16 */
3213
+ 21, 21, 21, 21, 21, 21, 21, 21, /* 16 */
3214
+ 21, 21, 21, 21, 21, 21, 21, 21, /* 16 */
3215
+ 21, 21, 21, 21, 21, 21, 21, 21, /* 17 */
3216
+ 21, 21, 21, 21, 21, 21, 21, 21, /* 17 */
3217
+ 46, 74, 74, 74, 74, 74, 74, 74, /* 17 */
3218
+ 74, 74, 74, 74, 74, 46, 74, 74, /* 17 */
3219
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 17 */
3220
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 17 */
3221
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 17 */
3222
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 17 */
3223
+ 23, 24, 15, 60, 60, 60, 60, 46, /* 18 */
3224
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 18 */
3225
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 18 */
3226
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 18 */
3227
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 18 */
3228
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 18 */
3229
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 18 */
3230
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 18 */
3231
+ 40, 23, 24, 23, 24, 46, 46, 23, /* 19 */
3232
+ 24, 46, 46, 23, 24, 46, 46, 46, /* 19 */
3233
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 19 */
3234
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 19 */
3235
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 19 */
3236
+ 23, 24, 23, 24, 46, 46, 23, 24, /* 19 */
3237
+ 23, 24, 23, 24, 23, 24, 46, 46, /* 19 */
3238
+ 23, 24, 46, 46, 46, 46, 46, 46, /* 19 */
3239
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 20 */
3240
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 20 */
3241
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 20 */
3242
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 20 */
3243
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 20 */
3244
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 20 */
3245
+ 46, 76, 76, 76, 76, 76, 76, 76, /* 20 */
3246
+ 76, 76, 76, 76, 76, 76, 76, 76, /* 20 */
3247
+ 76, 76, 76, 76, 76, 76, 76, 76, /* 21 */
3248
+ 76, 76, 76, 76, 76, 76, 76, 76, /* 21 */
3249
+ 76, 76, 76, 76, 76, 76, 76, 46, /* 21 */
3250
+ 46, 59, 3, 3, 3, 3, 3, 3, /* 21 */
3251
+ 46, 77, 77, 77, 77, 77, 77, 77, /* 21 */
3252
+ 77, 77, 77, 77, 77, 77, 77, 77, /* 21 */
3253
+ 77, 77, 77, 77, 77, 77, 77, 77, /* 21 */
3254
+ 77, 77, 77, 77, 77, 77, 77, 77, /* 21 */
3255
+ 77, 77, 77, 77, 77, 77, 77, 16, /* 22 */
3256
+ 46, 3, 46, 46, 46, 46, 46, 46, /* 22 */
3257
+ 46, 60, 60, 60, 60, 60, 60, 60, /* 22 */
3258
+ 60, 60, 60, 60, 60, 60, 60, 60, /* 22 */
3259
+ 60, 60, 46, 60, 60, 60, 60, 60, /* 22 */
3260
+ 60, 60, 60, 60, 60, 60, 60, 60, /* 22 */
3261
+ 60, 60, 60, 60, 60, 60, 60, 60, /* 22 */
3262
+ 60, 60, 46, 60, 60, 60, 3, 60, /* 22 */
3263
+ 3, 60, 60, 3, 60, 46, 46, 46, /* 23 */
3264
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 23 */
3265
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 23 */
3266
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 23 */
3267
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 23 */
3268
+ 40, 40, 40, 46, 46, 46, 46, 46, /* 23 */
3269
+ 40, 40, 40, 3, 3, 46, 46, 46, /* 23 */
3270
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 23 */
3271
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 24 */
3272
+ 46, 46, 46, 46, 3, 46, 46, 46, /* 24 */
3273
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 24 */
3274
+ 46, 46, 46, 3, 46, 46, 46, 3, /* 24 */
3275
+ 46, 40, 40, 40, 40, 40, 40, 40, /* 24 */
3276
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 24 */
3277
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 24 */
3278
+ 40, 40, 40, 46, 46, 46, 46, 46, /* 24 */
3279
+ 59, 40, 40, 40, 40, 40, 40, 40, /* 25 */
3280
+ 40, 40, 40, 60, 60, 60, 60, 60, /* 25 */
3281
+ 60, 60, 60, 46, 46, 46, 46, 46, /* 25 */
3282
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 25 */
3283
+ 78, 78, 78, 78, 78, 78, 78, 78, /* 25 */
3284
+ 78, 78, 3, 3, 3, 3, 46, 46, /* 25 */
3285
+ 60, 40, 40, 40, 40, 40, 40, 40, /* 25 */
3286
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 25 */
3287
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 26 */
3288
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 26 */
3289
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 26 */
3290
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 26 */
3291
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 26 */
3292
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 26 */
3293
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 26 */
3294
+ 46, 46, 40, 40, 40, 40, 40, 46, /* 26 */
3295
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 27 */
3296
+ 40, 40, 40, 40, 40, 40, 40, 46, /* 27 */
3297
+ 40, 40, 40, 40, 3, 40, 60, 60, /* 27 */
3298
+ 60, 60, 60, 60, 60, 79, 79, 60, /* 27 */
3299
+ 60, 60, 60, 60, 60, 59, 59, 60, /* 27 */
3300
+ 60, 15, 60, 60, 60, 60, 46, 46, /* 27 */
3301
+ 9, 9, 9, 9, 9, 9, 9, 9, /* 27 */
3302
+ 9, 9, 46, 46, 46, 46, 46, 46, /* 27 */
3303
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 28 */
3304
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 28 */
3305
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 28 */
3306
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 28 */
3307
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 28 */
3308
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 28 */
3309
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 28 */
3310
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 28 */
3311
+ 46, 60, 60, 80, 46, 40, 40, 40, /* 29 */
3312
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 29 */
3313
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 29 */
3314
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 29 */
3315
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 29 */
3316
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 29 */
3317
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 29 */
3318
+ 40, 40, 46, 46, 60, 40, 80, 80, /* 29 */
3319
+ 80, 60, 60, 60, 60, 60, 60, 60, /* 30 */
3320
+ 60, 80, 80, 80, 80, 60, 46, 46, /* 30 */
3321
+ 15, 60, 60, 60, 60, 46, 46, 46, /* 30 */
3322
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 30 */
3323
+ 40, 40, 60, 60, 3, 3, 81, 81, /* 30 */
3324
+ 81, 81, 81, 81, 81, 81, 81, 81, /* 30 */
3325
+ 3, 46, 46, 46, 46, 46, 46, 46, /* 30 */
3326
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 30 */
3327
+ 46, 60, 80, 80, 46, 40, 40, 40, /* 31 */
3328
+ 40, 40, 40, 40, 40, 46, 46, 40, /* 31 */
3329
+ 40, 46, 46, 40, 40, 40, 40, 40, /* 31 */
3330
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 31 */
3331
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 31 */
3332
+ 40, 46, 40, 40, 40, 40, 40, 40, /* 31 */
3333
+ 40, 46, 40, 46, 46, 46, 40, 40, /* 31 */
3334
+ 40, 40, 46, 46, 60, 46, 80, 80, /* 31 */
3335
+ 80, 60, 60, 60, 60, 46, 46, 80, /* 32 */
3336
+ 80, 46, 46, 80, 80, 60, 46, 46, /* 32 */
3337
+ 46, 46, 46, 46, 46, 46, 46, 80, /* 32 */
3338
+ 46, 46, 46, 46, 40, 40, 46, 40, /* 32 */
3339
+ 40, 40, 60, 60, 46, 46, 81, 81, /* 32 */
3340
+ 81, 81, 81, 81, 81, 81, 81, 81, /* 32 */
3341
+ 40, 40, 4, 4, 82, 82, 82, 82, /* 32 */
3342
+ 19, 83, 15, 46, 46, 46, 46, 46, /* 32 */
3343
+ 46, 46, 60, 46, 46, 40, 40, 40, /* 33 */
3344
+ 40, 40, 40, 46, 46, 46, 46, 40, /* 33 */
3345
+ 40, 46, 46, 40, 40, 40, 40, 40, /* 33 */
3346
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 33 */
3347
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 33 */
3348
+ 40, 46, 40, 40, 40, 40, 40, 40, /* 33 */
3349
+ 40, 46, 40, 40, 46, 40, 40, 46, /* 33 */
3350
+ 40, 40, 46, 46, 60, 46, 80, 80, /* 33 */
3351
+ 80, 60, 60, 46, 46, 46, 46, 60, /* 34 */
3352
+ 60, 46, 46, 60, 60, 60, 46, 46, /* 34 */
3353
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 34 */
3354
+ 46, 40, 40, 40, 40, 46, 40, 46, /* 34 */
3355
+ 46, 46, 46, 46, 46, 46, 81, 81, /* 34 */
3356
+ 81, 81, 81, 81, 81, 81, 81, 81, /* 34 */
3357
+ 60, 60, 40, 40, 40, 46, 46, 46, /* 34 */
3358
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 34 */
3359
+ 46, 60, 60, 80, 46, 40, 40, 40, /* 35 */
3360
+ 40, 40, 40, 40, 46, 40, 46, 40, /* 35 */
3361
+ 40, 40, 46, 40, 40, 40, 40, 40, /* 35 */
3362
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 35 */
3363
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 35 */
3364
+ 40, 46, 40, 40, 40, 40, 40, 40, /* 35 */
3365
+ 40, 46, 40, 40, 46, 40, 40, 40, /* 35 */
3366
+ 40, 40, 46, 46, 60, 40, 80, 80, /* 35 */
3367
+ 80, 60, 60, 60, 60, 60, 46, 60, /* 36 */
3368
+ 60, 80, 46, 80, 80, 60, 46, 46, /* 36 */
3369
+ 15, 46, 46, 46, 46, 46, 46, 46, /* 36 */
3370
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 36 */
3371
+ 40, 46, 46, 46, 46, 46, 81, 81, /* 36 */
3372
+ 81, 81, 81, 81, 81, 81, 81, 81, /* 36 */
3373
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 36 */
3374
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 36 */
3375
+ 46, 60, 80, 80, 46, 40, 40, 40, /* 37 */
3376
+ 40, 40, 40, 40, 40, 46, 46, 40, /* 37 */
3377
+ 40, 46, 46, 40, 40, 40, 40, 40, /* 37 */
3378
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 37 */
3379
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 37 */
3380
+ 40, 46, 40, 40, 40, 40, 40, 40, /* 37 */
3381
+ 40, 46, 40, 40, 46, 46, 40, 40, /* 37 */
3382
+ 40, 40, 46, 46, 60, 40, 80, 60, /* 37 */
3383
+ 80, 60, 60, 60, 46, 46, 46, 80, /* 38 */
3384
+ 80, 46, 46, 80, 80, 60, 46, 46, /* 38 */
3385
+ 46, 46, 46, 46, 46, 46, 60, 80, /* 38 */
3386
+ 46, 46, 46, 46, 40, 40, 46, 40, /* 38 */
3387
+ 40, 40, 46, 46, 46, 46, 81, 81, /* 38 */
3388
+ 81, 81, 81, 81, 81, 81, 81, 81, /* 38 */
3389
+ 15, 46, 46, 46, 46, 46, 46, 46, /* 38 */
3390
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 38 */
3391
+ 46, 46, 60, 80, 46, 40, 40, 40, /* 39 */
3392
+ 40, 40, 40, 46, 46, 46, 40, 40, /* 39 */
3393
+ 40, 46, 40, 40, 40, 40, 46, 46, /* 39 */
3394
+ 46, 40, 40, 46, 40, 46, 40, 40, /* 39 */
3395
+ 46, 46, 46, 40, 40, 46, 46, 46, /* 39 */
3396
+ 40, 40, 40, 46, 46, 46, 40, 40, /* 39 */
3397
+ 40, 40, 40, 40, 40, 40, 46, 40, /* 39 */
3398
+ 40, 40, 46, 46, 46, 46, 80, 80, /* 39 */
3399
+ 60, 80, 80, 46, 46, 46, 80, 80, /* 40 */
3400
+ 80, 46, 80, 80, 80, 60, 46, 46, /* 40 */
3401
+ 46, 46, 46, 46, 46, 46, 46, 80, /* 40 */
3402
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 40 */
3403
+ 46, 46, 46, 46, 46, 46, 46, 81, /* 40 */
3404
+ 81, 81, 81, 81, 81, 81, 81, 81, /* 40 */
3405
+ 84, 19, 19, 46, 46, 46, 46, 46, /* 40 */
3406
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 40 */
3407
+ 46, 80, 80, 80, 46, 40, 40, 40, /* 41 */
3408
+ 40, 40, 40, 40, 40, 46, 40, 40, /* 41 */
3409
+ 40, 46, 40, 40, 40, 40, 40, 40, /* 41 */
3410
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 41 */
3411
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 41 */
3412
+ 40, 46, 40, 40, 40, 40, 40, 40, /* 41 */
3413
+ 40, 40, 40, 40, 46, 40, 40, 40, /* 41 */
3414
+ 40, 40, 46, 46, 46, 46, 60, 60, /* 41 */
3415
+ 60, 80, 80, 80, 80, 46, 60, 60, /* 42 */
3416
+ 60, 46, 60, 60, 60, 60, 46, 46, /* 42 */
3417
+ 46, 46, 46, 46, 46, 60, 60, 46, /* 42 */
3418
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 42 */
3419
+ 40, 40, 46, 46, 46, 46, 81, 81, /* 42 */
3420
+ 81, 81, 81, 81, 81, 81, 81, 81, /* 42 */
3421
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 42 */
3422
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 42 */
3423
+ 46, 46, 80, 80, 46, 40, 40, 40, /* 43 */
3424
+ 40, 40, 40, 40, 40, 46, 40, 40, /* 43 */
3425
+ 40, 46, 40, 40, 40, 40, 40, 40, /* 43 */
3426
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 43 */
3427
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 43 */
3428
+ 40, 46, 40, 40, 40, 40, 40, 40, /* 43 */
3429
+ 40, 40, 40, 40, 46, 40, 40, 40, /* 43 */
3430
+ 40, 40, 46, 46, 46, 46, 80, 60, /* 43 */
3431
+ 80, 80, 80, 80, 80, 46, 60, 80, /* 44 */
3432
+ 80, 46, 80, 80, 60, 60, 46, 46, /* 44 */
3433
+ 46, 46, 46, 46, 46, 80, 80, 46, /* 44 */
3434
+ 46, 46, 46, 46, 46, 46, 40, 46, /* 44 */
3435
+ 40, 40, 46, 46, 46, 46, 81, 81, /* 44 */
3436
+ 81, 81, 81, 81, 81, 81, 81, 81, /* 44 */
3437
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 44 */
3438
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 44 */
3439
+ 46, 46, 80, 80, 46, 40, 40, 40, /* 45 */
3440
+ 40, 40, 40, 40, 40, 46, 40, 40, /* 45 */
3441
+ 40, 46, 40, 40, 40, 40, 40, 40, /* 45 */
3442
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 45 */
3443
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 45 */
3444
+ 40, 46, 40, 40, 40, 40, 40, 40, /* 45 */
3445
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 45 */
3446
+ 40, 40, 46, 46, 46, 46, 80, 80, /* 45 */
3447
+ 80, 60, 60, 60, 46, 46, 80, 80, /* 46 */
3448
+ 80, 46, 80, 80, 80, 60, 46, 46, /* 46 */
3449
+ 46, 46, 46, 46, 46, 46, 46, 80, /* 46 */
3450
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 46 */
3451
+ 40, 40, 46, 46, 46, 46, 81, 81, /* 46 */
3452
+ 81, 81, 81, 81, 81, 81, 81, 81, /* 46 */
3453
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 46 */
3454
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 46 */
3455
+ 46, 40, 40, 40, 40, 40, 40, 40, /* 47 */
3456
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 47 */
3457
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 47 */
3458
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 47 */
3459
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 47 */
3460
+ 40, 40, 40, 40, 40, 40, 40, 3, /* 47 */
3461
+ 40, 60, 40, 40, 60, 60, 60, 60, /* 47 */
3462
+ 60, 60, 60, 46, 46, 46, 46, 4, /* 47 */
3463
+ 40, 40, 40, 40, 40, 40, 59, 60, /* 48 */
3464
+ 60, 60, 60, 60, 60, 60, 60, 15, /* 48 */
3465
+ 9, 9, 9, 9, 9, 9, 9, 9, /* 48 */
3466
+ 9, 9, 3, 3, 46, 46, 46, 46, /* 48 */
3467
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 48 */
3468
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 48 */
3469
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 48 */
3470
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 48 */
3471
+ 46, 40, 40, 46, 40, 46, 46, 40, /* 49 */
3472
+ 40, 46, 40, 46, 46, 40, 46, 46, /* 49 */
3473
+ 46, 46, 46, 46, 40, 40, 40, 40, /* 49 */
3474
+ 46, 40, 40, 40, 40, 40, 40, 40, /* 49 */
3475
+ 46, 40, 40, 40, 46, 40, 46, 40, /* 49 */
3476
+ 46, 46, 40, 40, 46, 40, 40, 3, /* 49 */
3477
+ 40, 60, 40, 40, 60, 60, 60, 60, /* 49 */
3478
+ 60, 60, 46, 60, 60, 40, 46, 46, /* 49 */
3479
+ 40, 40, 40, 40, 40, 46, 59, 46, /* 50 */
3480
+ 60, 60, 60, 60, 60, 60, 46, 46, /* 50 */
3481
+ 9, 9, 9, 9, 9, 9, 9, 9, /* 50 */
3482
+ 9, 9, 46, 46, 40, 40, 46, 46, /* 50 */
3483
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 50 */
3484
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 50 */
3485
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 50 */
3486
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 50 */
3487
+ 15, 15, 15, 15, 3, 3, 3, 3, /* 51 */
3488
+ 3, 3, 3, 3, 3, 3, 3, 3, /* 51 */
3489
+ 3, 3, 3, 15, 15, 15, 15, 15, /* 51 */
3490
+ 60, 60, 15, 15, 15, 15, 15, 15, /* 51 */
3491
+ 78, 78, 78, 78, 78, 78, 78, 78, /* 51 */
3492
+ 78, 78, 85, 85, 85, 85, 85, 85, /* 51 */
3493
+ 85, 85, 85, 85, 15, 60, 15, 60, /* 51 */
3494
+ 15, 60, 5, 6, 5, 6, 80, 80, /* 51 */
3495
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 52 */
3496
+ 46, 40, 40, 40, 40, 40, 40, 40, /* 52 */
3497
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 52 */
3498
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 52 */
3499
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 52 */
3500
+ 40, 40, 46, 46, 46, 46, 46, 46, /* 52 */
3501
+ 46, 60, 60, 60, 60, 60, 60, 60, /* 52 */
3502
+ 60, 60, 60, 60, 60, 60, 60, 80, /* 52 */
3503
+ 60, 60, 60, 60, 60, 3, 60, 60, /* 53 */
3504
+ 60, 60, 60, 60, 46, 46, 46, 46, /* 53 */
3505
+ 60, 60, 60, 60, 60, 60, 46, 60, /* 53 */
3506
+ 46, 60, 60, 60, 60, 60, 60, 60, /* 53 */
3507
+ 60, 60, 60, 60, 60, 60, 60, 60, /* 53 */
3508
+ 60, 60, 60, 60, 60, 60, 46, 46, /* 53 */
3509
+ 46, 60, 60, 60, 60, 60, 60, 60, /* 53 */
3510
+ 46, 60, 46, 46, 46, 46, 46, 46, /* 53 */
3511
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 54 */
3512
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 54 */
3513
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 54 */
3514
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 54 */
3515
+ 76, 76, 76, 76, 76, 76, 76, 76, /* 54 */
3516
+ 76, 76, 76, 76, 76, 76, 76, 76, /* 54 */
3517
+ 76, 76, 76, 76, 76, 76, 76, 76, /* 54 */
3518
+ 76, 76, 76, 76, 76, 76, 76, 76, /* 54 */
3519
+ 76, 76, 76, 76, 76, 76, 46, 46, /* 55 */
3520
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 55 */
3521
+ 16, 16, 16, 16, 16, 16, 16, 16, /* 55 */
3522
+ 16, 16, 16, 16, 16, 16, 16, 16, /* 55 */
3523
+ 16, 16, 16, 16, 16, 16, 16, 16, /* 55 */
3524
+ 16, 16, 16, 16, 16, 16, 16, 16, /* 55 */
3525
+ 16, 16, 16, 16, 16, 16, 16, 46, /* 55 */
3526
+ 46, 46, 46, 3, 46, 46, 46, 46, /* 55 */
3527
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 56 */
3528
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 56 */
3529
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 56 */
3530
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 56 */
3531
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 56 */
3532
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 56 */
3533
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 56 */
3534
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 56 */
3535
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 57 */
3536
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 57 */
3537
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 57 */
3538
+ 40, 40, 46, 46, 46, 46, 46, 40, /* 57 */
3539
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 57 */
3540
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 57 */
3541
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 57 */
3542
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 57 */
3543
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 58 */
3544
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 58 */
3545
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 58 */
3546
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 58 */
3547
+ 40, 40, 40, 46, 46, 46, 46, 46, /* 58 */
3548
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 58 */
3549
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 58 */
3550
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 58 */
3551
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 59 */
3552
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 59 */
3553
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 59 */
3554
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 59 */
3555
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 59 */
3556
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 59 */
3557
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 59 */
3558
+ 40, 40, 46, 46, 46, 46, 46, 46, /* 59 */
3559
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 60 */
3560
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 60 */
3561
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 60 */
3562
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 60 */
3563
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 60 */
3564
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 60 */
3565
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 60 */
3566
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 60 */
3567
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 61 */
3568
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 61 */
3569
+ 23, 24, 23, 24, 23, 24, 16, 16, /* 61 */
3570
+ 16, 16, 16, 16, 46, 46, 46, 46, /* 61 */
3571
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 61 */
3572
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 61 */
3573
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 61 */
3574
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 61 */
3575
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 62 */
3576
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 62 */
3577
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 62 */
3578
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 62 */
3579
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 62 */
3580
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 62 */
3581
+ 23, 24, 23, 24, 23, 24, 23, 24, /* 62 */
3582
+ 23, 24, 46, 46, 46, 46, 46, 46, /* 62 */
3583
+ 86, 86, 86, 86, 86, 86, 86, 86, /* 63 */
3584
+ 87, 87, 87, 87, 87, 87, 87, 87, /* 63 */
3585
+ 86, 86, 86, 86, 86, 86, 46, 46, /* 63 */
3586
+ 87, 87, 87, 87, 87, 87, 46, 46, /* 63 */
3587
+ 86, 86, 86, 86, 86, 86, 86, 86, /* 63 */
3588
+ 87, 87, 87, 87, 87, 87, 87, 87, /* 63 */
3589
+ 86, 86, 86, 86, 86, 86, 86, 86, /* 63 */
3590
+ 87, 87, 87, 87, 87, 87, 87, 87, /* 63 */
3591
+ 86, 86, 86, 86, 86, 86, 46, 46, /* 64 */
3592
+ 87, 87, 87, 87, 87, 87, 46, 46, /* 64 */
3593
+ 16, 86, 16, 86, 16, 86, 16, 86, /* 64 */
3594
+ 46, 87, 46, 87, 46, 87, 46, 87, /* 64 */
3595
+ 86, 86, 86, 86, 86, 86, 86, 86, /* 64 */
3596
+ 87, 87, 87, 87, 87, 87, 87, 87, /* 64 */
3597
+ 88, 88, 89, 89, 89, 89, 90, 90, /* 64 */
3598
+ 91, 91, 92, 92, 93, 93, 46, 46, /* 64 */
3599
+ 86, 86, 86, 86, 86, 86, 86, 86, /* 65 */
3600
+ 87, 87, 87, 87, 87, 87, 87, 87, /* 65 */
3601
+ 86, 86, 86, 86, 86, 86, 86, 86, /* 65 */
3602
+ 87, 87, 87, 87, 87, 87, 87, 87, /* 65 */
3603
+ 86, 86, 86, 86, 86, 86, 86, 86, /* 65 */
3604
+ 87, 87, 87, 87, 87, 87, 87, 87, /* 65 */
3605
+ 86, 86, 16, 94, 16, 46, 16, 16, /* 65 */
3606
+ 87, 87, 95, 95, 96, 11, 38, 11, /* 65 */
3607
+ 11, 11, 16, 94, 16, 46, 16, 16, /* 66 */
3608
+ 97, 97, 97, 97, 96, 11, 11, 11, /* 66 */
3609
+ 86, 86, 16, 16, 46, 46, 16, 16, /* 66 */
3610
+ 87, 87, 98, 98, 46, 11, 11, 11, /* 66 */
3611
+ 86, 86, 16, 16, 16, 99, 16, 16, /* 66 */
3612
+ 87, 87, 100, 100, 101, 11, 11, 11, /* 66 */
3613
+ 46, 46, 16, 94, 16, 46, 16, 16, /* 66 */
3614
+ 102, 102, 103, 103, 96, 11, 11, 46, /* 66 */
3615
+ 2, 2, 2, 2, 2, 2, 2, 2, /* 67 */
3616
+ 2, 2, 2, 2, 104, 104, 104, 104, /* 67 */
3617
+ 8, 8, 8, 8, 8, 8, 3, 3, /* 67 */
3618
+ 5, 6, 5, 5, 5, 6, 5, 5, /* 67 */
3619
+ 3, 3, 3, 3, 3, 3, 3, 3, /* 67 */
3620
+ 105, 106, 104, 104, 104, 104, 104, 46, /* 67 */
3621
+ 3, 3, 3, 3, 3, 3, 3, 3, /* 67 */
3622
+ 3, 5, 6, 3, 3, 3, 3, 12, /* 67 */
3623
+ 12, 3, 3, 3, 7, 5, 6, 46, /* 68 */
3624
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 68 */
3625
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 68 */
3626
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 68 */
3627
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 68 */
3628
+ 46, 46, 104, 104, 104, 104, 104, 104, /* 68 */
3629
+ 17, 46, 46, 46, 17, 17, 17, 17, /* 68 */
3630
+ 17, 17, 7, 7, 7, 5, 6, 16, /* 68 */
3631
+ 107, 107, 107, 107, 107, 107, 107, 107, /* 69 */
3632
+ 107, 107, 7, 7, 7, 5, 6, 46, /* 69 */
3633
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 69 */
3634
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 69 */
3635
+ 4, 4, 4, 4, 4, 4, 4, 4, /* 69 */
3636
+ 4, 4, 4, 4, 46, 46, 46, 46, /* 69 */
3637
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 69 */
3638
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 69 */
3639
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 70 */
3640
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 70 */
3641
+ 60, 60, 60, 60, 60, 60, 60, 60, /* 70 */
3642
+ 60, 60, 60, 60, 60, 79, 79, 79, /* 70 */
3643
+ 79, 60, 46, 46, 46, 46, 46, 46, /* 70 */
3644
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 70 */
3645
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 70 */
3646
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 70 */
3647
+ 15, 15, 38, 15, 15, 15, 15, 38, /* 71 */
3648
+ 15, 15, 16, 38, 38, 38, 16, 16, /* 71 */
3649
+ 38, 38, 38, 16, 15, 38, 15, 15, /* 71 */
3650
+ 38, 38, 38, 38, 38, 38, 15, 15, /* 71 */
3651
+ 15, 15, 15, 15, 38, 15, 38, 15, /* 71 */
3652
+ 38, 15, 38, 38, 38, 38, 16, 16, /* 71 */
3653
+ 38, 38, 15, 38, 16, 40, 40, 40, /* 71 */
3654
+ 40, 46, 46, 46, 46, 46, 46, 46, /* 71 */
3655
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 72 */
3656
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 72 */
3657
+ 46, 46, 46, 19, 19, 19, 19, 19, /* 72 */
3658
+ 19, 19, 19, 19, 19, 19, 19, 108, /* 72 */
3659
+ 109, 109, 109, 109, 109, 109, 109, 109, /* 72 */
3660
+ 109, 109, 109, 109, 110, 110, 110, 110, /* 72 */
3661
+ 111, 111, 111, 111, 111, 111, 111, 111, /* 72 */
3662
+ 111, 111, 111, 111, 112, 112, 112, 112, /* 72 */
3663
+ 113, 113, 113, 46, 46, 46, 46, 46, /* 73 */
3664
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 73 */
3665
+ 7, 7, 7, 7, 7, 15, 15, 15, /* 73 */
3666
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 73 */
3667
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 73 */
3668
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 73 */
3669
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 73 */
3670
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 73 */
3671
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 74 */
3672
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 74 */
3673
+ 15, 15, 7, 15, 7, 15, 15, 15, /* 74 */
3674
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 74 */
3675
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 74 */
3676
+ 15, 15, 15, 46, 46, 46, 46, 46, /* 74 */
3677
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 74 */
3678
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 74 */
3679
+ 7, 7, 7, 7, 7, 7, 7, 7, /* 75 */
3680
+ 7, 7, 7, 7, 7, 7, 7, 7, /* 75 */
3681
+ 7, 7, 7, 7, 7, 7, 7, 7, /* 75 */
3682
+ 7, 7, 7, 7, 7, 7, 7, 7, /* 75 */
3683
+ 7, 7, 7, 7, 7, 7, 7, 7, /* 75 */
3684
+ 7, 7, 7, 7, 7, 7, 7, 7, /* 75 */
3685
+ 7, 7, 7, 7, 7, 7, 7, 7, /* 75 */
3686
+ 7, 7, 7, 7, 7, 7, 7, 7, /* 75 */
3687
+ 7, 7, 7, 7, 7, 7, 7, 7, /* 76 */
3688
+ 7, 7, 7, 7, 7, 7, 7, 7, /* 76 */
3689
+ 7, 7, 7, 7, 7, 7, 7, 7, /* 76 */
3690
+ 7, 7, 7, 7, 7, 7, 7, 7, /* 76 */
3691
+ 7, 7, 7, 7, 7, 7, 7, 7, /* 76 */
3692
+ 7, 7, 7, 7, 7, 7, 7, 7, /* 76 */
3693
+ 7, 7, 46, 46, 46, 46, 46, 46, /* 76 */
3694
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 76 */
3695
+ 15, 46, 15, 15, 15, 15, 15, 15, /* 77 */
3696
+ 7, 7, 7, 7, 15, 15, 15, 15, /* 77 */
3697
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 77 */
3698
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 77 */
3699
+ 7, 7, 15, 15, 15, 15, 15, 15, /* 77 */
3700
+ 15, 5, 6, 15, 15, 15, 15, 15, /* 77 */
3701
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 77 */
3702
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 77 */
3703
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 78 */
3704
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 78 */
3705
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 78 */
3706
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 78 */
3707
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 78 */
3708
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 78 */
3709
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 78 */
3710
+ 15, 15, 15, 46, 46, 46, 46, 46, /* 78 */
3711
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 79 */
3712
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 79 */
3713
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 79 */
3714
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 79 */
3715
+ 15, 15, 15, 15, 15, 46, 46, 46, /* 79 */
3716
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 79 */
3717
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 79 */
3718
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 79 */
3719
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 80 */
3720
+ 15, 15, 15, 46, 46, 46, 46, 46, /* 80 */
3721
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 80 */
3722
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 80 */
3723
+ 114, 114, 114, 114, 114, 114, 114, 114, /* 80 */
3724
+ 114, 114, 114, 114, 114, 114, 114, 114, /* 80 */
3725
+ 114, 114, 114, 114, 82, 82, 82, 82, /* 80 */
3726
+ 82, 82, 82, 82, 82, 82, 82, 82, /* 80 */
3727
+ 82, 82, 82, 82, 82, 82, 82, 82, /* 81 */
3728
+ 115, 115, 115, 115, 115, 115, 115, 115, /* 81 */
3729
+ 115, 115, 115, 115, 115, 115, 115, 115, /* 81 */
3730
+ 115, 115, 115, 115, 15, 15, 15, 15, /* 81 */
3731
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 81 */
3732
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 81 */
3733
+ 15, 15, 15, 15, 15, 15, 116, 116, /* 81 */
3734
+ 116, 116, 116, 116, 116, 116, 116, 116, /* 81 */
3735
+ 116, 116, 116, 116, 116, 116, 116, 116, /* 82 */
3736
+ 116, 116, 116, 116, 116, 116, 116, 116, /* 82 */
3737
+ 117, 117, 117, 117, 117, 117, 117, 117, /* 82 */
3738
+ 117, 117, 117, 117, 117, 117, 117, 117, /* 82 */
3739
+ 117, 117, 117, 117, 117, 117, 117, 117, /* 82 */
3740
+ 117, 117, 118, 46, 46, 46, 46, 46, /* 82 */
3741
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 82 */
3742
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 82 */
3743
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 83 */
3744
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 83 */
3745
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 83 */
3746
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 83 */
3747
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 83 */
3748
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 83 */
3749
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 83 */
3750
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 83 */
3751
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 84 */
3752
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 84 */
3753
+ 15, 15, 15, 15, 15, 15, 46, 46, /* 84 */
3754
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 84 */
3755
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 84 */
3756
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 84 */
3757
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 84 */
3758
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 84 */
3759
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 85 */
3760
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 85 */
3761
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 85 */
3762
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 85 */
3763
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 85 */
3764
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 85 */
3765
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 85 */
3766
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 85 */
3767
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 86 */
3768
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 86 */
3769
+ 15, 15, 15, 15, 46, 46, 46, 46, /* 86 */
3770
+ 46, 46, 15, 15, 15, 15, 15, 15, /* 86 */
3771
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 86 */
3772
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 86 */
3773
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 86 */
3774
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 86 */
3775
+ 46, 15, 15, 15, 15, 46, 15, 15, /* 87 */
3776
+ 15, 15, 46, 46, 15, 15, 15, 15, /* 87 */
3777
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 87 */
3778
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 87 */
3779
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 87 */
3780
+ 46, 15, 15, 15, 15, 15, 15, 15, /* 87 */
3781
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 87 */
3782
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 87 */
3783
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 88 */
3784
+ 15, 15, 15, 15, 46, 15, 46, 15, /* 88 */
3785
+ 15, 15, 15, 46, 46, 46, 15, 46, /* 88 */
3786
+ 15, 15, 15, 15, 15, 15, 15, 46, /* 88 */
3787
+ 46, 15, 15, 15, 15, 15, 15, 15, /* 88 */
3788
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 88 */
3789
+ 46, 46, 46, 46, 46, 46, 119, 119, /* 88 */
3790
+ 119, 119, 119, 119, 119, 119, 119, 119, /* 88 */
3791
+ 114, 114, 114, 114, 114, 114, 114, 114, /* 89 */
3792
+ 114, 114, 83, 83, 83, 83, 83, 83, /* 89 */
3793
+ 83, 83, 83, 83, 15, 46, 46, 46, /* 89 */
3794
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 89 */
3795
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 89 */
3796
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 89 */
3797
+ 46, 15, 15, 15, 15, 15, 15, 15, /* 89 */
3798
+ 15, 15, 15, 15, 15, 15, 15, 46, /* 89 */
3799
+ 2, 3, 3, 3, 15, 59, 3, 120, /* 90 */
3800
+ 5, 6, 5, 6, 5, 6, 5, 6, /* 90 */
3801
+ 5, 6, 15, 15, 5, 6, 5, 6, /* 90 */
3802
+ 5, 6, 5, 6, 8, 5, 6, 5, /* 90 */
3803
+ 15, 121, 121, 121, 121, 121, 121, 121, /* 90 */
3804
+ 121, 121, 60, 60, 60, 60, 60, 60, /* 90 */
3805
+ 8, 59, 59, 59, 59, 59, 15, 15, /* 90 */
3806
+ 46, 46, 46, 46, 46, 46, 46, 15, /* 90 */
3807
+ 46, 40, 40, 40, 40, 40, 40, 40, /* 91 */
3808
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 91 */
3809
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 91 */
3810
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 91 */
3811
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 91 */
3812
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 91 */
3813
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 91 */
3814
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 91 */
3815
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 92 */
3816
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 92 */
3817
+ 40, 40, 40, 40, 40, 46, 46, 46, /* 92 */
3818
+ 46, 60, 60, 59, 59, 59, 59, 46, /* 92 */
3819
+ 46, 40, 40, 40, 40, 40, 40, 40, /* 92 */
3820
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 92 */
3821
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 92 */
3822
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 92 */
3823
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 93 */
3824
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 93 */
3825
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 93 */
3826
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 93 */
3827
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 93 */
3828
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 93 */
3829
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 93 */
3830
+ 40, 40, 40, 3, 59, 59, 59, 46, /* 93 */
3831
+ 46, 46, 46, 46, 46, 40, 40, 40, /* 94 */
3832
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 94 */
3833
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 94 */
3834
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 94 */
3835
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 94 */
3836
+ 40, 40, 40, 40, 40, 46, 46, 46, /* 94 */
3837
+ 46, 40, 40, 40, 40, 40, 40, 40, /* 94 */
3838
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 94 */
3839
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 95 */
3840
+ 40, 40, 40, 40, 40, 40, 40, 46, /* 95 */
3841
+ 15, 15, 85, 85, 85, 85, 15, 15, /* 95 */
3842
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 95 */
3843
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 95 */
3844
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 95 */
3845
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 95 */
3846
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 95 */
3847
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 96 */
3848
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 96 */
3849
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 96 */
3850
+ 15, 15, 15, 15, 15, 46, 46, 46, /* 96 */
3851
+ 85, 85, 85, 85, 85, 85, 85, 85, /* 96 */
3852
+ 85, 85, 15, 15, 15, 15, 15, 15, /* 96 */
3853
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 96 */
3854
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 96 */
3855
+ 15, 15, 15, 15, 46, 46, 46, 46, /* 97 */
3856
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 97 */
3857
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 97 */
3858
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 97 */
3859
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 97 */
3860
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 97 */
3861
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 97 */
3862
+ 15, 15, 15, 15, 46, 46, 46, 15, /* 97 */
3863
+ 114, 114, 114, 114, 114, 114, 114, 114, /* 98 */
3864
+ 114, 114, 15, 15, 15, 15, 15, 15, /* 98 */
3865
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 98 */
3866
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 98 */
3867
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 98 */
3868
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 98 */
3869
+ 15, 46, 46, 46, 46, 46, 46, 46, /* 98 */
3870
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 98 */
3871
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 99 */
3872
+ 15, 15, 15, 15, 46, 46, 46, 46, /* 99 */
3873
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 99 */
3874
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 99 */
3875
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 99 */
3876
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 99 */
3877
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 99 */
3878
+ 15, 15, 15, 15, 15, 15, 15, 46, /* 99 */
3879
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 100 */
3880
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 100 */
3881
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 100 */
3882
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 100 */
3883
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 100 */
3884
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 100 */
3885
+ 15, 15, 15, 15, 15, 15, 15, 46, /* 100 */
3886
+ 46, 46, 46, 15, 15, 15, 15, 15, /* 100 */
3887
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 101 */
3888
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 101 */
3889
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 101 */
3890
+ 15, 15, 15, 15, 15, 15, 46, 46, /* 101 */
3891
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 101 */
3892
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 101 */
3893
+ 15, 15, 15, 15, 15, 15, 15, 15, /* 101 */
3894
+ 15, 15, 15, 15, 15, 15, 15, 46, /* 101 */
3895
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 102 */
3896
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 102 */
3897
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 102 */
3898
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 102 */
3899
+ 40, 40, 40, 40, 40, 40, 46, 46, /* 102 */
3900
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 102 */
3901
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 102 */
3902
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 102 */
3903
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 103 */
3904
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 103 */
3905
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 103 */
3906
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 103 */
3907
+ 40, 40, 40, 40, 46, 46, 46, 46, /* 103 */
3908
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 103 */
3909
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 103 */
3910
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 103 */
3911
+ 122, 122, 122, 122, 122, 122, 122, 122, /* 104 */
3912
+ 122, 122, 122, 122, 122, 122, 122, 122, /* 104 */
3913
+ 122, 122, 122, 122, 122, 122, 122, 122, /* 104 */
3914
+ 122, 122, 122, 122, 122, 122, 122, 122, /* 104 */
3915
+ 122, 122, 122, 122, 122, 122, 122, 122, /* 104 */
3916
+ 122, 122, 122, 122, 122, 122, 122, 122, /* 104 */
3917
+ 122, 122, 122, 122, 122, 122, 122, 122, /* 104 */
3918
+ 122, 122, 122, 122, 122, 122, 122, 122, /* 104 */
3919
+ 123, 123, 123, 123, 123, 123, 123, 123, /* 105 */
3920
+ 123, 123, 123, 123, 123, 123, 123, 123, /* 105 */
3921
+ 123, 123, 123, 123, 123, 123, 123, 123, /* 105 */
3922
+ 123, 123, 123, 123, 123, 123, 123, 123, /* 105 */
3923
+ 123, 123, 123, 123, 123, 123, 123, 123, /* 105 */
3924
+ 123, 123, 123, 123, 123, 123, 123, 123, /* 105 */
3925
+ 123, 123, 123, 123, 123, 123, 123, 123, /* 105 */
3926
+ 123, 123, 123, 123, 123, 123, 123, 123, /* 105 */
3927
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 106 */
3928
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 106 */
3929
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 106 */
3930
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 106 */
3931
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 106 */
3932
+ 40, 40, 40, 40, 40, 40, 46, 46, /* 106 */
3933
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 106 */
3934
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 106 */
3935
+ 16, 16, 16, 16, 16, 16, 16, 46, /* 107 */
3936
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 107 */
3937
+ 46, 46, 46, 16, 16, 16, 16, 16, /* 107 */
3938
+ 46, 46, 46, 46, 46, 46, 60, 40, /* 107 */
3939
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 107 */
3940
+ 40, 7, 40, 40, 40, 40, 40, 40, /* 107 */
3941
+ 40, 40, 40, 40, 40, 40, 40, 46, /* 107 */
3942
+ 40, 40, 40, 40, 40, 46, 40, 46, /* 107 */
3943
+ 40, 40, 46, 40, 40, 46, 40, 40, /* 108 */
3944
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 108 */
3945
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 108 */
3946
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 108 */
3947
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 108 */
3948
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 108 */
3949
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 108 */
3950
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 108 */
3951
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 109 */
3952
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 109 */
3953
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 109 */
3954
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 109 */
3955
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 109 */
3956
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 109 */
3957
+ 40, 40, 46, 46, 46, 46, 46, 46, /* 109 */
3958
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 109 */
3959
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 110 */
3960
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 110 */
3961
+ 46, 46, 46, 40, 40, 40, 40, 40, /* 110 */
3962
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 110 */
3963
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 110 */
3964
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 110 */
3965
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 110 */
3966
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 110 */
3967
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 111 */
3968
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 111 */
3969
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 111 */
3970
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 111 */
3971
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 111 */
3972
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 111 */
3973
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 111 */
3974
+ 40, 40, 40, 40, 40, 40, 5, 6, /* 111 */
3975
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 112 */
3976
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 112 */
3977
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 112 */
3978
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 112 */
3979
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 112 */
3980
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 112 */
3981
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 112 */
3982
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 112 */
3983
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 113 */
3984
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 113 */
3985
+ 46, 46, 40, 40, 40, 40, 40, 40, /* 113 */
3986
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 113 */
3987
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 113 */
3988
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 113 */
3989
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 113 */
3990
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 113 */
3991
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 114 */
3992
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 114 */
3993
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 114 */
3994
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 114 */
3995
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 114 */
3996
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 114 */
3997
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 114 */
3998
+ 40, 40, 40, 40, 46, 46, 46, 46, /* 114 */
3999
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 115 */
4000
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 115 */
4001
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 115 */
4002
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 115 */
4003
+ 60, 60, 60, 60, 46, 46, 46, 46, /* 115 */
4004
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 115 */
4005
+ 3, 8, 8, 12, 12, 5, 6, 5, /* 115 */
4006
+ 6, 5, 6, 5, 6, 5, 6, 5, /* 115 */
4007
+ 6, 5, 6, 5, 6, 46, 46, 46, /* 116 */
4008
+ 46, 3, 3, 3, 3, 12, 12, 12, /* 116 */
4009
+ 3, 3, 3, 46, 3, 3, 3, 3, /* 116 */
4010
+ 8, 5, 6, 5, 6, 5, 6, 3, /* 116 */
4011
+ 3, 3, 7, 8, 7, 7, 7, 46, /* 116 */
4012
+ 3, 4, 3, 3, 46, 46, 46, 46, /* 116 */
4013
+ 40, 40, 40, 46, 40, 46, 40, 40, /* 116 */
4014
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 116 */
4015
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 117 */
4016
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 117 */
4017
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 117 */
4018
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 117 */
4019
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 117 */
4020
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 117 */
4021
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 117 */
4022
+ 40, 40, 40, 40, 40, 46, 46, 104, /* 117 */
4023
+ 46, 3, 3, 3, 4, 3, 3, 3, /* 118 */
4024
+ 5, 6, 3, 7, 3, 8, 3, 3, /* 118 */
4025
+ 9, 9, 9, 9, 9, 9, 9, 9, /* 118 */
4026
+ 9, 9, 3, 3, 7, 7, 7, 3, /* 118 */
4027
+ 3, 10, 10, 10, 10, 10, 10, 10, /* 118 */
4028
+ 10, 10, 10, 10, 10, 10, 10, 10, /* 118 */
4029
+ 10, 10, 10, 10, 10, 10, 10, 10, /* 118 */
4030
+ 10, 10, 10, 5, 3, 6, 11, 12, /* 118 */
4031
+ 11, 13, 13, 13, 13, 13, 13, 13, /* 119 */
4032
+ 13, 13, 13, 13, 13, 13, 13, 13, /* 119 */
4033
+ 13, 13, 13, 13, 13, 13, 13, 13, /* 119 */
4034
+ 13, 13, 13, 5, 7, 6, 7, 46, /* 119 */
4035
+ 46, 3, 5, 6, 3, 3, 40, 40, /* 119 */
4036
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 119 */
4037
+ 59, 40, 40, 40, 40, 40, 40, 40, /* 119 */
4038
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 119 */
4039
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 120 */
4040
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 120 */
4041
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 120 */
4042
+ 40, 40, 40, 40, 40, 40, 59, 59, /* 120 */
4043
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 120 */
4044
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 120 */
4045
+ 40, 40, 40, 40, 40, 40, 40, 40, /* 120 */
4046
+ 40, 40, 40, 40, 40, 40, 40, 46, /* 120 */
4047
+ 46, 46, 40, 40, 40, 40, 40, 40, /* 121 */
4048
+ 46, 46, 40, 40, 40, 40, 40, 40, /* 121 */
4049
+ 46, 46, 40, 40, 40, 40, 40, 40, /* 121 */
4050
+ 46, 46, 40, 40, 40, 46, 46, 46, /* 121 */
4051
+ 4, 4, 7, 11, 15, 4, 4, 46, /* 121 */
4052
+ 7, 7, 7, 7, 7, 15, 15, 46, /* 121 */
4053
+ 46, 46, 46, 46, 46, 46, 46, 46, /* 121 */
4054
+ 46, 46, 46, 46, 46, 15, 46, 46 /* 121 */
4055
+ };
4056
+
4057
+ /* The A table has 124 entries for a total of 496 bytes. */
4058
+
4059
+ const uint32 js_A[] = {
4060
+ 0x0001000F, /* 0 Cc, ignorable */
4061
+ 0x0004000F, /* 1 Cc, whitespace */
4062
+ 0x0004000C, /* 2 Zs, whitespace */
4063
+ 0x00000018, /* 3 Po */
4064
+ 0x0006001A, /* 4 Sc, currency */
4065
+ 0x00000015, /* 5 Ps */
4066
+ 0x00000016, /* 6 Pe */
4067
+ 0x00000019, /* 7 Sm */
4068
+ 0x00000014, /* 8 Pd */
4069
+ 0x00036009, /* 9 Nd, identifier part, decimal 16 */
4070
+ 0x0827FE01, /* 10 Lu, hasLower (add 32), identifier start, supradecimal 31 */
4071
+ 0x0000001B, /* 11 Sk */
4072
+ 0x00050017, /* 12 Pc, underscore */
4073
+ 0x0817FE02, /* 13 Ll, hasUpper (subtract 32), identifier start, supradecimal 31 */
4074
+ 0x0000000C, /* 14 Zs */
4075
+ 0x0000001C, /* 15 So */
4076
+ 0x00070002, /* 16 Ll, identifier start */
4077
+ 0x0000600B, /* 17 No, decimal 16 */
4078
+ 0x0000500B, /* 18 No, decimal 8 */
4079
+ 0x0000800B, /* 19 No, strange */
4080
+ 0x08270001, /* 20 Lu, hasLower (add 32), identifier start */
4081
+ 0x08170002, /* 21 Ll, hasUpper (subtract 32), identifier start */
4082
+ 0xE1D70002, /* 22 Ll, hasUpper (subtract -121), identifier start */
4083
+ 0x00670001, /* 23 Lu, hasLower (add 1), identifier start */
4084
+ 0x00570002, /* 24 Ll, hasUpper (subtract 1), identifier start */
4085
+ 0xCE670001, /* 25 Lu, hasLower (add -199), identifier start */
4086
+ 0x3A170002, /* 26 Ll, hasUpper (subtract 232), identifier start */
4087
+ 0xE1E70001, /* 27 Lu, hasLower (add -121), identifier start */
4088
+ 0x4B170002, /* 28 Ll, hasUpper (subtract 300), identifier start */
4089
+ 0x34A70001, /* 29 Lu, hasLower (add 210), identifier start */
4090
+ 0x33A70001, /* 30 Lu, hasLower (add 206), identifier start */
4091
+ 0x33670001, /* 31 Lu, hasLower (add 205), identifier start */
4092
+ 0x32A70001, /* 32 Lu, hasLower (add 202), identifier start */
4093
+ 0x32E70001, /* 33 Lu, hasLower (add 203), identifier start */
4094
+ 0x33E70001, /* 34 Lu, hasLower (add 207), identifier start */
4095
+ 0x34E70001, /* 35 Lu, hasLower (add 211), identifier start */
4096
+ 0x34670001, /* 36 Lu, hasLower (add 209), identifier start */
4097
+ 0x35670001, /* 37 Lu, hasLower (add 213), identifier start */
4098
+ 0x00070001, /* 38 Lu, identifier start */
4099
+ 0x36A70001, /* 39 Lu, hasLower (add 218), identifier start */
4100
+ 0x00070005, /* 40 Lo, identifier start */
4101
+ 0x36670001, /* 41 Lu, hasLower (add 217), identifier start */
4102
+ 0x36E70001, /* 42 Lu, hasLower (add 219), identifier start */
4103
+ 0x00AF0001, /* 43 Lu, hasLower (add 2), hasTitle, identifier start */
4104
+ 0x007F0003, /* 44 Lt, hasUpper (subtract 1), hasLower (add 1), hasTitle, identifier start */
4105
+ 0x009F0002, /* 45 Ll, hasUpper (subtract 2), hasTitle, identifier start */
4106
+ 0x00000000, /* 46 unassigned */
4107
+ 0x34970002, /* 47 Ll, hasUpper (subtract 210), identifier start */
4108
+ 0x33970002, /* 48 Ll, hasUpper (subtract 206), identifier start */
4109
+ 0x33570002, /* 49 Ll, hasUpper (subtract 205), identifier start */
4110
+ 0x32970002, /* 50 Ll, hasUpper (subtract 202), identifier start */
4111
+ 0x32D70002, /* 51 Ll, hasUpper (subtract 203), identifier start */
4112
+ 0x33D70002, /* 52 Ll, hasUpper (subtract 207), identifier start */
4113
+ 0x34570002, /* 53 Ll, hasUpper (subtract 209), identifier start */
4114
+ 0x34D70002, /* 54 Ll, hasUpper (subtract 211), identifier start */
4115
+ 0x35570002, /* 55 Ll, hasUpper (subtract 213), identifier start */
4116
+ 0x36970002, /* 56 Ll, hasUpper (subtract 218), identifier start */
4117
+ 0x36570002, /* 57 Ll, hasUpper (subtract 217), identifier start */
4118
+ 0x36D70002, /* 58 Ll, hasUpper (subtract 219), identifier start */
4119
+ 0x00070004, /* 59 Lm, identifier start */
4120
+ 0x00030006, /* 60 Mn, identifier part */
4121
+ 0x09A70001, /* 61 Lu, hasLower (add 38), identifier start */
4122
+ 0x09670001, /* 62 Lu, hasLower (add 37), identifier start */
4123
+ 0x10270001, /* 63 Lu, hasLower (add 64), identifier start */
4124
+ 0x0FE70001, /* 64 Lu, hasLower (add 63), identifier start */
4125
+ 0x09970002, /* 65 Ll, hasUpper (subtract 38), identifier start */
4126
+ 0x09570002, /* 66 Ll, hasUpper (subtract 37), identifier start */
4127
+ 0x10170002, /* 67 Ll, hasUpper (subtract 64), identifier start */
4128
+ 0x0FD70002, /* 68 Ll, hasUpper (subtract 63), identifier start */
4129
+ 0x0F970002, /* 69 Ll, hasUpper (subtract 62), identifier start */
4130
+ 0x0E570002, /* 70 Ll, hasUpper (subtract 57), identifier start */
4131
+ 0x0BD70002, /* 71 Ll, hasUpper (subtract 47), identifier start */
4132
+ 0x0D970002, /* 72 Ll, hasUpper (subtract 54), identifier start */
4133
+ 0x15970002, /* 73 Ll, hasUpper (subtract 86), identifier start */
4134
+ 0x14170002, /* 74 Ll, hasUpper (subtract 80), identifier start */
4135
+ 0x14270001, /* 75 Lu, hasLower (add 80), identifier start */
4136
+ 0x0C270001, /* 76 Lu, hasLower (add 48), identifier start */
4137
+ 0x0C170002, /* 77 Ll, hasUpper (subtract 48), identifier start */
4138
+ 0x00034009, /* 78 Nd, identifier part, decimal 0 */
4139
+ 0x00000007, /* 79 Me */
4140
+ 0x00030008, /* 80 Mc, identifier part */
4141
+ 0x00037409, /* 81 Nd, identifier part, decimal 26 */
4142
+ 0x00005A0B, /* 82 No, decimal 13 */
4143
+ 0x00006E0B, /* 83 No, decimal 23 */
4144
+ 0x0000740B, /* 84 No, decimal 26 */
4145
+ 0x0000000B, /* 85 No */
4146
+ 0xFE170002, /* 86 Ll, hasUpper (subtract -8), identifier start */
4147
+ 0xFE270001, /* 87 Lu, hasLower (add -8), identifier start */
4148
+ 0xED970002, /* 88 Ll, hasUpper (subtract -74), identifier start */
4149
+ 0xEA970002, /* 89 Ll, hasUpper (subtract -86), identifier start */
4150
+ 0xE7170002, /* 90 Ll, hasUpper (subtract -100), identifier start */
4151
+ 0xE0170002, /* 91 Ll, hasUpper (subtract -128), identifier start */
4152
+ 0xE4170002, /* 92 Ll, hasUpper (subtract -112), identifier start */
4153
+ 0xE0970002, /* 93 Ll, hasUpper (subtract -126), identifier start */
4154
+ 0xFDD70002, /* 94 Ll, hasUpper (subtract -9), identifier start */
4155
+ 0xEDA70001, /* 95 Lu, hasLower (add -74), identifier start */
4156
+ 0xFDE70001, /* 96 Lu, hasLower (add -9), identifier start */
4157
+ 0xEAA70001, /* 97 Lu, hasLower (add -86), identifier start */
4158
+ 0xE7270001, /* 98 Lu, hasLower (add -100), identifier start */
4159
+ 0xFE570002, /* 99 Ll, hasUpper (subtract -7), identifier start */
4160
+ 0xE4270001, /* 100 Lu, hasLower (add -112), identifier start */
4161
+ 0xFE670001, /* 101 Lu, hasLower (add -7), identifier start */
4162
+ 0xE0270001, /* 102 Lu, hasLower (add -128), identifier start */
4163
+ 0xE0A70001, /* 103 Lu, hasLower (add -126), identifier start */
4164
+ 0x00010010, /* 104 Cf, ignorable */
4165
+ 0x0004000D, /* 105 Zl, whitespace */
4166
+ 0x0004000E, /* 106 Zp, whitespace */
4167
+ 0x0000400B, /* 107 No, decimal 0 */
4168
+ 0x0000440B, /* 108 No, decimal 2 */
4169
+ 0x0427420A, /* 109 Nl, hasLower (add 16), identifier start, decimal 1 */
4170
+ 0x0427800A, /* 110 Nl, hasLower (add 16), identifier start, strange */
4171
+ 0x0417620A, /* 111 Nl, hasUpper (subtract 16), identifier start, decimal 17 */
4172
+ 0x0417800A, /* 112 Nl, hasUpper (subtract 16), identifier start, strange */
4173
+ 0x0007800A, /* 113 Nl, identifier start, strange */
4174
+ 0x0000420B, /* 114 No, decimal 1 */
4175
+ 0x0000720B, /* 115 No, decimal 25 */
4176
+ 0x06A0001C, /* 116 So, hasLower (add 26) */
4177
+ 0x0690001C, /* 117 So, hasUpper (subtract 26) */
4178
+ 0x00006C0B, /* 118 No, decimal 22 */
4179
+ 0x0000560B, /* 119 No, decimal 11 */
4180
+ 0x0007720A, /* 120 Nl, identifier start, decimal 25 */
4181
+ 0x0007400A, /* 121 Nl, identifier start, decimal 0 */
4182
+ 0x00000013, /* 122 Cs */
4183
+ 0x00000012 /* 123 Co */
4184
+ };
4185
+
4186
+ const jschar js_uriReservedPlusPound_ucstr[] =
4187
+ {';', '/', '?', ':', '@', '&', '=', '+', '$', ',', '#', 0};
4188
+ const jschar js_uriUnescaped_ucstr[] =
4189
+ {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
4190
+ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
4191
+ 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
4192
+ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
4193
+ 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
4194
+ '-', '_', '.', '!', '~', '*', '\'', '(', ')', 0};
4195
+
4196
+ #define URI_CHUNK 64U
4197
+
4198
+ /* Concatenate jschars onto an unshared/newborn JSString. */
4199
+ static JSBool
4200
+ AddCharsToURI(JSContext *cx, JSString *str, const jschar *chars, size_t length)
4201
+ {
4202
+ size_t total;
4203
+
4204
+ JS_ASSERT(!JSSTRING_IS_DEPENDENT(str));
4205
+ total = str->length + length + 1;
4206
+ if (!str->chars ||
4207
+ JS_HOWMANY(total, URI_CHUNK) > JS_HOWMANY(str->length + 1, URI_CHUNK)) {
4208
+ total = JS_ROUNDUP(total, URI_CHUNK);
4209
+ str->chars = JS_realloc(cx, str->chars, total * sizeof(jschar));
4210
+ if (!str->chars)
4211
+ return JS_FALSE;
4212
+ }
4213
+ js_strncpy(str->chars + str->length, chars, length);
4214
+ str->length += length;
4215
+ str->chars[str->length] = 0;
4216
+ return JS_TRUE;
4217
+ }
4218
+
4219
+ /*
4220
+ * ECMA 3, 15.1.3 URI Handling Function Properties
4221
+ *
4222
+ * The following are implementations of the algorithms
4223
+ * given in the ECMA specification for the hidden functions
4224
+ * 'Encode' and 'Decode'.
4225
+ */
4226
+ static JSBool
4227
+ Encode(JSContext *cx, JSString *str, const jschar *unescapedSet,
4228
+ const jschar *unescapedSet2, jsval *rval)
4229
+ {
4230
+ size_t length, j, k, L;
4231
+ jschar *chars, C, C2;
4232
+ uint32 V;
4233
+ uint8 utf8buf[6];
4234
+ jschar hexBuf[4];
4235
+ static const char HexDigits[] = "0123456789ABCDEF"; /* NB: uppercase */
4236
+ JSString *R;
4237
+
4238
+ R = js_NewString(cx, NULL, 0, 0);
4239
+ if (!R)
4240
+ return JS_FALSE;
4241
+
4242
+ hexBuf[0] = '%';
4243
+ hexBuf[3] = 0;
4244
+ chars = JSSTRING_CHARS(str);
4245
+ length = JSSTRING_LENGTH(str);
4246
+ for (k = 0; k < length; k++) {
4247
+ C = chars[k];
4248
+ if (js_strchr(unescapedSet, C) ||
4249
+ (unescapedSet2 && js_strchr(unescapedSet2, C))) {
4250
+ if (!AddCharsToURI(cx, R, &C, 1))
4251
+ return JS_FALSE;
4252
+ } else {
4253
+ if ((C >= 0xDC00) && (C <= 0xDFFF)) {
4254
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
4255
+ JSMSG_BAD_URI, NULL);
4256
+ return JS_FALSE;
4257
+ }
4258
+ if (C < 0xD800 || C > 0xDBFF) {
4259
+ V = C;
4260
+ } else {
4261
+ k++;
4262
+ if (k == length) {
4263
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
4264
+ JSMSG_BAD_URI, NULL);
4265
+ return JS_FALSE;
4266
+ }
4267
+ C2 = chars[k];
4268
+ if ((C2 < 0xDC00) || (C2 > 0xDFFF)) {
4269
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL,
4270
+ JSMSG_BAD_URI, NULL);
4271
+ return JS_FALSE;
4272
+ }
4273
+ V = ((C - 0xD800) << 10) + (C2 - 0xDC00) + 0x10000;
4274
+ }
4275
+ L = OneUcs4ToUtf8Char(utf8buf, V);
4276
+ for (j = 0; j < L; j++) {
4277
+ hexBuf[1] = HexDigits[utf8buf[j] >> 4];
4278
+ hexBuf[2] = HexDigits[utf8buf[j] & 0xf];
4279
+ if (!AddCharsToURI(cx, R, hexBuf, 3))
4280
+ return JS_FALSE;
4281
+ }
4282
+ }
4283
+ }
4284
+
4285
+ /*
4286
+ * Shrinking realloc can fail (e.g., with a BSD-style allocator), but we
4287
+ * don't worry about that case here. Worst case, R hangs onto URI_CHUNK-1
4288
+ * more jschars than it needs.
4289
+ */
4290
+ chars = (jschar *) JS_realloc(cx, R->chars, (R->length+1) * sizeof(jschar));
4291
+ if (chars)
4292
+ R->chars = chars;
4293
+ *rval = STRING_TO_JSVAL(R);
4294
+ return JS_TRUE;
4295
+ }
4296
+
4297
+ static JSBool
4298
+ Decode(JSContext *cx, JSString *str, const jschar *reservedSet, jsval *rval)
4299
+ {
4300
+ size_t length, start, k;
4301
+ jschar *chars, C, H;
4302
+ uint32 V;
4303
+ jsuint B;
4304
+ uint8 octets[6];
4305
+ JSString *R;
4306
+ intN j, n;
4307
+
4308
+ R = js_NewString(cx, NULL, 0, 0);
4309
+ if (!R)
4310
+ return JS_FALSE;
4311
+
4312
+ chars = JSSTRING_CHARS(str);
4313
+ length = JSSTRING_LENGTH(str);
4314
+ for (k = 0; k < length; k++) {
4315
+ C = chars[k];
4316
+ if (C == '%') {
4317
+ start = k;
4318
+ if ((k + 2) >= length)
4319
+ goto bad;
4320
+ if (!JS7_ISHEX(chars[k+1]) || !JS7_ISHEX(chars[k+2]))
4321
+ goto bad;
4322
+ B = JS7_UNHEX(chars[k+1]) * 16 + JS7_UNHEX(chars[k+2]);
4323
+ k += 2;
4324
+ if (!(B & 0x80)) {
4325
+ C = (jschar)B;
4326
+ } else {
4327
+ n = 1;
4328
+ while (B & (0x80 >> n))
4329
+ n++;
4330
+ if (n == 1 || n > 6)
4331
+ goto bad;
4332
+ octets[0] = (uint8)B;
4333
+ if (k + 3 * (n - 1) >= length)
4334
+ goto bad;
4335
+ for (j = 1; j < n; j++) {
4336
+ k++;
4337
+ if (chars[k] != '%')
4338
+ goto bad;
4339
+ if (!JS7_ISHEX(chars[k+1]) || !JS7_ISHEX(chars[k+2]))
4340
+ goto bad;
4341
+ B = JS7_UNHEX(chars[k+1]) * 16 + JS7_UNHEX(chars[k+2]);
4342
+ if ((B & 0xC0) != 0x80)
4343
+ goto bad;
4344
+ k += 2;
4345
+ octets[j] = (char)B;
4346
+ }
4347
+ V = Utf8ToOneUcs4Char(octets, n);
4348
+ if (V >= 0x10000) {
4349
+ V -= 0x10000;
4350
+ if (V > 0xFFFFF)
4351
+ goto bad;
4352
+ C = (jschar)((V & 0x3FF) + 0xDC00);
4353
+ H = (jschar)((V >> 10) + 0xD800);
4354
+ if (!AddCharsToURI(cx, R, &H, 1))
4355
+ return JS_FALSE;
4356
+ } else {
4357
+ C = (jschar)V;
4358
+ }
4359
+ }
4360
+ if (js_strchr(reservedSet, C)) {
4361
+ if (!AddCharsToURI(cx, R, &chars[start], (k - start + 1)))
4362
+ return JS_FALSE;
4363
+ } else {
4364
+ if (!AddCharsToURI(cx, R, &C, 1))
4365
+ return JS_FALSE;
4366
+ }
4367
+ } else {
4368
+ if (!AddCharsToURI(cx, R, &C, 1))
4369
+ return JS_FALSE;
4370
+ }
4371
+ }
4372
+
4373
+ /*
4374
+ * Shrinking realloc can fail (e.g., with a BSD-style allocator), but we
4375
+ * don't worry about that case here. Worst case, R hangs onto URI_CHUNK-1
4376
+ * more jschars than it needs.
4377
+ */
4378
+ chars = (jschar *) JS_realloc(cx, R->chars, (R->length+1) * sizeof(jschar));
4379
+ if (chars)
4380
+ R->chars = chars;
4381
+ *rval = STRING_TO_JSVAL(R);
4382
+ return JS_TRUE;
4383
+
4384
+ bad:
4385
+ JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_BAD_URI);
4386
+ return JS_FALSE;
4387
+ }
4388
+
4389
+ static JSBool
4390
+ str_decodeURI(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
4391
+ jsval *rval)
4392
+ {
4393
+ JSString *str;
4394
+
4395
+ str = js_ValueToString(cx, argv[0]);
4396
+ if (!str)
4397
+ return JS_FALSE;
4398
+ return Decode(cx, str, js_uriReservedPlusPound_ucstr, rval);
4399
+ }
4400
+
4401
+ static JSBool
4402
+ str_decodeURI_Component(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
4403
+ jsval *rval)
4404
+ {
4405
+ JSString *str;
4406
+
4407
+ str = js_ValueToString(cx, argv[0]);
4408
+ if (!str)
4409
+ return JS_FALSE;
4410
+ return Decode(cx, str, js_empty_ucstr, rval);
4411
+ }
4412
+
4413
+ static JSBool
4414
+ str_encodeURI(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
4415
+ jsval *rval)
4416
+ {
4417
+ JSString *str;
4418
+
4419
+ str = js_ValueToString(cx, argv[0]);
4420
+ if (!str)
4421
+ return JS_FALSE;
4422
+ return Encode(cx, str, js_uriReservedPlusPound_ucstr, js_uriUnescaped_ucstr,
4423
+ rval);
4424
+ }
4425
+
4426
+ static JSBool
4427
+ str_encodeURI_Component(JSContext *cx, JSObject *obj, uintN argc, jsval *argv,
4428
+ jsval *rval)
4429
+ {
4430
+ JSString *str;
4431
+
4432
+ str = js_ValueToString(cx, argv[0]);
4433
+ if (!str)
4434
+ return JS_FALSE;
4435
+ return Encode(cx, str, js_uriUnescaped_ucstr, NULL, rval);
4436
+ }
4437
+
4438
+ /*
4439
+ * Convert one UCS-4 char and write it into a UTF-8 buffer, which must be at
4440
+ * least 6 bytes long. Return the number of UTF-8 bytes of data written.
4441
+ */
4442
+ static int
4443
+ OneUcs4ToUtf8Char(uint8 *utf8Buffer, uint32 ucs4Char)
4444
+ {
4445
+ int utf8Length = 1;
4446
+
4447
+ JS_ASSERT(ucs4Char <= 0x7FFFFFFF);
4448
+ if (ucs4Char < 0x80) {
4449
+ *utf8Buffer = (uint8)ucs4Char;
4450
+ } else {
4451
+ int i;
4452
+ uint32 a = ucs4Char >> 11;
4453
+ utf8Length = 2;
4454
+ while (a) {
4455
+ a >>= 5;
4456
+ utf8Length++;
4457
+ }
4458
+ i = utf8Length;
4459
+ while (--i) {
4460
+ utf8Buffer[i] = (uint8)((ucs4Char & 0x3F) | 0x80);
4461
+ ucs4Char >>= 6;
4462
+ }
4463
+ *utf8Buffer = (uint8)(0x100 - (1 << (8-utf8Length)) + ucs4Char);
4464
+ }
4465
+ return utf8Length;
4466
+ }
4467
+
4468
+ /*
4469
+ * Convert a utf8 character sequence into a UCS-4 character and return that
4470
+ * character. It is assumed that the caller already checked that the sequence
4471
+ * is valid.
4472
+ */
4473
+ static uint32
4474
+ Utf8ToOneUcs4Char(const uint8 *utf8Buffer, int utf8Length)
4475
+ {
4476
+ uint32 ucs4Char;
4477
+ uint32 minucs4Char;
4478
+ /* from Unicode 3.1, non-shortest form is illegal */
4479
+ static const uint32 minucs4Table[] = {
4480
+ 0x00000080, 0x00000800, 0x0001000, 0x0020000, 0x0400000
4481
+ };
4482
+
4483
+ JS_ASSERT(utf8Length >= 1 && utf8Length <= 6);
4484
+ if (utf8Length == 1) {
4485
+ ucs4Char = *utf8Buffer;
4486
+ JS_ASSERT(!(ucs4Char & 0x80));
4487
+ } else {
4488
+ JS_ASSERT((*utf8Buffer & (0x100 - (1 << (7-utf8Length)))) ==
4489
+ (0x100 - (1 << (8-utf8Length))));
4490
+ ucs4Char = *utf8Buffer++ & ((1<<(7-utf8Length))-1);
4491
+ minucs4Char = minucs4Table[utf8Length-2];
4492
+ while (--utf8Length) {
4493
+ JS_ASSERT((*utf8Buffer & 0xC0) == 0x80);
4494
+ ucs4Char = ucs4Char<<6 | (*utf8Buffer++ & 0x3F);
4495
+ }
4496
+ if (ucs4Char < minucs4Char ||
4497
+ ucs4Char == 0xFFFE || ucs4Char == 0xFFFF) {
4498
+ ucs4Char = 0xFFFD;
4499
+ }
4500
+ }
4501
+ return ucs4Char;
4502
+ }