distil 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }