@port-labs/jq-node-bindings 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/binding.gyp +3 -3
  2. package/configure +8 -6
  3. package/deps/jq/.travis.yml +184 -35
  4. package/deps/jq/AUTHORS +31 -30
  5. package/deps/jq/COPYING +2 -2
  6. package/deps/jq/KEYS +8 -0
  7. package/deps/jq/Makefile.am +85 -70
  8. package/deps/jq/NEWS +5 -4
  9. package/deps/jq/README.md +18 -9
  10. package/deps/jq/appveyor.yml +53 -0
  11. package/deps/jq/compile-ios.sh +5 -5
  12. package/deps/jq/config/m4/check-math-func.m4 +7 -2
  13. package/deps/jq/configure.ac +130 -68
  14. package/deps/jq/docs/Rakefile +14 -135
  15. package/deps/jq/docs/Rakefile.manual +49 -0
  16. package/deps/jq/docs/Rakefile.website +76 -0
  17. package/deps/jq/docs/content/2.download/default.yml +115 -39
  18. package/deps/jq/docs/content/3.manual/manual.yml +641 -231
  19. package/deps/jq/docs/content/3.manual/v1.3/manual.yml +130 -130
  20. package/deps/jq/docs/content/3.manual/v1.4/manual.yml +160 -160
  21. package/deps/jq/docs/content/3.manual/v1.5/manual.yml +2878 -0
  22. package/deps/jq/docs/content/3.manual/v1.6/manual.yml +3287 -0
  23. package/deps/jq/docs/content/index/index.yml +28 -6
  24. package/deps/jq/docs/public/.htaccess +2 -2
  25. package/deps/jq/docs/public/css/base.scss +141 -59
  26. package/deps/jq/docs/public/js/manual-search.js +52 -0
  27. package/deps/jq/docs/site.yml +1 -10
  28. package/deps/jq/docs/templates/default.liquid +10 -10
  29. package/deps/jq/docs/templates/index.liquid +45 -32
  30. package/deps/jq/docs/templates/manual.liquid +67 -90
  31. package/deps/jq/docs/templates/shared/_footer.liquid +10 -5
  32. package/deps/jq/docs/templates/shared/_head.liquid +17 -12
  33. package/deps/jq/docs/templates/shared/_navbar.liquid +27 -0
  34. package/deps/jq/jq.1.prebuilt +523 -139
  35. package/deps/jq/modules/oniguruma/AUTHORS +1 -0
  36. package/deps/jq/modules/oniguruma/CMakeLists.txt +86 -0
  37. package/deps/jq/modules/oniguruma/COPYING +28 -0
  38. package/deps/jq/modules/oniguruma/ChangeLog +0 -0
  39. package/deps/jq/modules/oniguruma/HISTORY +2138 -0
  40. package/deps/jq/modules/oniguruma/Makefile.am +33 -0
  41. package/deps/jq/modules/oniguruma/NEWS +0 -0
  42. package/deps/jq/modules/oniguruma/README +189 -0
  43. package/deps/jq/modules/oniguruma/README.ja +195 -0
  44. package/deps/jq/modules/oniguruma/README.md +203 -0
  45. package/deps/jq/modules/oniguruma/cmake/dist.cmake +321 -0
  46. package/deps/jq/modules/oniguruma/compile +348 -0
  47. package/deps/jq/modules/oniguruma/config.guess +1754 -0
  48. package/deps/jq/modules/oniguruma/config.sub +1890 -0
  49. package/deps/jq/modules/oniguruma/configure.ac +87 -0
  50. package/deps/jq/modules/oniguruma/contributed/libfuzzer-onig.cpp +31 -0
  51. package/deps/jq/modules/oniguruma/depcomp +791 -0
  52. package/deps/jq/modules/oniguruma/dist.info +10 -0
  53. package/deps/jq/modules/oniguruma/doc/API +660 -0
  54. package/deps/jq/modules/oniguruma/doc/API.ja +667 -0
  55. package/deps/jq/modules/oniguruma/doc/FAQ +12 -0
  56. package/deps/jq/modules/oniguruma/doc/FAQ.ja +22 -0
  57. package/deps/jq/modules/oniguruma/doc/RE +436 -0
  58. package/deps/jq/modules/oniguruma/doc/RE.ja +448 -0
  59. package/deps/jq/modules/oniguruma/doc/UNICODE_PROPERTIES +698 -0
  60. package/deps/jq/modules/oniguruma/index.html +181 -0
  61. package/deps/jq/modules/oniguruma/index_ja.html +184 -0
  62. package/deps/jq/modules/oniguruma/install-sh +541 -0
  63. package/deps/jq/modules/oniguruma/m4/.whatever +0 -0
  64. package/deps/jq/modules/oniguruma/make_win32.bat +3 -0
  65. package/deps/jq/modules/oniguruma/make_win64.bat +3 -0
  66. package/deps/jq/modules/oniguruma/missing +215 -0
  67. package/deps/jq/modules/oniguruma/onig-config.in +78 -0
  68. package/deps/jq/modules/oniguruma/oniguruma.pc.cmake.in +13 -0
  69. package/deps/jq/modules/oniguruma/oniguruma.pc.in +14 -0
  70. package/deps/jq/modules/oniguruma/sample/CMakeLists.txt +28 -0
  71. package/deps/jq/modules/oniguruma/sample/Makefile.am +34 -0
  72. package/deps/jq/modules/oniguruma/sample/bug_fix.c +131 -0
  73. package/deps/jq/modules/oniguruma/sample/crnl.c +127 -0
  74. package/deps/jq/modules/oniguruma/sample/encode.c +308 -0
  75. package/deps/jq/modules/oniguruma/sample/listcap.c +110 -0
  76. package/deps/jq/modules/oniguruma/sample/names.c +75 -0
  77. package/deps/jq/modules/oniguruma/sample/posix.c +96 -0
  78. package/deps/jq/modules/oniguruma/sample/scan.c +88 -0
  79. package/deps/jq/modules/oniguruma/sample/simple.c +59 -0
  80. package/deps/jq/modules/oniguruma/sample/sql.c +76 -0
  81. package/deps/jq/modules/oniguruma/sample/syntax.c +76 -0
  82. package/deps/jq/modules/oniguruma/sample/user_property.c +87 -0
  83. package/deps/jq/modules/oniguruma/src/Makefile.am +58 -0
  84. package/deps/jq/modules/oniguruma/src/Makefile.windows +183 -0
  85. package/deps/jq/modules/oniguruma/src/ascii.c +61 -0
  86. package/deps/jq/modules/oniguruma/src/big5.c +190 -0
  87. package/deps/jq/modules/oniguruma/src/config.h.cmake.in +71 -0
  88. package/deps/jq/modules/oniguruma/src/config.h.win32 +84 -0
  89. package/deps/jq/modules/oniguruma/src/config.h.win64 +84 -0
  90. package/deps/jq/modules/oniguruma/src/cp1251.c +203 -0
  91. package/deps/jq/modules/oniguruma/src/euc_jp.c +310 -0
  92. package/deps/jq/modules/oniguruma/src/euc_jp_prop.c +158 -0
  93. package/deps/jq/modules/oniguruma/src/euc_jp_prop.gperf +27 -0
  94. package/deps/jq/modules/oniguruma/src/euc_kr.c +188 -0
  95. package/deps/jq/modules/oniguruma/src/euc_tw.c +171 -0
  96. package/deps/jq/modules/oniguruma/src/gb18030.c +538 -0
  97. package/deps/jq/modules/oniguruma/src/gperf_fold_key_conv.py +67 -0
  98. package/deps/jq/modules/oniguruma/src/gperf_unfold_key_conv.py +55 -0
  99. package/deps/jq/modules/oniguruma/src/iso8859_1.c +275 -0
  100. package/deps/jq/modules/oniguruma/src/iso8859_10.c +242 -0
  101. package/deps/jq/modules/oniguruma/src/iso8859_11.c +99 -0
  102. package/deps/jq/modules/oniguruma/src/iso8859_13.c +231 -0
  103. package/deps/jq/modules/oniguruma/src/iso8859_14.c +244 -0
  104. package/deps/jq/modules/oniguruma/src/iso8859_15.c +238 -0
  105. package/deps/jq/modules/oniguruma/src/iso8859_16.c +240 -0
  106. package/deps/jq/modules/oniguruma/src/iso8859_2.c +238 -0
  107. package/deps/jq/modules/oniguruma/src/iso8859_3.c +238 -0
  108. package/deps/jq/modules/oniguruma/src/iso8859_4.c +240 -0
  109. package/deps/jq/modules/oniguruma/src/iso8859_5.c +229 -0
  110. package/deps/jq/modules/oniguruma/src/iso8859_6.c +99 -0
  111. package/deps/jq/modules/oniguruma/src/iso8859_7.c +225 -0
  112. package/deps/jq/modules/oniguruma/src/iso8859_8.c +99 -0
  113. package/deps/jq/modules/oniguruma/src/iso8859_9.c +231 -0
  114. package/deps/jq/modules/oniguruma/src/koi8.c +253 -0
  115. package/deps/jq/modules/oniguruma/src/koi8_r.c +215 -0
  116. package/deps/jq/modules/oniguruma/src/make_unicode_fold.sh +22 -0
  117. package/deps/jq/modules/oniguruma/src/make_unicode_fold_data.py +306 -0
  118. package/deps/jq/modules/oniguruma/src/make_unicode_property.sh +18 -0
  119. package/deps/jq/modules/oniguruma/src/make_unicode_property_data.py +545 -0
  120. package/deps/jq/modules/oniguruma/src/mktable.c +1184 -0
  121. package/deps/jq/modules/oniguruma/src/onig_init.c +45 -0
  122. package/deps/jq/modules/oniguruma/src/oniggnu.h +85 -0
  123. package/deps/jq/modules/oniguruma/src/onigposix.h +169 -0
  124. package/deps/jq/modules/oniguruma/src/oniguruma.h +841 -0
  125. package/deps/jq/modules/oniguruma/src/regcomp.c +6300 -0
  126. package/deps/jq/modules/oniguruma/src/regenc.c +917 -0
  127. package/deps/jq/modules/oniguruma/src/regenc.h +243 -0
  128. package/deps/jq/modules/oniguruma/src/regerror.c +393 -0
  129. package/deps/jq/modules/oniguruma/src/regexec.c +3856 -0
  130. package/deps/jq/modules/oniguruma/src/regext.c +202 -0
  131. package/deps/jq/modules/oniguruma/src/reggnu.c +147 -0
  132. package/deps/jq/modules/oniguruma/src/regint.h +779 -0
  133. package/deps/jq/modules/oniguruma/src/regparse.c +5403 -0
  134. package/deps/jq/modules/oniguruma/src/regparse.h +351 -0
  135. package/deps/jq/modules/oniguruma/src/regposerr.c +105 -0
  136. package/deps/jq/modules/oniguruma/src/regposix.c +306 -0
  137. package/deps/jq/modules/oniguruma/src/regsyntax.c +315 -0
  138. package/deps/jq/modules/oniguruma/src/regtrav.c +76 -0
  139. package/deps/jq/modules/oniguruma/src/regversion.c +57 -0
  140. package/deps/jq/modules/oniguruma/src/sjis.c +341 -0
  141. package/deps/jq/modules/oniguruma/src/sjis_prop.c +158 -0
  142. package/deps/jq/modules/oniguruma/src/sjis_prop.gperf +27 -0
  143. package/deps/jq/modules/oniguruma/src/st.c +589 -0
  144. package/deps/jq/modules/oniguruma/src/st.h +68 -0
  145. package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_fold1_key.c +2250 -0
  146. package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_fold2_key.c +203 -0
  147. package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_fold3_key.c +113 -0
  148. package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_fold_data.c +1225 -0
  149. package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_property_data.c +24742 -0
  150. package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_property_data_posix.c +4846 -0
  151. package/deps/jq/modules/oniguruma/src/unicode-7.0/unicode_unfold_key.c +2571 -0
  152. package/deps/jq/modules/oniguruma/src/unicode.c +664 -0
  153. package/deps/jq/modules/oniguruma/src/unicode_fold1_key.c +2548 -0
  154. package/deps/jq/modules/oniguruma/src/unicode_fold2_key.c +203 -0
  155. package/deps/jq/modules/oniguruma/src/unicode_fold3_key.c +113 -0
  156. package/deps/jq/modules/oniguruma/src/unicode_fold_data.c +1366 -0
  157. package/deps/jq/modules/oniguruma/src/unicode_property_data.c +25306 -0
  158. package/deps/jq/modules/oniguruma/src/unicode_property_data_posix.c +4940 -0
  159. package/deps/jq/modules/oniguruma/src/unicode_unfold_key.c +2854 -0
  160. package/deps/jq/modules/oniguruma/src/utf16_be.c +235 -0
  161. package/deps/jq/modules/oniguruma/src/utf16_le.c +245 -0
  162. package/deps/jq/modules/oniguruma/src/utf32_be.c +194 -0
  163. package/deps/jq/modules/oniguruma/src/utf32_le.c +194 -0
  164. package/deps/jq/modules/oniguruma/src/utf8.c +335 -0
  165. package/deps/jq/modules/oniguruma/test/Makefile.am +28 -0
  166. package/deps/jq/modules/oniguruma/test/testc.c +874 -0
  167. package/deps/jq/modules/oniguruma/test/testu.c +916 -0
  168. package/deps/jq/modules/oniguruma/test-driver +153 -0
  169. package/deps/jq/modules/oniguruma/windows/testc.c +869 -0
  170. package/deps/jq/scripts/crosscompile +2 -1
  171. package/deps/jq/scripts/gen_utf8_tables.py +2 -3
  172. package/deps/jq/scripts/update-website +29 -0
  173. package/deps/jq/scripts/version +7 -2
  174. package/deps/jq/sig/jq-release.key +41 -0
  175. package/deps/jq/sig/v1.3/jq-linux-x86.asc +17 -0
  176. package/deps/jq/sig/v1.3/jq-linux-x86_64.asc +17 -0
  177. package/deps/jq/sig/v1.3/jq-osx-x86.asc +17 -0
  178. package/deps/jq/sig/v1.3/jq-osx-x86_64.asc +17 -0
  179. package/deps/jq/sig/v1.3/jq-win32.exe.asc +17 -0
  180. package/deps/jq/sig/v1.3/jq-win64.exe.asc +17 -0
  181. package/deps/jq/sig/v1.3/sha256sum.txt +6 -0
  182. package/deps/jq/sig/v1.4/jq-linux-x86.asc +17 -0
  183. package/deps/jq/sig/v1.4/jq-linux-x86_64.asc +17 -0
  184. package/deps/jq/sig/v1.4/jq-osx-x86.asc +17 -0
  185. package/deps/jq/sig/v1.4/jq-osx-x86_64.asc +17 -0
  186. package/deps/jq/sig/v1.4/jq-solaris11-32.asc +17 -0
  187. package/deps/jq/sig/v1.4/jq-solaris11-64.asc +17 -0
  188. package/deps/jq/sig/v1.4/jq-win32.exe.asc +17 -0
  189. package/deps/jq/sig/v1.4/jq-win64.exe.asc +17 -0
  190. package/deps/jq/sig/v1.4/sha256sum.txt +8 -0
  191. package/deps/jq/sig/v1.5/jq-linux32-no-oniguruma.asc +17 -0
  192. package/deps/jq/sig/v1.5/jq-linux32.asc +17 -0
  193. package/deps/jq/sig/v1.5/jq-linux64.asc +17 -0
  194. package/deps/jq/sig/v1.5/jq-osx-amd64.asc +17 -0
  195. package/deps/jq/sig/v1.5/jq-win32.exe.asc +17 -0
  196. package/deps/jq/sig/v1.5/jq-win64.exe.asc +17 -0
  197. package/deps/jq/sig/v1.5/sha256sum.txt +5 -0
  198. package/deps/jq/sig/v1.5rc1/jq-linux-x86_64-static.asc +17 -0
  199. package/deps/jq/sig/v1.5rc1/jq-win32.exe.asc +17 -0
  200. package/deps/jq/sig/v1.5rc1/jq-win64.exe.asc +17 -0
  201. package/deps/jq/sig/v1.5rc1/sha256sum.txt +3 -0
  202. package/deps/jq/sig/v1.5rc2/jq-linux-x86.asc +17 -0
  203. package/deps/jq/sig/v1.5rc2/jq-linux-x86_64.asc +17 -0
  204. package/deps/jq/sig/v1.5rc2/jq-osx-x86_64.asc +17 -0
  205. package/deps/jq/sig/v1.5rc2/jq-win32.exe.asc +17 -0
  206. package/deps/jq/sig/v1.5rc2/jq-win64.exe.asc +17 -0
  207. package/deps/jq/sig/v1.5rc2/sha256sum.txt +5 -0
  208. package/deps/jq/sig/v1.6/jq-linux32.asc +16 -0
  209. package/deps/jq/sig/v1.6/jq-linux64.asc +16 -0
  210. package/deps/jq/sig/v1.6/jq-osx-amd64.asc +16 -0
  211. package/deps/jq/sig/v1.6/jq-win32.exe.asc +16 -0
  212. package/deps/jq/sig/v1.6/jq-win64.exe.asc +16 -0
  213. package/deps/jq/sig/v1.6/sha256sum.txt +5 -0
  214. package/deps/jq/{builtin.c → src/builtin.c} +449 -344
  215. package/deps/jq/{builtin.h → src/builtin.h} +0 -0
  216. package/deps/jq/src/builtin.jq +311 -0
  217. package/deps/jq/{bytecode.c → src/bytecode.c} +0 -0
  218. package/deps/jq/{bytecode.h → src/bytecode.h} +0 -0
  219. package/deps/jq/{compile.c → src/compile.c} +213 -37
  220. package/deps/jq/{compile.h → src/compile.h} +7 -2
  221. package/deps/jq/{exec_stack.h → src/exec_stack.h} +0 -0
  222. package/deps/jq/{execute.c → src/execute.c} +127 -24
  223. package/deps/jq/{inject_errors.c → src/inject_errors.c} +0 -0
  224. package/deps/jq/{jq.h → src/jq.h} +13 -2
  225. package/deps/jq/{jq_parser.h → src/jq_parser.h} +0 -0
  226. package/deps/jq/{jq_test.c → src/jq_test.c} +1 -1
  227. package/deps/jq/{jv.c → src/jv.c} +24 -5
  228. package/deps/jq/{jv.h → src/jv.h} +46 -11
  229. package/deps/jq/{jv_alloc.c → src/jv_alloc.c} +0 -0
  230. package/deps/jq/{jv_alloc.h → src/jv_alloc.h} +0 -0
  231. package/deps/jq/{jv_aux.c → src/jv_aux.c} +38 -14
  232. package/deps/jq/{jv_dtoa.c → src/jv_dtoa.c} +4 -5
  233. package/deps/jq/{jv_dtoa.h → src/jv_dtoa.h} +0 -0
  234. package/deps/jq/src/jv_file.c +81 -0
  235. package/deps/jq/{jv_parse.c → src/jv_parse.c} +8 -2
  236. package/deps/jq/{jv_print.c → src/jv_print.c} +80 -27
  237. package/deps/jq/{jv_unicode.c → src/jv_unicode.c} +28 -4
  238. package/deps/jq/{jv_unicode.h → src/jv_unicode.h} +1 -0
  239. package/deps/jq/{jv_utf8_tables.h → src/jv_utf8_tables.h} +0 -0
  240. package/deps/jq/{lexer.c → src/lexer.c} +317 -292
  241. package/deps/jq/{lexer.h → src/lexer.h} +16 -12
  242. package/deps/jq/{lexer.l → src/lexer.l} +5 -4
  243. package/deps/jq/src/libm.h +291 -0
  244. package/deps/jq/{linker.c → src/linker.c} +5 -3
  245. package/deps/jq/{linker.h → src/linker.h} +0 -0
  246. package/deps/jq/{locfile.c → src/locfile.c} +1 -1
  247. package/deps/jq/{locfile.h → src/locfile.h} +0 -0
  248. package/deps/jq/{main.c → src/main.c} +202 -100
  249. package/deps/jq/{opcode_list.h → src/opcode_list.h} +4 -0
  250. package/deps/jq/{parser.c → src/parser.c} +1149 -1069
  251. package/deps/jq/{parser.h → src/parser.h} +28 -24
  252. package/deps/jq/{parser.y → src/parser.y} +108 -52
  253. package/deps/jq/{util.c → src/util.c} +12 -9
  254. package/deps/jq/{util.h → src/util.h} +0 -0
  255. package/deps/jq/tests/base64.test +35 -0
  256. package/deps/jq/tests/base64test +5 -0
  257. package/deps/jq/tests/jq-f-test.sh +4 -0
  258. package/deps/jq/tests/jq.test +305 -21
  259. package/deps/jq/tests/jqtest +1 -1
  260. package/deps/jq/tests/mantest +1 -1
  261. package/deps/jq/tests/onig.test +13 -0
  262. package/deps/jq/tests/onigtest +1 -1
  263. package/deps/jq/tests/optional.test +20 -0
  264. package/deps/jq/tests/optionaltest +5 -0
  265. package/deps/jq/tests/setup +7 -1
  266. package/deps/jq/tests/shtest +133 -29
  267. package/deps/jq/tests/utf8-truncate.jq +3 -0
  268. package/deps/jq/tests/utf8test +10 -0
  269. package/lib/index.js +7 -1
  270. package/package.json +3 -3
  271. package/test/santiy.test.js +24 -0
  272. package/deps/jq/docs/default_manpage.md +0 -22
  273. package/deps/jq/docs/public/bootstrap/css/bootstrap-responsive.css +0 -1058
  274. package/deps/jq/docs/public/bootstrap/css/bootstrap-responsive.min.css +0 -9
  275. package/deps/jq/docs/public/bootstrap/css/bootstrap.css +0 -5224
  276. package/deps/jq/docs/public/bootstrap/css/bootstrap.min.css +0 -9
  277. package/deps/jq/docs/public/bootstrap/img/glyphicons-halflings-white.png +0 -0
  278. package/deps/jq/docs/public/bootstrap/img/glyphicons-halflings.png +0 -0
  279. package/deps/jq/docs/public/bootstrap/js/bootstrap.js +0 -2027
  280. package/deps/jq/docs/public/bootstrap/js/bootstrap.min.js +0 -6
  281. package/deps/jq/docs/templates/shared/_header.liquid +0 -26
  282. package/deps/jq/jq.1.default +0 -39
  283. package/deps/jq/jv_file.c +0 -49
  284. package/deps/jq/libm.h +0 -160
  285. package/deps/jq/setup.sh +0 -33
  286. package/reports/jest-port-api.xml +0 -35
@@ -0,0 +1,3856 @@
1
+ /**********************************************************************
2
+ regexec.c - Oniguruma (regular expression library)
3
+ **********************************************************************/
4
+ /*-
5
+ * Copyright (c) 2002-2016 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
6
+ * All rights reserved.
7
+ *
8
+ * Redistribution and use in source and binary forms, with or without
9
+ * modification, are permitted provided that the following conditions
10
+ * are met:
11
+ * 1. Redistributions of source code must retain the above copyright
12
+ * notice, this list of conditions and the following disclaimer.
13
+ * 2. Redistributions in binary form must reproduce the above copyright
14
+ * notice, this list of conditions and the following disclaimer in the
15
+ * documentation and/or other materials provided with the distribution.
16
+ *
17
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27
+ * SUCH DAMAGE.
28
+ */
29
+
30
+ #include "regint.h"
31
+
32
+ #define USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE
33
+
34
+ #ifdef USE_CRNL_AS_LINE_TERMINATOR
35
+ #define ONIGENC_IS_MBC_CRNL(enc,p,end) \
36
+ (ONIGENC_MBC_TO_CODE(enc,p,end) == 13 && \
37
+ ONIGENC_IS_MBC_NEWLINE(enc,(p+enclen(enc,p)),end))
38
+ #endif
39
+
40
+ #ifdef USE_CAPTURE_HISTORY
41
+ static void history_tree_free(OnigCaptureTreeNode* node);
42
+
43
+ static void
44
+ history_tree_clear(OnigCaptureTreeNode* node)
45
+ {
46
+ int i;
47
+
48
+ if (IS_NOT_NULL(node)) {
49
+ for (i = 0; i < node->num_childs; i++) {
50
+ if (IS_NOT_NULL(node->childs[i])) {
51
+ history_tree_free(node->childs[i]);
52
+ }
53
+ }
54
+ for (i = 0; i < node->allocated; i++) {
55
+ node->childs[i] = (OnigCaptureTreeNode* )0;
56
+ }
57
+ node->num_childs = 0;
58
+ node->beg = ONIG_REGION_NOTPOS;
59
+ node->end = ONIG_REGION_NOTPOS;
60
+ node->group = -1;
61
+ }
62
+ }
63
+
64
+ static void
65
+ history_tree_free(OnigCaptureTreeNode* node)
66
+ {
67
+ history_tree_clear(node);
68
+ xfree(node);
69
+ }
70
+
71
+ static void
72
+ history_root_free(OnigRegion* r)
73
+ {
74
+ if (IS_NOT_NULL(r->history_root)) {
75
+ history_tree_free(r->history_root);
76
+ r->history_root = (OnigCaptureTreeNode* )0;
77
+ }
78
+ }
79
+
80
+ static OnigCaptureTreeNode*
81
+ history_node_new(void)
82
+ {
83
+ OnigCaptureTreeNode* node;
84
+
85
+ node = (OnigCaptureTreeNode* )xmalloc(sizeof(OnigCaptureTreeNode));
86
+ CHECK_NULL_RETURN(node);
87
+ node->childs = (OnigCaptureTreeNode** )0;
88
+ node->allocated = 0;
89
+ node->num_childs = 0;
90
+ node->group = -1;
91
+ node->beg = ONIG_REGION_NOTPOS;
92
+ node->end = ONIG_REGION_NOTPOS;
93
+
94
+ return node;
95
+ }
96
+
97
+ static int
98
+ history_tree_add_child(OnigCaptureTreeNode* parent, OnigCaptureTreeNode* child)
99
+ {
100
+ #define HISTORY_TREE_INIT_ALLOC_SIZE 8
101
+
102
+ if (parent->num_childs >= parent->allocated) {
103
+ int n, i;
104
+
105
+ if (IS_NULL(parent->childs)) {
106
+ n = HISTORY_TREE_INIT_ALLOC_SIZE;
107
+ parent->childs =
108
+ (OnigCaptureTreeNode** )xmalloc(sizeof(OnigCaptureTreeNode*) * n);
109
+ }
110
+ else {
111
+ n = parent->allocated * 2;
112
+ parent->childs =
113
+ (OnigCaptureTreeNode** )xrealloc(parent->childs,
114
+ sizeof(OnigCaptureTreeNode*) * n);
115
+ }
116
+ CHECK_NULL_RETURN_MEMERR(parent->childs);
117
+ for (i = parent->allocated; i < n; i++) {
118
+ parent->childs[i] = (OnigCaptureTreeNode* )0;
119
+ }
120
+ parent->allocated = n;
121
+ }
122
+
123
+ parent->childs[parent->num_childs] = child;
124
+ parent->num_childs++;
125
+ return 0;
126
+ }
127
+
128
+ static OnigCaptureTreeNode*
129
+ history_tree_clone(OnigCaptureTreeNode* node)
130
+ {
131
+ int i;
132
+ OnigCaptureTreeNode *clone, *child;
133
+
134
+ clone = history_node_new();
135
+ CHECK_NULL_RETURN(clone);
136
+
137
+ clone->beg = node->beg;
138
+ clone->end = node->end;
139
+ for (i = 0; i < node->num_childs; i++) {
140
+ child = history_tree_clone(node->childs[i]);
141
+ if (IS_NULL(child)) {
142
+ history_tree_free(clone);
143
+ return (OnigCaptureTreeNode* )0;
144
+ }
145
+ history_tree_add_child(clone, child);
146
+ }
147
+
148
+ return clone;
149
+ }
150
+
151
+ extern OnigCaptureTreeNode*
152
+ onig_get_capture_tree(OnigRegion* region)
153
+ {
154
+ return region->history_root;
155
+ }
156
+ #endif /* USE_CAPTURE_HISTORY */
157
+
158
+ extern void
159
+ onig_region_clear(OnigRegion* region)
160
+ {
161
+ int i;
162
+
163
+ for (i = 0; i < region->num_regs; i++) {
164
+ region->beg[i] = region->end[i] = ONIG_REGION_NOTPOS;
165
+ }
166
+ #ifdef USE_CAPTURE_HISTORY
167
+ history_root_free(region);
168
+ #endif
169
+ }
170
+
171
+ extern int
172
+ onig_region_resize(OnigRegion* region, int n)
173
+ {
174
+ region->num_regs = n;
175
+
176
+ if (n < ONIG_NREGION)
177
+ n = ONIG_NREGION;
178
+
179
+ if (region->allocated == 0) {
180
+ region->beg = (int* )xmalloc(n * sizeof(int));
181
+ region->end = (int* )xmalloc(n * sizeof(int));
182
+
183
+ if (region->beg == 0 || region->end == 0)
184
+ return ONIGERR_MEMORY;
185
+
186
+ region->allocated = n;
187
+ }
188
+ else if (region->allocated < n) {
189
+ region->beg = (int* )xrealloc(region->beg, n * sizeof(int));
190
+ region->end = (int* )xrealloc(region->end, n * sizeof(int));
191
+
192
+ if (region->beg == 0 || region->end == 0)
193
+ return ONIGERR_MEMORY;
194
+
195
+ region->allocated = n;
196
+ }
197
+
198
+ return 0;
199
+ }
200
+
201
+ static int
202
+ onig_region_resize_clear(OnigRegion* region, int n)
203
+ {
204
+ int r;
205
+
206
+ r = onig_region_resize(region, n);
207
+ if (r != 0) return r;
208
+ onig_region_clear(region);
209
+ return 0;
210
+ }
211
+
212
+ extern int
213
+ onig_region_set(OnigRegion* region, int at, int beg, int end)
214
+ {
215
+ if (at < 0) return ONIGERR_INVALID_ARGUMENT;
216
+
217
+ if (at >= region->allocated) {
218
+ int r = onig_region_resize(region, at + 1);
219
+ if (r < 0) return r;
220
+ }
221
+
222
+ region->beg[at] = beg;
223
+ region->end[at] = end;
224
+ return 0;
225
+ }
226
+
227
+ extern void
228
+ onig_region_init(OnigRegion* region)
229
+ {
230
+ region->num_regs = 0;
231
+ region->allocated = 0;
232
+ region->beg = (int* )0;
233
+ region->end = (int* )0;
234
+ region->history_root = (OnigCaptureTreeNode* )0;
235
+ }
236
+
237
+ extern OnigRegion*
238
+ onig_region_new(void)
239
+ {
240
+ OnigRegion* r;
241
+
242
+ r = (OnigRegion* )xmalloc(sizeof(OnigRegion));
243
+ onig_region_init(r);
244
+ return r;
245
+ }
246
+
247
+ extern void
248
+ onig_region_free(OnigRegion* r, int free_self)
249
+ {
250
+ if (r) {
251
+ if (r->allocated > 0) {
252
+ if (r->beg) xfree(r->beg);
253
+ if (r->end) xfree(r->end);
254
+ r->allocated = 0;
255
+ }
256
+ #ifdef USE_CAPTURE_HISTORY
257
+ history_root_free(r);
258
+ #endif
259
+ if (free_self) xfree(r);
260
+ }
261
+ }
262
+
263
+ extern void
264
+ onig_region_copy(OnigRegion* to, OnigRegion* from)
265
+ {
266
+ #define RREGC_SIZE (sizeof(int) * from->num_regs)
267
+ int i;
268
+
269
+ if (to == from) return;
270
+
271
+ if (to->allocated == 0) {
272
+ if (from->num_regs > 0) {
273
+ to->beg = (int* )xmalloc(RREGC_SIZE);
274
+ to->end = (int* )xmalloc(RREGC_SIZE);
275
+ to->allocated = from->num_regs;
276
+ }
277
+ }
278
+ else if (to->allocated < from->num_regs) {
279
+ to->beg = (int* )xrealloc(to->beg, RREGC_SIZE);
280
+ to->end = (int* )xrealloc(to->end, RREGC_SIZE);
281
+ to->allocated = from->num_regs;
282
+ }
283
+
284
+ for (i = 0; i < from->num_regs; i++) {
285
+ to->beg[i] = from->beg[i];
286
+ to->end[i] = from->end[i];
287
+ }
288
+ to->num_regs = from->num_regs;
289
+
290
+ #ifdef USE_CAPTURE_HISTORY
291
+ history_root_free(to);
292
+
293
+ if (IS_NOT_NULL(from->history_root)) {
294
+ to->history_root = history_tree_clone(from->history_root);
295
+ }
296
+ #endif
297
+ }
298
+
299
+
300
+ /** stack **/
301
+ #define INVALID_STACK_INDEX -1
302
+
303
+ /* stack type */
304
+ /* used by normal-POP */
305
+ #define STK_ALT 0x0001
306
+ #define STK_LOOK_BEHIND_NOT 0x0002
307
+ #define STK_POS_NOT 0x0003
308
+ /* handled by normal-POP */
309
+ #define STK_MEM_START 0x0100
310
+ #define STK_MEM_END 0x8200
311
+ #define STK_REPEAT_INC 0x0300
312
+ #define STK_STATE_CHECK_MARK 0x1000
313
+ /* avoided by normal-POP */
314
+ #define STK_NULL_CHECK_START 0x3000
315
+ #define STK_NULL_CHECK_END 0x5000 /* for recursive call */
316
+ #define STK_MEM_END_MARK 0x8400
317
+ #define STK_POS 0x0500 /* used when POP-POS */
318
+ #define STK_STOP_BT 0x0600 /* mark for "(?>...)" */
319
+ #define STK_REPEAT 0x0700
320
+ #define STK_CALL_FRAME 0x0800
321
+ #define STK_RETURN 0x0900
322
+ #define STK_VOID 0x0a00 /* for fill a blank */
323
+
324
+ /* stack type check mask */
325
+ #define STK_MASK_POP_USED 0x00ff
326
+ #define STK_MASK_TO_VOID_TARGET 0x10ff
327
+ #define STK_MASK_MEM_END_OR_MARK 0x8000 /* MEM_END or MEM_END_MARK */
328
+
329
+ #ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE
330
+ #define MATCH_ARG_INIT(msa, reg, arg_option, arg_region, arg_start) do {\
331
+ (msa).stack_p = (void* )0;\
332
+ (msa).options = (arg_option);\
333
+ (msa).region = (arg_region);\
334
+ (msa).start = (arg_start);\
335
+ (msa).best_len = ONIG_MISMATCH;\
336
+ (msa).ptr_num = (reg)->num_repeat + (reg)->num_mem * 2;\
337
+ } while(0)
338
+ #else
339
+ #define MATCH_ARG_INIT(msa, reg, arg_option, arg_region, arg_start) do {\
340
+ (msa).stack_p = (void* )0;\
341
+ (msa).options = (arg_option);\
342
+ (msa).region = (arg_region);\
343
+ (msa).start = (arg_start);\
344
+ (msa).ptr_num = (reg)->num_repeat + (reg)->num_mem * 2;\
345
+ } while(0)
346
+ #endif
347
+
348
+ #ifdef USE_COMBINATION_EXPLOSION_CHECK
349
+
350
+ #define STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE 16
351
+
352
+ #define STATE_CHECK_BUFF_INIT(msa, str_len, offset, state_num) do { \
353
+ if ((state_num) > 0 && str_len >= STATE_CHECK_STRING_THRESHOLD_LEN) {\
354
+ unsigned int size = (unsigned int )(((str_len) + 1) * (state_num) + 7) >> 3;\
355
+ offset = ((offset) * (state_num)) >> 3;\
356
+ if (size > 0 && offset < size && size < STATE_CHECK_BUFF_MAX_SIZE) {\
357
+ if (size >= STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE) \
358
+ (msa).state_check_buff = (void* )xmalloc(size);\
359
+ else \
360
+ (msa).state_check_buff = (void* )xalloca(size);\
361
+ xmemset(((char* )((msa).state_check_buff)+(offset)), 0, \
362
+ (size_t )(size - (offset))); \
363
+ (msa).state_check_buff_size = size;\
364
+ }\
365
+ else {\
366
+ (msa).state_check_buff = (void* )0;\
367
+ (msa).state_check_buff_size = 0;\
368
+ }\
369
+ }\
370
+ else {\
371
+ (msa).state_check_buff = (void* )0;\
372
+ (msa).state_check_buff_size = 0;\
373
+ }\
374
+ } while(0)
375
+
376
+ #define MATCH_ARG_FREE(msa) do {\
377
+ if ((msa).stack_p) xfree((msa).stack_p);\
378
+ if ((msa).state_check_buff_size >= STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE) { \
379
+ if ((msa).state_check_buff) xfree((msa).state_check_buff);\
380
+ }\
381
+ } while(0)
382
+ #else
383
+ #define STATE_CHECK_BUFF_INIT(msa, str_len, offset, state_num)
384
+ #define MATCH_ARG_FREE(msa) if ((msa).stack_p) xfree((msa).stack_p)
385
+ #endif
386
+
387
+
388
+ #define ALLOCA_PTR_NUM_LIMIT 50
389
+
390
+ #define STACK_INIT(stack_num) do {\
391
+ if (msa->stack_p) {\
392
+ is_alloca = 0;\
393
+ alloc_base = msa->stack_p;\
394
+ stk_base = (OnigStackType* )(alloc_base\
395
+ + (sizeof(OnigStackIndex) * msa->ptr_num));\
396
+ stk = stk_base;\
397
+ stk_end = stk_base + msa->stack_n;\
398
+ }\
399
+ else if (msa->ptr_num > ALLOCA_PTR_NUM_LIMIT) {\
400
+ is_alloca = 0;\
401
+ alloc_base = (char* )xmalloc(sizeof(OnigStackIndex) * msa->ptr_num\
402
+ + sizeof(OnigStackType) * (stack_num));\
403
+ stk_base = (OnigStackType* )(alloc_base\
404
+ + (sizeof(OnigStackIndex) * msa->ptr_num));\
405
+ stk = stk_base;\
406
+ stk_end = stk_base + (stack_num);\
407
+ }\
408
+ else {\
409
+ is_alloca = 1;\
410
+ alloc_base = (char* )xalloca(sizeof(OnigStackIndex) * msa->ptr_num\
411
+ + sizeof(OnigStackType) * (stack_num));\
412
+ stk_base = (OnigStackType* )(alloc_base\
413
+ + (sizeof(OnigStackIndex) * msa->ptr_num));\
414
+ stk = stk_base;\
415
+ stk_end = stk_base + (stack_num);\
416
+ }\
417
+ } while(0);
418
+
419
+
420
+ #define STACK_SAVE do{\
421
+ msa->stack_n = stk_end - stk_base;\
422
+ if (is_alloca != 0) {\
423
+ size_t size = sizeof(OnigStackIndex) * msa->ptr_num \
424
+ + sizeof(OnigStackType) * msa->stack_n;\
425
+ msa->stack_p = xmalloc(size);\
426
+ xmemcpy(msa->stack_p, alloc_base, size);\
427
+ }\
428
+ else {\
429
+ msa->stack_p = alloc_base;\
430
+ };\
431
+ } while(0)
432
+
433
+ #define UPDATE_FOR_STACK_REALLOC do{\
434
+ repeat_stk = (OnigStackIndex* )alloc_base;\
435
+ mem_start_stk = (OnigStackIndex* )(repeat_stk + reg->num_repeat);\
436
+ mem_end_stk = mem_start_stk + num_mem;\
437
+ mem_start_stk--; /* for index start from 1 */\
438
+ mem_end_stk--; /* for index start from 1 */\
439
+ } while(0)
440
+
441
+ static unsigned int MatchStackLimitSize = DEFAULT_MATCH_STACK_LIMIT_SIZE;
442
+
443
+ extern unsigned int
444
+ onig_get_match_stack_limit_size(void)
445
+ {
446
+ return MatchStackLimitSize;
447
+ }
448
+
449
+ extern int
450
+ onig_set_match_stack_limit_size(unsigned int size)
451
+ {
452
+ MatchStackLimitSize = size;
453
+ return 0;
454
+ }
455
+
456
+ static int
457
+ stack_double(int is_alloca, char** arg_alloc_base,
458
+ OnigStackType** arg_stk_base,
459
+ OnigStackType** arg_stk_end, OnigStackType** arg_stk,
460
+ OnigMatchArg* msa)
461
+ {
462
+ unsigned int n;
463
+ int used;
464
+ size_t size;
465
+ size_t new_size;
466
+ char* alloc_base;
467
+ char* new_alloc_base;
468
+ OnigStackType *stk_base, *stk_end, *stk;
469
+
470
+ alloc_base = *arg_alloc_base;
471
+ stk_base = *arg_stk_base;
472
+ stk_end = *arg_stk_end;
473
+ stk = *arg_stk;
474
+
475
+ n = stk_end - stk_base;
476
+ size = sizeof(OnigStackIndex) * msa->ptr_num + sizeof(OnigStackType) * n;
477
+ n *= 2;
478
+ new_size = sizeof(OnigStackIndex) * msa->ptr_num + sizeof(OnigStackType) * n;
479
+ if (is_alloca != 0) {
480
+ new_alloc_base = (char* )xmalloc(new_size);
481
+ if (IS_NULL(new_alloc_base)) {
482
+ STACK_SAVE;
483
+ return ONIGERR_MEMORY;
484
+ }
485
+ xmemcpy(new_alloc_base, alloc_base, size);
486
+ }
487
+ else {
488
+ if (MatchStackLimitSize != 0 && n > MatchStackLimitSize) {
489
+ if ((unsigned int )(stk_end - stk_base) == MatchStackLimitSize)
490
+ return ONIGERR_MATCH_STACK_LIMIT_OVER;
491
+ else
492
+ n = MatchStackLimitSize;
493
+ }
494
+ new_alloc_base = (char* )xrealloc(alloc_base, new_size);
495
+ if (IS_NULL(new_alloc_base)) {
496
+ STACK_SAVE;
497
+ return ONIGERR_MEMORY;
498
+ }
499
+ }
500
+
501
+ alloc_base = new_alloc_base;
502
+ used = stk - stk_base;
503
+ *arg_alloc_base = alloc_base;
504
+ *arg_stk_base = (OnigStackType* )(alloc_base
505
+ + (sizeof(OnigStackIndex) * msa->ptr_num));
506
+ *arg_stk = *arg_stk_base + used;
507
+ *arg_stk_end = *arg_stk_base + n;
508
+ return 0;
509
+ }
510
+
511
+ #define STACK_ENSURE(n) do {\
512
+ if (stk_end - stk < (n)) {\
513
+ int r = stack_double(is_alloca, &alloc_base, &stk_base, &stk_end, &stk,\
514
+ msa);\
515
+ if (r != 0) { STACK_SAVE; return r; } \
516
+ is_alloca = 0;\
517
+ UPDATE_FOR_STACK_REALLOC;\
518
+ }\
519
+ } while(0)
520
+
521
+ #define STACK_AT(index) (stk_base + (index))
522
+ #define GET_STACK_INDEX(stk) ((stk) - stk_base)
523
+
524
+ #define STACK_PUSH_TYPE(stack_type) do {\
525
+ STACK_ENSURE(1);\
526
+ stk->type = (stack_type);\
527
+ STACK_INC;\
528
+ } while(0)
529
+
530
+ #define IS_TO_VOID_TARGET(stk) (((stk)->type & STK_MASK_TO_VOID_TARGET) != 0)
531
+
532
+ #ifdef USE_COMBINATION_EXPLOSION_CHECK
533
+ #define STATE_CHECK_POS(s,snum) \
534
+ (((s) - str) * num_comb_exp_check + ((snum) - 1))
535
+ #define STATE_CHECK_VAL(v,snum) do {\
536
+ if (state_check_buff != NULL) {\
537
+ int x = STATE_CHECK_POS(s,snum);\
538
+ (v) = state_check_buff[x/8] & (1<<(x%8));\
539
+ }\
540
+ else (v) = 0;\
541
+ } while(0)
542
+
543
+
544
+ #define ELSE_IF_STATE_CHECK_MARK(stk) \
545
+ else if ((stk)->type == STK_STATE_CHECK_MARK) { \
546
+ int x = STATE_CHECK_POS(stk->u.state.pstr, stk->u.state.state_check);\
547
+ state_check_buff[x/8] |= (1<<(x%8)); \
548
+ }
549
+
550
+ #define STACK_PUSH(stack_type,pat,s,sprev) do {\
551
+ STACK_ENSURE(1);\
552
+ stk->type = (stack_type);\
553
+ stk->u.state.pcode = (pat);\
554
+ stk->u.state.pstr = (s);\
555
+ stk->u.state.pstr_prev = (sprev);\
556
+ stk->u.state.state_check = 0;\
557
+ STACK_INC;\
558
+ } while(0)
559
+
560
+ #define STACK_PUSH_ENSURED(stack_type,pat) do {\
561
+ stk->type = (stack_type);\
562
+ stk->u.state.pcode = (pat);\
563
+ stk->u.state.state_check = 0;\
564
+ STACK_INC;\
565
+ } while(0)
566
+
567
+ #define STACK_PUSH_ALT_WITH_STATE_CHECK(pat,s,sprev,snum) do {\
568
+ STACK_ENSURE(1);\
569
+ stk->type = STK_ALT;\
570
+ stk->u.state.pcode = (pat);\
571
+ stk->u.state.pstr = (s);\
572
+ stk->u.state.pstr_prev = (sprev);\
573
+ stk->u.state.state_check = ((state_check_buff != NULL) ? (snum) : 0);\
574
+ STACK_INC;\
575
+ } while(0)
576
+
577
+ #define STACK_PUSH_STATE_CHECK(s,snum) do {\
578
+ if (state_check_buff != NULL) {\
579
+ STACK_ENSURE(1);\
580
+ stk->type = STK_STATE_CHECK_MARK;\
581
+ stk->u.state.pstr = (s);\
582
+ stk->u.state.state_check = (snum);\
583
+ STACK_INC;\
584
+ }\
585
+ } while(0)
586
+
587
+ #else /* USE_COMBINATION_EXPLOSION_CHECK */
588
+
589
+ #define ELSE_IF_STATE_CHECK_MARK(stk)
590
+
591
+ #define STACK_PUSH(stack_type,pat,s,sprev) do {\
592
+ STACK_ENSURE(1);\
593
+ stk->type = (stack_type);\
594
+ stk->u.state.pcode = (pat);\
595
+ stk->u.state.pstr = (s);\
596
+ stk->u.state.pstr_prev = (sprev);\
597
+ STACK_INC;\
598
+ } while(0)
599
+
600
+ #define STACK_PUSH_ENSURED(stack_type,pat) do {\
601
+ stk->type = (stack_type);\
602
+ stk->u.state.pcode = (pat);\
603
+ STACK_INC;\
604
+ } while(0)
605
+ #endif /* USE_COMBINATION_EXPLOSION_CHECK */
606
+
607
+ #define STACK_PUSH_ALT(pat,s,sprev) STACK_PUSH(STK_ALT,pat,s,sprev)
608
+ #define STACK_PUSH_POS(s,sprev) STACK_PUSH(STK_POS,NULL_UCHARP,s,sprev)
609
+ #define STACK_PUSH_POS_NOT(pat,s,sprev) STACK_PUSH(STK_POS_NOT,pat,s,sprev)
610
+ #define STACK_PUSH_STOP_BT STACK_PUSH_TYPE(STK_STOP_BT)
611
+ #define STACK_PUSH_LOOK_BEHIND_NOT(pat,s,sprev) \
612
+ STACK_PUSH(STK_LOOK_BEHIND_NOT,pat,s,sprev)
613
+
614
+ #define STACK_PUSH_REPEAT(id, pat) do {\
615
+ STACK_ENSURE(1);\
616
+ stk->type = STK_REPEAT;\
617
+ stk->u.repeat.num = (id);\
618
+ stk->u.repeat.pcode = (pat);\
619
+ stk->u.repeat.count = 0;\
620
+ STACK_INC;\
621
+ } while(0)
622
+
623
+ #define STACK_PUSH_REPEAT_INC(sindex) do {\
624
+ STACK_ENSURE(1);\
625
+ stk->type = STK_REPEAT_INC;\
626
+ stk->u.repeat_inc.si = (sindex);\
627
+ STACK_INC;\
628
+ } while(0)
629
+
630
+ #define STACK_PUSH_MEM_START(mnum, s) do {\
631
+ STACK_ENSURE(1);\
632
+ stk->type = STK_MEM_START;\
633
+ stk->u.mem.num = (mnum);\
634
+ stk->u.mem.pstr = (s);\
635
+ stk->u.mem.start = mem_start_stk[mnum];\
636
+ stk->u.mem.end = mem_end_stk[mnum];\
637
+ mem_start_stk[mnum] = GET_STACK_INDEX(stk);\
638
+ mem_end_stk[mnum] = INVALID_STACK_INDEX;\
639
+ STACK_INC;\
640
+ } while(0)
641
+
642
+ #define STACK_PUSH_MEM_END(mnum, s) do {\
643
+ STACK_ENSURE(1);\
644
+ stk->type = STK_MEM_END;\
645
+ stk->u.mem.num = (mnum);\
646
+ stk->u.mem.pstr = (s);\
647
+ stk->u.mem.start = mem_start_stk[mnum];\
648
+ stk->u.mem.end = mem_end_stk[mnum];\
649
+ mem_end_stk[mnum] = GET_STACK_INDEX(stk);\
650
+ STACK_INC;\
651
+ } while(0)
652
+
653
+ #define STACK_PUSH_MEM_END_MARK(mnum) do {\
654
+ STACK_ENSURE(1);\
655
+ stk->type = STK_MEM_END_MARK;\
656
+ stk->u.mem.num = (mnum);\
657
+ STACK_INC;\
658
+ } while(0)
659
+
660
+ #define STACK_GET_MEM_START(mnum, k) do {\
661
+ int level = 0;\
662
+ k = stk;\
663
+ while (k > stk_base) {\
664
+ k--;\
665
+ if ((k->type & STK_MASK_MEM_END_OR_MARK) != 0 \
666
+ && k->u.mem.num == (mnum)) {\
667
+ level++;\
668
+ }\
669
+ else if (k->type == STK_MEM_START && k->u.mem.num == (mnum)) {\
670
+ if (level == 0) break;\
671
+ level--;\
672
+ }\
673
+ }\
674
+ } while(0)
675
+
676
+ #define STACK_GET_MEM_RANGE(k, mnum, start, end) do {\
677
+ int level = 0;\
678
+ while (k < stk) {\
679
+ if (k->type == STK_MEM_START && k->u.mem.num == (mnum)) {\
680
+ if (level == 0) (start) = k->u.mem.pstr;\
681
+ level++;\
682
+ }\
683
+ else if (k->type == STK_MEM_END && k->u.mem.num == (mnum)) {\
684
+ level--;\
685
+ if (level == 0) {\
686
+ (end) = k->u.mem.pstr;\
687
+ break;\
688
+ }\
689
+ }\
690
+ k++;\
691
+ }\
692
+ } while(0)
693
+
694
+ #define STACK_PUSH_NULL_CHECK_START(cnum, s) do {\
695
+ STACK_ENSURE(1);\
696
+ stk->type = STK_NULL_CHECK_START;\
697
+ stk->u.null_check.num = (cnum);\
698
+ stk->u.null_check.pstr = (s);\
699
+ STACK_INC;\
700
+ } while(0)
701
+
702
+ #define STACK_PUSH_NULL_CHECK_END(cnum) do {\
703
+ STACK_ENSURE(1);\
704
+ stk->type = STK_NULL_CHECK_END;\
705
+ stk->u.null_check.num = (cnum);\
706
+ STACK_INC;\
707
+ } while(0)
708
+
709
+ #define STACK_PUSH_CALL_FRAME(pat) do {\
710
+ STACK_ENSURE(1);\
711
+ stk->type = STK_CALL_FRAME;\
712
+ stk->u.call_frame.ret_addr = (pat);\
713
+ STACK_INC;\
714
+ } while(0)
715
+
716
+ #define STACK_PUSH_RETURN do {\
717
+ STACK_ENSURE(1);\
718
+ stk->type = STK_RETURN;\
719
+ STACK_INC;\
720
+ } while(0)
721
+
722
+
723
+ #ifdef ONIG_DEBUG
724
+ #define STACK_BASE_CHECK(p, at) \
725
+ if ((p) < stk_base) {\
726
+ fprintf(stderr, "at %s\n", at);\
727
+ goto stack_error;\
728
+ }
729
+ #else
730
+ #define STACK_BASE_CHECK(p, at)
731
+ #endif
732
+
733
+ #define STACK_POP_ONE do {\
734
+ stk--;\
735
+ STACK_BASE_CHECK(stk, "STACK_POP_ONE"); \
736
+ } while(0)
737
+
738
+ #define STACK_POP do {\
739
+ switch (pop_level) {\
740
+ case STACK_POP_LEVEL_FREE:\
741
+ while (1) {\
742
+ stk--;\
743
+ STACK_BASE_CHECK(stk, "STACK_POP"); \
744
+ if ((stk->type & STK_MASK_POP_USED) != 0) break;\
745
+ ELSE_IF_STATE_CHECK_MARK(stk);\
746
+ }\
747
+ break;\
748
+ case STACK_POP_LEVEL_MEM_START:\
749
+ while (1) {\
750
+ stk--;\
751
+ STACK_BASE_CHECK(stk, "STACK_POP 2"); \
752
+ if ((stk->type & STK_MASK_POP_USED) != 0) break;\
753
+ else if (stk->type == STK_MEM_START) {\
754
+ mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\
755
+ mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\
756
+ }\
757
+ ELSE_IF_STATE_CHECK_MARK(stk);\
758
+ }\
759
+ break;\
760
+ default:\
761
+ while (1) {\
762
+ stk--;\
763
+ STACK_BASE_CHECK(stk, "STACK_POP 3"); \
764
+ if ((stk->type & STK_MASK_POP_USED) != 0) break;\
765
+ else if (stk->type == STK_MEM_START) {\
766
+ mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\
767
+ mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\
768
+ }\
769
+ else if (stk->type == STK_REPEAT_INC) {\
770
+ STACK_AT(stk->u.repeat_inc.si)->u.repeat.count--;\
771
+ }\
772
+ else if (stk->type == STK_MEM_END) {\
773
+ mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\
774
+ mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\
775
+ }\
776
+ ELSE_IF_STATE_CHECK_MARK(stk);\
777
+ }\
778
+ break;\
779
+ }\
780
+ } while(0)
781
+
782
+ #define STACK_POP_TIL_POS_NOT do {\
783
+ while (1) {\
784
+ stk--;\
785
+ STACK_BASE_CHECK(stk, "STACK_POP_TIL_POS_NOT"); \
786
+ if (stk->type == STK_POS_NOT) break;\
787
+ else if (stk->type == STK_MEM_START) {\
788
+ mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\
789
+ mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\
790
+ }\
791
+ else if (stk->type == STK_REPEAT_INC) {\
792
+ STACK_AT(stk->u.repeat_inc.si)->u.repeat.count--;\
793
+ }\
794
+ else if (stk->type == STK_MEM_END) {\
795
+ mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\
796
+ mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\
797
+ }\
798
+ ELSE_IF_STATE_CHECK_MARK(stk);\
799
+ }\
800
+ } while(0)
801
+
802
+ #define STACK_POP_TIL_LOOK_BEHIND_NOT do {\
803
+ while (1) {\
804
+ stk--;\
805
+ STACK_BASE_CHECK(stk, "STACK_POP_TIL_LOOK_BEHIND_NOT"); \
806
+ if (stk->type == STK_LOOK_BEHIND_NOT) break;\
807
+ else if (stk->type == STK_MEM_START) {\
808
+ mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\
809
+ mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\
810
+ }\
811
+ else if (stk->type == STK_REPEAT_INC) {\
812
+ STACK_AT(stk->u.repeat_inc.si)->u.repeat.count--;\
813
+ }\
814
+ else if (stk->type == STK_MEM_END) {\
815
+ mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\
816
+ mem_end_stk[stk->u.mem.num] = stk->u.mem.end;\
817
+ }\
818
+ ELSE_IF_STATE_CHECK_MARK(stk);\
819
+ }\
820
+ } while(0)
821
+
822
+ #define STACK_POS_END(k) do {\
823
+ k = stk;\
824
+ while (1) {\
825
+ k--;\
826
+ STACK_BASE_CHECK(k, "STACK_POS_END"); \
827
+ if (IS_TO_VOID_TARGET(k)) {\
828
+ k->type = STK_VOID;\
829
+ }\
830
+ else if (k->type == STK_POS) {\
831
+ k->type = STK_VOID;\
832
+ break;\
833
+ }\
834
+ }\
835
+ } while(0)
836
+
837
+ #define STACK_STOP_BT_END do {\
838
+ OnigStackType *k = stk;\
839
+ while (1) {\
840
+ k--;\
841
+ STACK_BASE_CHECK(k, "STACK_STOP_BT_END"); \
842
+ if (IS_TO_VOID_TARGET(k)) {\
843
+ k->type = STK_VOID;\
844
+ }\
845
+ else if (k->type == STK_STOP_BT) {\
846
+ k->type = STK_VOID;\
847
+ break;\
848
+ }\
849
+ }\
850
+ } while(0)
851
+
852
+ #define STACK_NULL_CHECK(isnull,id,s) do {\
853
+ OnigStackType* k = stk;\
854
+ while (1) {\
855
+ k--;\
856
+ STACK_BASE_CHECK(k, "STACK_NULL_CHECK"); \
857
+ if (k->type == STK_NULL_CHECK_START) {\
858
+ if (k->u.null_check.num == (id)) {\
859
+ (isnull) = (k->u.null_check.pstr == (s));\
860
+ break;\
861
+ }\
862
+ }\
863
+ }\
864
+ } while(0)
865
+
866
+ #define STACK_NULL_CHECK_REC(isnull,id,s) do {\
867
+ int level = 0;\
868
+ OnigStackType* k = stk;\
869
+ while (1) {\
870
+ k--;\
871
+ STACK_BASE_CHECK(k, "STACK_NULL_CHECK_REC"); \
872
+ if (k->type == STK_NULL_CHECK_START) {\
873
+ if (k->u.null_check.num == (id)) {\
874
+ if (level == 0) {\
875
+ (isnull) = (k->u.null_check.pstr == (s));\
876
+ break;\
877
+ }\
878
+ else level--;\
879
+ }\
880
+ }\
881
+ else if (k->type == STK_NULL_CHECK_END) {\
882
+ level++;\
883
+ }\
884
+ }\
885
+ } while(0)
886
+
887
+ #define STACK_NULL_CHECK_MEMST(isnull,id,s,reg) do {\
888
+ OnigStackType* k = stk;\
889
+ while (1) {\
890
+ k--;\
891
+ STACK_BASE_CHECK(k, "STACK_NULL_CHECK_MEMST"); \
892
+ if (k->type == STK_NULL_CHECK_START) {\
893
+ if (k->u.null_check.num == (id)) {\
894
+ if (k->u.null_check.pstr != (s)) {\
895
+ (isnull) = 0;\
896
+ break;\
897
+ }\
898
+ else {\
899
+ UChar* endp;\
900
+ (isnull) = 1;\
901
+ while (k < stk) {\
902
+ if (k->type == STK_MEM_START) {\
903
+ if (k->u.mem.end == INVALID_STACK_INDEX) {\
904
+ (isnull) = 0; break;\
905
+ }\
906
+ if (BIT_STATUS_AT(reg->bt_mem_end, k->u.mem.num))\
907
+ endp = STACK_AT(k->u.mem.end)->u.mem.pstr;\
908
+ else\
909
+ endp = (UChar* )k->u.mem.end;\
910
+ if (STACK_AT(k->u.mem.start)->u.mem.pstr != endp) {\
911
+ (isnull) = 0; break;\
912
+ }\
913
+ else if (endp != s) {\
914
+ (isnull) = -1; /* empty, but position changed */ \
915
+ }\
916
+ }\
917
+ k++;\
918
+ }\
919
+ break;\
920
+ }\
921
+ }\
922
+ }\
923
+ }\
924
+ } while(0)
925
+
926
+ #define STACK_NULL_CHECK_MEMST_REC(isnull,id,s,reg) do {\
927
+ int level = 0;\
928
+ OnigStackType* k = stk;\
929
+ while (1) {\
930
+ k--;\
931
+ STACK_BASE_CHECK(k, "STACK_NULL_CHECK_MEMST_REC"); \
932
+ if (k->type == STK_NULL_CHECK_START) {\
933
+ if (k->u.null_check.num == (id)) {\
934
+ if (level == 0) {\
935
+ if (k->u.null_check.pstr != (s)) {\
936
+ (isnull) = 0;\
937
+ break;\
938
+ }\
939
+ else {\
940
+ UChar* endp;\
941
+ (isnull) = 1;\
942
+ while (k < stk) {\
943
+ if (k->type == STK_MEM_START) {\
944
+ if (k->u.mem.end == INVALID_STACK_INDEX) {\
945
+ (isnull) = 0; break;\
946
+ }\
947
+ if (BIT_STATUS_AT(reg->bt_mem_end, k->u.mem.num))\
948
+ endp = STACK_AT(k->u.mem.end)->u.mem.pstr;\
949
+ else\
950
+ endp = (UChar* )k->u.mem.end;\
951
+ if (STACK_AT(k->u.mem.start)->u.mem.pstr != endp) {\
952
+ (isnull) = 0; break;\
953
+ }\
954
+ else if (endp != s) {\
955
+ (isnull) = -1; /* empty, but position changed */ \
956
+ }\
957
+ }\
958
+ k++;\
959
+ }\
960
+ break;\
961
+ }\
962
+ }\
963
+ else {\
964
+ level--;\
965
+ }\
966
+ }\
967
+ }\
968
+ else if (k->type == STK_NULL_CHECK_END) {\
969
+ if (k->u.null_check.num == (id)) level++;\
970
+ }\
971
+ }\
972
+ } while(0)
973
+
974
+ #define STACK_GET_REPEAT(id, k) do {\
975
+ int level = 0;\
976
+ k = stk;\
977
+ while (1) {\
978
+ k--;\
979
+ STACK_BASE_CHECK(k, "STACK_GET_REPEAT"); \
980
+ if (k->type == STK_REPEAT) {\
981
+ if (level == 0) {\
982
+ if (k->u.repeat.num == (id)) {\
983
+ break;\
984
+ }\
985
+ }\
986
+ }\
987
+ else if (k->type == STK_CALL_FRAME) level--;\
988
+ else if (k->type == STK_RETURN) level++;\
989
+ }\
990
+ } while(0)
991
+
992
+ #define STACK_RETURN(addr) do {\
993
+ int level = 0;\
994
+ OnigStackType* k = stk;\
995
+ while (1) {\
996
+ k--;\
997
+ STACK_BASE_CHECK(k, "STACK_RETURN"); \
998
+ if (k->type == STK_CALL_FRAME) {\
999
+ if (level == 0) {\
1000
+ (addr) = k->u.call_frame.ret_addr;\
1001
+ break;\
1002
+ }\
1003
+ else level--;\
1004
+ }\
1005
+ else if (k->type == STK_RETURN)\
1006
+ level++;\
1007
+ }\
1008
+ } while(0)
1009
+
1010
+
1011
+ #define STRING_CMP(s1,s2,len) do {\
1012
+ while (len-- > 0) {\
1013
+ if (*s1++ != *s2++) goto fail;\
1014
+ }\
1015
+ } while(0)
1016
+
1017
+ #define STRING_CMP_IC(case_fold_flag,s1,ps2,len) do {\
1018
+ if (string_cmp_ic(encode, case_fold_flag, s1, ps2, len) == 0) \
1019
+ goto fail; \
1020
+ } while(0)
1021
+
1022
+ static int string_cmp_ic(OnigEncoding enc, int case_fold_flag,
1023
+ UChar* s1, UChar** ps2, int mblen)
1024
+ {
1025
+ UChar buf1[ONIGENC_MBC_CASE_FOLD_MAXLEN];
1026
+ UChar buf2[ONIGENC_MBC_CASE_FOLD_MAXLEN];
1027
+ UChar *p1, *p2, *end1, *s2, *end2;
1028
+ int len1, len2;
1029
+
1030
+ s2 = *ps2;
1031
+ end1 = s1 + mblen;
1032
+ end2 = s2 + mblen;
1033
+ while (s1 < end1) {
1034
+ len1 = ONIGENC_MBC_CASE_FOLD(enc, case_fold_flag, &s1, end1, buf1);
1035
+ len2 = ONIGENC_MBC_CASE_FOLD(enc, case_fold_flag, &s2, end2, buf2);
1036
+ if (len1 != len2) return 0;
1037
+ p1 = buf1;
1038
+ p2 = buf2;
1039
+ while (len1-- > 0) {
1040
+ if (*p1 != *p2) return 0;
1041
+ p1++;
1042
+ p2++;
1043
+ }
1044
+ }
1045
+
1046
+ *ps2 = s2;
1047
+ return 1;
1048
+ }
1049
+
1050
+ #define STRING_CMP_VALUE(s1,s2,len,is_fail) do {\
1051
+ is_fail = 0;\
1052
+ while (len-- > 0) {\
1053
+ if (*s1++ != *s2++) {\
1054
+ is_fail = 1; break;\
1055
+ }\
1056
+ }\
1057
+ } while(0)
1058
+
1059
+ #define STRING_CMP_VALUE_IC(case_fold_flag,s1,ps2,len,is_fail) do {\
1060
+ if (string_cmp_ic(encode, case_fold_flag, s1, ps2, len) == 0) \
1061
+ is_fail = 1; \
1062
+ else \
1063
+ is_fail = 0; \
1064
+ } while(0)
1065
+
1066
+
1067
+ #define IS_EMPTY_STR (str == end)
1068
+ #define ON_STR_BEGIN(s) ((s) == str)
1069
+ #define ON_STR_END(s) ((s) == end)
1070
+ #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE
1071
+ #define DATA_ENSURE_CHECK1 (s < right_range)
1072
+ #define DATA_ENSURE_CHECK(n) (s + (n) <= right_range)
1073
+ #define DATA_ENSURE(n) if (s + (n) > right_range) goto fail
1074
+ #else
1075
+ #define DATA_ENSURE_CHECK1 (s < end)
1076
+ #define DATA_ENSURE_CHECK(n) (s + (n) <= end)
1077
+ #define DATA_ENSURE(n) if (s + (n) > end) goto fail
1078
+ #endif /* USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE */
1079
+
1080
+
1081
+ #ifdef USE_CAPTURE_HISTORY
1082
+ static int
1083
+ make_capture_history_tree(OnigCaptureTreeNode* node, OnigStackType** kp,
1084
+ OnigStackType* stk_top, UChar* str, regex_t* reg)
1085
+ {
1086
+ int n, r;
1087
+ OnigCaptureTreeNode* child;
1088
+ OnigStackType* k = *kp;
1089
+
1090
+ while (k < stk_top) {
1091
+ if (k->type == STK_MEM_START) {
1092
+ n = k->u.mem.num;
1093
+ if (n <= ONIG_MAX_CAPTURE_HISTORY_GROUP &&
1094
+ BIT_STATUS_AT(reg->capture_history, n) != 0) {
1095
+ child = history_node_new();
1096
+ CHECK_NULL_RETURN_MEMERR(child);
1097
+ child->group = n;
1098
+ child->beg = (int )(k->u.mem.pstr - str);
1099
+ r = history_tree_add_child(node, child);
1100
+ if (r != 0) return r;
1101
+ *kp = (k + 1);
1102
+ r = make_capture_history_tree(child, kp, stk_top, str, reg);
1103
+ if (r != 0) return r;
1104
+
1105
+ k = *kp;
1106
+ child->end = (int )(k->u.mem.pstr - str);
1107
+ }
1108
+ }
1109
+ else if (k->type == STK_MEM_END) {
1110
+ if (k->u.mem.num == node->group) {
1111
+ node->end = (int )(k->u.mem.pstr - str);
1112
+ *kp = k;
1113
+ return 0;
1114
+ }
1115
+ }
1116
+ k++;
1117
+ }
1118
+
1119
+ return 1; /* 1: root node ending. */
1120
+ }
1121
+ #endif
1122
+
1123
+ #ifdef USE_BACKREF_WITH_LEVEL
1124
+ static int mem_is_in_memp(int mem, int num, UChar* memp)
1125
+ {
1126
+ int i;
1127
+ MemNumType m;
1128
+
1129
+ for (i = 0; i < num; i++) {
1130
+ GET_MEMNUM_INC(m, memp);
1131
+ if (mem == (int )m) return 1;
1132
+ }
1133
+ return 0;
1134
+ }
1135
+
1136
+ static int backref_match_at_nested_level(regex_t* reg
1137
+ , OnigStackType* top, OnigStackType* stk_base
1138
+ , int ignore_case, int case_fold_flag
1139
+ , int nest, int mem_num, UChar* memp, UChar** s, const UChar* send)
1140
+ {
1141
+ UChar *ss, *p, *pstart, *pend = NULL_UCHARP;
1142
+ int level;
1143
+ OnigStackType* k;
1144
+
1145
+ level = 0;
1146
+ k = top;
1147
+ k--;
1148
+ while (k >= stk_base) {
1149
+ if (k->type == STK_CALL_FRAME) {
1150
+ level--;
1151
+ }
1152
+ else if (k->type == STK_RETURN) {
1153
+ level++;
1154
+ }
1155
+ else if (level == nest) {
1156
+ if (k->type == STK_MEM_START) {
1157
+ if (mem_is_in_memp(k->u.mem.num, mem_num, memp)) {
1158
+ pstart = k->u.mem.pstr;
1159
+ if (pend != NULL_UCHARP) {
1160
+ if (pend - pstart > send - *s) return 0; /* or goto next_mem; */
1161
+ p = pstart;
1162
+ ss = *s;
1163
+
1164
+ if (ignore_case != 0) {
1165
+ if (string_cmp_ic(reg->enc, case_fold_flag,
1166
+ pstart, &ss, (int )(pend - pstart)) == 0)
1167
+ return 0; /* or goto next_mem; */
1168
+ }
1169
+ else {
1170
+ while (p < pend) {
1171
+ if (*p++ != *ss++) return 0; /* or goto next_mem; */
1172
+ }
1173
+ }
1174
+
1175
+ *s = ss;
1176
+ return 1;
1177
+ }
1178
+ }
1179
+ }
1180
+ else if (k->type == STK_MEM_END) {
1181
+ if (mem_is_in_memp(k->u.mem.num, mem_num, memp)) {
1182
+ pend = k->u.mem.pstr;
1183
+ }
1184
+ }
1185
+ }
1186
+ k--;
1187
+ }
1188
+
1189
+ return 0;
1190
+ }
1191
+ #endif /* USE_BACKREF_WITH_LEVEL */
1192
+
1193
+
1194
+ #ifdef ONIG_DEBUG_STATISTICS
1195
+
1196
+ #define USE_TIMEOFDAY
1197
+
1198
+ #ifdef USE_TIMEOFDAY
1199
+ #ifdef HAVE_SYS_TIME_H
1200
+ #include <sys/time.h>
1201
+ #endif
1202
+ #ifdef HAVE_UNISTD_H
1203
+ #include <unistd.h>
1204
+ #endif
1205
+ static struct timeval ts, te;
1206
+ #define GETTIME(t) gettimeofday(&(t), (struct timezone* )0)
1207
+ #define TIMEDIFF(te,ts) (((te).tv_usec - (ts).tv_usec) + \
1208
+ (((te).tv_sec - (ts).tv_sec)*1000000))
1209
+ #else
1210
+ #ifdef HAVE_SYS_TIMES_H
1211
+ #include <sys/times.h>
1212
+ #endif
1213
+ static struct tms ts, te;
1214
+ #define GETTIME(t) times(&(t))
1215
+ #define TIMEDIFF(te,ts) ((te).tms_utime - (ts).tms_utime)
1216
+ #endif
1217
+
1218
+ static int OpCounter[256];
1219
+ static int OpPrevCounter[256];
1220
+ static unsigned long OpTime[256];
1221
+ static int OpCurr = OP_FINISH;
1222
+ static int OpPrevTarget = OP_FAIL;
1223
+ static int MaxStackDepth = 0;
1224
+
1225
+ #define MOP_IN(opcode) do {\
1226
+ if (opcode == OpPrevTarget) OpPrevCounter[OpCurr]++;\
1227
+ OpCurr = opcode;\
1228
+ OpCounter[opcode]++;\
1229
+ GETTIME(ts);\
1230
+ } while(0)
1231
+
1232
+ #define MOP_OUT do {\
1233
+ GETTIME(te);\
1234
+ OpTime[OpCurr] += TIMEDIFF(te, ts);\
1235
+ } while(0)
1236
+
1237
+ extern void
1238
+ onig_statistics_init(void)
1239
+ {
1240
+ int i;
1241
+ for (i = 0; i < 256; i++) {
1242
+ OpCounter[i] = OpPrevCounter[i] = 0; OpTime[i] = 0;
1243
+ }
1244
+ MaxStackDepth = 0;
1245
+ }
1246
+
1247
+ extern void
1248
+ onig_print_statistics(FILE* f)
1249
+ {
1250
+ int i;
1251
+ fprintf(f, " count prev time\n");
1252
+ for (i = 0; OnigOpInfo[i].opcode >= 0; i++) {
1253
+ fprintf(f, "%8d: %8d: %10ld: %s\n",
1254
+ OpCounter[i], OpPrevCounter[i], OpTime[i], OnigOpInfo[i].name);
1255
+ }
1256
+ fprintf(f, "\nmax stack depth: %d\n", MaxStackDepth);
1257
+ }
1258
+
1259
+ #define STACK_INC do {\
1260
+ stk++;\
1261
+ if (stk - stk_base > MaxStackDepth) \
1262
+ MaxStackDepth = stk - stk_base;\
1263
+ } while(0)
1264
+
1265
+ #else
1266
+ #define STACK_INC stk++
1267
+
1268
+ #define MOP_IN(opcode)
1269
+ #define MOP_OUT
1270
+ #endif
1271
+
1272
+
1273
+ /* matching region of POSIX API */
1274
+ typedef int regoff_t;
1275
+
1276
+ typedef struct {
1277
+ regoff_t rm_so;
1278
+ regoff_t rm_eo;
1279
+ } posix_regmatch_t;
1280
+
1281
+ /* match data(str - end) from position (sstart). */
1282
+ /* if sstart == str then set sprev to NULL. */
1283
+ static int
1284
+ match_at(regex_t* reg, const UChar* str, const UChar* end,
1285
+ #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE
1286
+ const UChar* right_range,
1287
+ #endif
1288
+ const UChar* sstart, UChar* sprev, OnigMatchArg* msa)
1289
+ {
1290
+ static UChar FinishCode[] = { OP_FINISH };
1291
+
1292
+ int i, n, num_mem, best_len, pop_level;
1293
+ LengthType tlen, tlen2;
1294
+ MemNumType mem;
1295
+ RelAddrType addr;
1296
+ UChar *s, *q, *sbegin;
1297
+ int is_alloca;
1298
+ char *alloc_base;
1299
+ OnigStackType *stk_base, *stk, *stk_end;
1300
+ OnigStackType *stkp; /* used as any purpose. */
1301
+ OnigStackIndex si;
1302
+ OnigStackIndex *repeat_stk;
1303
+ OnigStackIndex *mem_start_stk, *mem_end_stk;
1304
+ #ifdef USE_COMBINATION_EXPLOSION_CHECK
1305
+ int scv;
1306
+ unsigned char* state_check_buff = msa->state_check_buff;
1307
+ int num_comb_exp_check = reg->num_comb_exp_check;
1308
+ #endif
1309
+ UChar *p = reg->p;
1310
+ OnigOptionType option = reg->options;
1311
+ OnigEncoding encode = reg->enc;
1312
+ OnigCaseFoldType case_fold_flag = reg->case_fold_flag;
1313
+
1314
+ //n = reg->num_repeat + reg->num_mem * 2;
1315
+ pop_level = reg->stack_pop_level;
1316
+ num_mem = reg->num_mem;
1317
+ STACK_INIT(INIT_MATCH_STACK_SIZE);
1318
+ UPDATE_FOR_STACK_REALLOC;
1319
+ for (i = 1; i <= num_mem; i++) {
1320
+ mem_start_stk[i] = mem_end_stk[i] = INVALID_STACK_INDEX;
1321
+ }
1322
+
1323
+ #ifdef ONIG_DEBUG_MATCH
1324
+ fprintf(stderr, "match_at: str: %d, end: %d, start: %d, sprev: %d\n",
1325
+ (int )str, (int )end, (int )sstart, (int )sprev);
1326
+ fprintf(stderr, "size: %d, start offset: %d\n",
1327
+ (int )(end - str), (int )(sstart - str));
1328
+ #endif
1329
+
1330
+ STACK_PUSH_ENSURED(STK_ALT, FinishCode); /* bottom stack */
1331
+ best_len = ONIG_MISMATCH;
1332
+ s = (UChar* )sstart;
1333
+ while (1) {
1334
+ #ifdef ONIG_DEBUG_MATCH
1335
+ {
1336
+ UChar *q, *bp, buf[50];
1337
+ int len;
1338
+ fprintf(stderr, "%4d> \"", (int )(s - str));
1339
+ bp = buf;
1340
+ for (i = 0, q = s; i < 7 && q < end; i++) {
1341
+ len = enclen(encode, q);
1342
+ while (len-- > 0) *bp++ = *q++;
1343
+ }
1344
+ if (q < end) { xmemcpy(bp, "...\"", 4); bp += 4; }
1345
+ else { xmemcpy(bp, "\"", 1); bp += 1; }
1346
+ *bp = 0;
1347
+ fputs((char* )buf, stderr);
1348
+ for (i = 0; i < 20 - (bp - buf); i++) fputc(' ', stderr);
1349
+ onig_print_compiled_byte_code(stderr, p, NULL, encode);
1350
+ fprintf(stderr, "\n");
1351
+ }
1352
+ #endif
1353
+
1354
+ sbegin = s;
1355
+ switch (*p++) {
1356
+ case OP_END: MOP_IN(OP_END);
1357
+ n = s - sstart;
1358
+ if (n > best_len) {
1359
+ OnigRegion* region;
1360
+ #ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE
1361
+ if (IS_FIND_LONGEST(option)) {
1362
+ if (n > msa->best_len) {
1363
+ msa->best_len = n;
1364
+ msa->best_s = (UChar* )sstart;
1365
+ }
1366
+ else
1367
+ goto end_best_len;
1368
+ }
1369
+ #endif
1370
+ best_len = n;
1371
+ region = msa->region;
1372
+ if (region) {
1373
+ #ifdef USE_POSIX_API_REGION_OPTION
1374
+ if (IS_POSIX_REGION(msa->options)) {
1375
+ posix_regmatch_t* rmt = (posix_regmatch_t* )region;
1376
+
1377
+ rmt[0].rm_so = sstart - str;
1378
+ rmt[0].rm_eo = s - str;
1379
+ for (i = 1; i <= num_mem; i++) {
1380
+ if (mem_end_stk[i] != INVALID_STACK_INDEX) {
1381
+ if (BIT_STATUS_AT(reg->bt_mem_start, i))
1382
+ rmt[i].rm_so = STACK_AT(mem_start_stk[i])->u.mem.pstr - str;
1383
+ else
1384
+ rmt[i].rm_so = (UChar* )((void* )(mem_start_stk[i])) - str;
1385
+
1386
+ rmt[i].rm_eo = (BIT_STATUS_AT(reg->bt_mem_end, i)
1387
+ ? STACK_AT(mem_end_stk[i])->u.mem.pstr
1388
+ : (UChar* )((void* )mem_end_stk[i])) - str;
1389
+ }
1390
+ else {
1391
+ rmt[i].rm_so = rmt[i].rm_eo = ONIG_REGION_NOTPOS;
1392
+ }
1393
+ }
1394
+ }
1395
+ else {
1396
+ #endif /* USE_POSIX_API_REGION_OPTION */
1397
+ region->beg[0] = sstart - str;
1398
+ region->end[0] = s - str;
1399
+ for (i = 1; i <= num_mem; i++) {
1400
+ if (mem_end_stk[i] != INVALID_STACK_INDEX) {
1401
+ if (BIT_STATUS_AT(reg->bt_mem_start, i))
1402
+ region->beg[i] = STACK_AT(mem_start_stk[i])->u.mem.pstr - str;
1403
+ else
1404
+ region->beg[i] = (UChar* )((void* )mem_start_stk[i]) - str;
1405
+
1406
+ region->end[i] = (BIT_STATUS_AT(reg->bt_mem_end, i)
1407
+ ? STACK_AT(mem_end_stk[i])->u.mem.pstr
1408
+ : (UChar* )((void* )mem_end_stk[i])) - str;
1409
+ }
1410
+ else {
1411
+ region->beg[i] = region->end[i] = ONIG_REGION_NOTPOS;
1412
+ }
1413
+ }
1414
+
1415
+ #ifdef USE_CAPTURE_HISTORY
1416
+ if (reg->capture_history != 0) {
1417
+ int r;
1418
+ OnigCaptureTreeNode* node;
1419
+
1420
+ if (IS_NULL(region->history_root)) {
1421
+ region->history_root = node = history_node_new();
1422
+ CHECK_NULL_RETURN_MEMERR(node);
1423
+ }
1424
+ else {
1425
+ node = region->history_root;
1426
+ history_tree_clear(node);
1427
+ }
1428
+
1429
+ node->group = 0;
1430
+ node->beg = sstart - str;
1431
+ node->end = s - str;
1432
+
1433
+ stkp = stk_base;
1434
+ r = make_capture_history_tree(region->history_root, &stkp,
1435
+ stk, (UChar* )str, reg);
1436
+ if (r < 0) {
1437
+ best_len = r; /* error code */
1438
+ goto finish;
1439
+ }
1440
+ }
1441
+ #endif /* USE_CAPTURE_HISTORY */
1442
+ #ifdef USE_POSIX_API_REGION_OPTION
1443
+ } /* else IS_POSIX_REGION() */
1444
+ #endif
1445
+ } /* if (region) */
1446
+ } /* n > best_len */
1447
+
1448
+ #ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE
1449
+ end_best_len:
1450
+ #endif
1451
+ MOP_OUT;
1452
+
1453
+ if (IS_FIND_CONDITION(option)) {
1454
+ if (IS_FIND_NOT_EMPTY(option) && s == sstart) {
1455
+ best_len = ONIG_MISMATCH;
1456
+ goto fail; /* for retry */
1457
+ }
1458
+ if (IS_FIND_LONGEST(option) && DATA_ENSURE_CHECK1) {
1459
+ goto fail; /* for retry */
1460
+ }
1461
+ }
1462
+
1463
+ /* default behavior: return first-matching result. */
1464
+ goto finish;
1465
+ break;
1466
+
1467
+ case OP_EXACT1: MOP_IN(OP_EXACT1);
1468
+ #if 0
1469
+ DATA_ENSURE(1);
1470
+ if (*p != *s) goto fail;
1471
+ p++; s++;
1472
+ #endif
1473
+ if (*p != *s++) goto fail;
1474
+ DATA_ENSURE(0);
1475
+ p++;
1476
+ MOP_OUT;
1477
+ break;
1478
+
1479
+ case OP_EXACT1_IC: MOP_IN(OP_EXACT1_IC);
1480
+ {
1481
+ int len;
1482
+ UChar *q, lowbuf[ONIGENC_MBC_CASE_FOLD_MAXLEN];
1483
+
1484
+ DATA_ENSURE(1);
1485
+ len = ONIGENC_MBC_CASE_FOLD(encode,
1486
+ /* DISABLE_CASE_FOLD_MULTI_CHAR(case_fold_flag), */
1487
+ case_fold_flag,
1488
+ &s, end, lowbuf);
1489
+ DATA_ENSURE(0);
1490
+ q = lowbuf;
1491
+ while (len-- > 0) {
1492
+ if (*p != *q) {
1493
+ goto fail;
1494
+ }
1495
+ p++; q++;
1496
+ }
1497
+ }
1498
+ MOP_OUT;
1499
+ break;
1500
+
1501
+ case OP_EXACT2: MOP_IN(OP_EXACT2);
1502
+ DATA_ENSURE(2);
1503
+ if (*p != *s) goto fail;
1504
+ p++; s++;
1505
+ if (*p != *s) goto fail;
1506
+ sprev = s;
1507
+ p++; s++;
1508
+ MOP_OUT;
1509
+ continue;
1510
+ break;
1511
+
1512
+ case OP_EXACT3: MOP_IN(OP_EXACT3);
1513
+ DATA_ENSURE(3);
1514
+ if (*p != *s) goto fail;
1515
+ p++; s++;
1516
+ if (*p != *s) goto fail;
1517
+ p++; s++;
1518
+ if (*p != *s) goto fail;
1519
+ sprev = s;
1520
+ p++; s++;
1521
+ MOP_OUT;
1522
+ continue;
1523
+ break;
1524
+
1525
+ case OP_EXACT4: MOP_IN(OP_EXACT4);
1526
+ DATA_ENSURE(4);
1527
+ if (*p != *s) goto fail;
1528
+ p++; s++;
1529
+ if (*p != *s) goto fail;
1530
+ p++; s++;
1531
+ if (*p != *s) goto fail;
1532
+ p++; s++;
1533
+ if (*p != *s) goto fail;
1534
+ sprev = s;
1535
+ p++; s++;
1536
+ MOP_OUT;
1537
+ continue;
1538
+ break;
1539
+
1540
+ case OP_EXACT5: MOP_IN(OP_EXACT5);
1541
+ DATA_ENSURE(5);
1542
+ if (*p != *s) goto fail;
1543
+ p++; s++;
1544
+ if (*p != *s) goto fail;
1545
+ p++; s++;
1546
+ if (*p != *s) goto fail;
1547
+ p++; s++;
1548
+ if (*p != *s) goto fail;
1549
+ p++; s++;
1550
+ if (*p != *s) goto fail;
1551
+ sprev = s;
1552
+ p++; s++;
1553
+ MOP_OUT;
1554
+ continue;
1555
+ break;
1556
+
1557
+ case OP_EXACTN: MOP_IN(OP_EXACTN);
1558
+ GET_LENGTH_INC(tlen, p);
1559
+ DATA_ENSURE(tlen);
1560
+ while (tlen-- > 0) {
1561
+ if (*p++ != *s++) goto fail;
1562
+ }
1563
+ sprev = s - 1;
1564
+ MOP_OUT;
1565
+ continue;
1566
+ break;
1567
+
1568
+ case OP_EXACTN_IC: MOP_IN(OP_EXACTN_IC);
1569
+ {
1570
+ int len;
1571
+ UChar *q, *endp, lowbuf[ONIGENC_MBC_CASE_FOLD_MAXLEN];
1572
+
1573
+ GET_LENGTH_INC(tlen, p);
1574
+ endp = p + tlen;
1575
+
1576
+ while (p < endp) {
1577
+ sprev = s;
1578
+ DATA_ENSURE(1);
1579
+ len = ONIGENC_MBC_CASE_FOLD(encode,
1580
+ /* DISABLE_CASE_FOLD_MULTI_CHAR(case_fold_flag), */
1581
+ case_fold_flag,
1582
+ &s, end, lowbuf);
1583
+ DATA_ENSURE(0);
1584
+ q = lowbuf;
1585
+ while (len-- > 0) {
1586
+ if (*p != *q) goto fail;
1587
+ p++; q++;
1588
+ }
1589
+ }
1590
+ }
1591
+
1592
+ MOP_OUT;
1593
+ continue;
1594
+ break;
1595
+
1596
+ case OP_EXACTMB2N1: MOP_IN(OP_EXACTMB2N1);
1597
+ DATA_ENSURE(2);
1598
+ if (*p != *s) goto fail;
1599
+ p++; s++;
1600
+ if (*p != *s) goto fail;
1601
+ p++; s++;
1602
+ MOP_OUT;
1603
+ break;
1604
+
1605
+ case OP_EXACTMB2N2: MOP_IN(OP_EXACTMB2N2);
1606
+ DATA_ENSURE(4);
1607
+ if (*p != *s) goto fail;
1608
+ p++; s++;
1609
+ if (*p != *s) goto fail;
1610
+ p++; s++;
1611
+ sprev = s;
1612
+ if (*p != *s) goto fail;
1613
+ p++; s++;
1614
+ if (*p != *s) goto fail;
1615
+ p++; s++;
1616
+ MOP_OUT;
1617
+ continue;
1618
+ break;
1619
+
1620
+ case OP_EXACTMB2N3: MOP_IN(OP_EXACTMB2N3);
1621
+ DATA_ENSURE(6);
1622
+ if (*p != *s) goto fail;
1623
+ p++; s++;
1624
+ if (*p != *s) goto fail;
1625
+ p++; s++;
1626
+ if (*p != *s) goto fail;
1627
+ p++; s++;
1628
+ if (*p != *s) goto fail;
1629
+ p++; s++;
1630
+ sprev = s;
1631
+ if (*p != *s) goto fail;
1632
+ p++; s++;
1633
+ if (*p != *s) goto fail;
1634
+ p++; s++;
1635
+ MOP_OUT;
1636
+ continue;
1637
+ break;
1638
+
1639
+ case OP_EXACTMB2N: MOP_IN(OP_EXACTMB2N);
1640
+ GET_LENGTH_INC(tlen, p);
1641
+ DATA_ENSURE(tlen * 2);
1642
+ while (tlen-- > 0) {
1643
+ if (*p != *s) goto fail;
1644
+ p++; s++;
1645
+ if (*p != *s) goto fail;
1646
+ p++; s++;
1647
+ }
1648
+ sprev = s - 2;
1649
+ MOP_OUT;
1650
+ continue;
1651
+ break;
1652
+
1653
+ case OP_EXACTMB3N: MOP_IN(OP_EXACTMB3N);
1654
+ GET_LENGTH_INC(tlen, p);
1655
+ DATA_ENSURE(tlen * 3);
1656
+ while (tlen-- > 0) {
1657
+ if (*p != *s) goto fail;
1658
+ p++; s++;
1659
+ if (*p != *s) goto fail;
1660
+ p++; s++;
1661
+ if (*p != *s) goto fail;
1662
+ p++; s++;
1663
+ }
1664
+ sprev = s - 3;
1665
+ MOP_OUT;
1666
+ continue;
1667
+ break;
1668
+
1669
+ case OP_EXACTMBN: MOP_IN(OP_EXACTMBN);
1670
+ GET_LENGTH_INC(tlen, p); /* mb-len */
1671
+ GET_LENGTH_INC(tlen2, p); /* string len */
1672
+ tlen2 *= tlen;
1673
+ DATA_ENSURE(tlen2);
1674
+ while (tlen2-- > 0) {
1675
+ if (*p != *s) goto fail;
1676
+ p++; s++;
1677
+ }
1678
+ sprev = s - tlen;
1679
+ MOP_OUT;
1680
+ continue;
1681
+ break;
1682
+
1683
+ case OP_CCLASS: MOP_IN(OP_CCLASS);
1684
+ DATA_ENSURE(1);
1685
+ if (BITSET_AT(((BitSetRef )p), *s) == 0) goto fail;
1686
+ p += SIZE_BITSET;
1687
+ s += enclen(encode, s); /* OP_CCLASS can match mb-code. \D, \S */
1688
+ MOP_OUT;
1689
+ break;
1690
+
1691
+ case OP_CCLASS_MB: MOP_IN(OP_CCLASS_MB);
1692
+ if (! ONIGENC_IS_MBC_HEAD(encode, s)) goto fail;
1693
+
1694
+ cclass_mb:
1695
+ GET_LENGTH_INC(tlen, p);
1696
+ {
1697
+ OnigCodePoint code;
1698
+ UChar *ss;
1699
+ int mb_len;
1700
+
1701
+ DATA_ENSURE(1);
1702
+ mb_len = enclen(encode, s);
1703
+ DATA_ENSURE(mb_len);
1704
+ ss = s;
1705
+ s += mb_len;
1706
+ code = ONIGENC_MBC_TO_CODE(encode, ss, s);
1707
+
1708
+ #ifdef PLATFORM_UNALIGNED_WORD_ACCESS
1709
+ if (! onig_is_in_code_range(p, code)) goto fail;
1710
+ #else
1711
+ q = p;
1712
+ ALIGNMENT_RIGHT(q);
1713
+ if (! onig_is_in_code_range(q, code)) goto fail;
1714
+ #endif
1715
+ }
1716
+ p += tlen;
1717
+ MOP_OUT;
1718
+ break;
1719
+
1720
+ case OP_CCLASS_MIX: MOP_IN(OP_CCLASS_MIX);
1721
+ DATA_ENSURE(1);
1722
+ if (ONIGENC_IS_MBC_HEAD(encode, s)) {
1723
+ p += SIZE_BITSET;
1724
+ goto cclass_mb;
1725
+ }
1726
+ else {
1727
+ if (BITSET_AT(((BitSetRef )p), *s) == 0)
1728
+ goto fail;
1729
+
1730
+ p += SIZE_BITSET;
1731
+ GET_LENGTH_INC(tlen, p);
1732
+ p += tlen;
1733
+ s++;
1734
+ }
1735
+ MOP_OUT;
1736
+ break;
1737
+
1738
+ case OP_CCLASS_NOT: MOP_IN(OP_CCLASS_NOT);
1739
+ DATA_ENSURE(1);
1740
+ if (BITSET_AT(((BitSetRef )p), *s) != 0) goto fail;
1741
+ p += SIZE_BITSET;
1742
+ s += enclen(encode, s);
1743
+ MOP_OUT;
1744
+ break;
1745
+
1746
+ case OP_CCLASS_MB_NOT: MOP_IN(OP_CCLASS_MB_NOT);
1747
+ DATA_ENSURE(1);
1748
+ if (! ONIGENC_IS_MBC_HEAD(encode, s)) {
1749
+ s++;
1750
+ GET_LENGTH_INC(tlen, p);
1751
+ p += tlen;
1752
+ goto cc_mb_not_success;
1753
+ }
1754
+
1755
+ cclass_mb_not:
1756
+ GET_LENGTH_INC(tlen, p);
1757
+ {
1758
+ OnigCodePoint code;
1759
+ UChar *ss;
1760
+ int mb_len = enclen(encode, s);
1761
+
1762
+ if (! DATA_ENSURE_CHECK(mb_len)) {
1763
+ DATA_ENSURE(1);
1764
+ s = (UChar* )end;
1765
+ p += tlen;
1766
+ goto cc_mb_not_success;
1767
+ }
1768
+
1769
+ ss = s;
1770
+ s += mb_len;
1771
+ code = ONIGENC_MBC_TO_CODE(encode, ss, s);
1772
+
1773
+ #ifdef PLATFORM_UNALIGNED_WORD_ACCESS
1774
+ if (onig_is_in_code_range(p, code)) goto fail;
1775
+ #else
1776
+ q = p;
1777
+ ALIGNMENT_RIGHT(q);
1778
+ if (onig_is_in_code_range(q, code)) goto fail;
1779
+ #endif
1780
+ }
1781
+ p += tlen;
1782
+
1783
+ cc_mb_not_success:
1784
+ MOP_OUT;
1785
+ break;
1786
+
1787
+ case OP_CCLASS_MIX_NOT: MOP_IN(OP_CCLASS_MIX_NOT);
1788
+ DATA_ENSURE(1);
1789
+ if (ONIGENC_IS_MBC_HEAD(encode, s)) {
1790
+ p += SIZE_BITSET;
1791
+ goto cclass_mb_not;
1792
+ }
1793
+ else {
1794
+ if (BITSET_AT(((BitSetRef )p), *s) != 0)
1795
+ goto fail;
1796
+
1797
+ p += SIZE_BITSET;
1798
+ GET_LENGTH_INC(tlen, p);
1799
+ p += tlen;
1800
+ s++;
1801
+ }
1802
+ MOP_OUT;
1803
+ break;
1804
+
1805
+ case OP_CCLASS_NODE: MOP_IN(OP_CCLASS_NODE);
1806
+ {
1807
+ OnigCodePoint code;
1808
+ void *node;
1809
+ int mb_len;
1810
+ UChar *ss;
1811
+
1812
+ DATA_ENSURE(1);
1813
+ GET_POINTER_INC(node, p);
1814
+ mb_len = enclen(encode, s);
1815
+ ss = s;
1816
+ s += mb_len;
1817
+ DATA_ENSURE(0);
1818
+ code = ONIGENC_MBC_TO_CODE(encode, ss, s);
1819
+ if (onig_is_code_in_cc_len(mb_len, code, node) == 0) goto fail;
1820
+ }
1821
+ MOP_OUT;
1822
+ break;
1823
+
1824
+ case OP_ANYCHAR: MOP_IN(OP_ANYCHAR);
1825
+ DATA_ENSURE(1);
1826
+ n = enclen(encode, s);
1827
+ DATA_ENSURE(n);
1828
+ if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) goto fail;
1829
+ s += n;
1830
+ MOP_OUT;
1831
+ break;
1832
+
1833
+ case OP_ANYCHAR_ML: MOP_IN(OP_ANYCHAR_ML);
1834
+ DATA_ENSURE(1);
1835
+ n = enclen(encode, s);
1836
+ DATA_ENSURE(n);
1837
+ s += n;
1838
+ MOP_OUT;
1839
+ break;
1840
+
1841
+ case OP_ANYCHAR_STAR: MOP_IN(OP_ANYCHAR_STAR);
1842
+ while (DATA_ENSURE_CHECK1) {
1843
+ STACK_PUSH_ALT(p, s, sprev);
1844
+ n = enclen(encode, s);
1845
+ DATA_ENSURE(n);
1846
+ if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) goto fail;
1847
+ sprev = s;
1848
+ s += n;
1849
+ }
1850
+ MOP_OUT;
1851
+ break;
1852
+
1853
+ case OP_ANYCHAR_ML_STAR: MOP_IN(OP_ANYCHAR_ML_STAR);
1854
+ while (DATA_ENSURE_CHECK1) {
1855
+ STACK_PUSH_ALT(p, s, sprev);
1856
+ n = enclen(encode, s);
1857
+ if (n > 1) {
1858
+ DATA_ENSURE(n);
1859
+ sprev = s;
1860
+ s += n;
1861
+ }
1862
+ else {
1863
+ sprev = s;
1864
+ s++;
1865
+ }
1866
+ }
1867
+ MOP_OUT;
1868
+ break;
1869
+
1870
+ case OP_ANYCHAR_STAR_PEEK_NEXT: MOP_IN(OP_ANYCHAR_STAR_PEEK_NEXT);
1871
+ while (DATA_ENSURE_CHECK1) {
1872
+ if (*p == *s) {
1873
+ STACK_PUSH_ALT(p + 1, s, sprev);
1874
+ }
1875
+ n = enclen(encode, s);
1876
+ DATA_ENSURE(n);
1877
+ if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) goto fail;
1878
+ sprev = s;
1879
+ s += n;
1880
+ }
1881
+ p++;
1882
+ MOP_OUT;
1883
+ break;
1884
+
1885
+ case OP_ANYCHAR_ML_STAR_PEEK_NEXT:MOP_IN(OP_ANYCHAR_ML_STAR_PEEK_NEXT);
1886
+ while (DATA_ENSURE_CHECK1) {
1887
+ if (*p == *s) {
1888
+ STACK_PUSH_ALT(p + 1, s, sprev);
1889
+ }
1890
+ n = enclen(encode, s);
1891
+ if (n > 1) {
1892
+ DATA_ENSURE(n);
1893
+ sprev = s;
1894
+ s += n;
1895
+ }
1896
+ else {
1897
+ sprev = s;
1898
+ s++;
1899
+ }
1900
+ }
1901
+ p++;
1902
+ MOP_OUT;
1903
+ break;
1904
+
1905
+ #ifdef USE_COMBINATION_EXPLOSION_CHECK
1906
+ case OP_STATE_CHECK_ANYCHAR_STAR: MOP_IN(OP_STATE_CHECK_ANYCHAR_STAR);
1907
+ GET_STATE_CHECK_NUM_INC(mem, p);
1908
+ while (DATA_ENSURE_CHECK1) {
1909
+ STATE_CHECK_VAL(scv, mem);
1910
+ if (scv) goto fail;
1911
+
1912
+ STACK_PUSH_ALT_WITH_STATE_CHECK(p, s, sprev, mem);
1913
+ n = enclen(encode, s);
1914
+ DATA_ENSURE(n);
1915
+ if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) goto fail;
1916
+ sprev = s;
1917
+ s += n;
1918
+ }
1919
+ MOP_OUT;
1920
+ break;
1921
+
1922
+ case OP_STATE_CHECK_ANYCHAR_ML_STAR:
1923
+ MOP_IN(OP_STATE_CHECK_ANYCHAR_ML_STAR);
1924
+
1925
+ GET_STATE_CHECK_NUM_INC(mem, p);
1926
+ while (DATA_ENSURE_CHECK1) {
1927
+ STATE_CHECK_VAL(scv, mem);
1928
+ if (scv) goto fail;
1929
+
1930
+ STACK_PUSH_ALT_WITH_STATE_CHECK(p, s, sprev, mem);
1931
+ n = enclen(encode, s);
1932
+ if (n > 1) {
1933
+ DATA_ENSURE(n);
1934
+ sprev = s;
1935
+ s += n;
1936
+ }
1937
+ else {
1938
+ sprev = s;
1939
+ s++;
1940
+ }
1941
+ }
1942
+ MOP_OUT;
1943
+ break;
1944
+ #endif /* USE_COMBINATION_EXPLOSION_CHECK */
1945
+
1946
+ case OP_WORD: MOP_IN(OP_WORD);
1947
+ DATA_ENSURE(1);
1948
+ if (! ONIGENC_IS_MBC_WORD(encode, s, end))
1949
+ goto fail;
1950
+
1951
+ s += enclen(encode, s);
1952
+ MOP_OUT;
1953
+ break;
1954
+
1955
+ case OP_NOT_WORD: MOP_IN(OP_NOT_WORD);
1956
+ DATA_ENSURE(1);
1957
+ if (ONIGENC_IS_MBC_WORD(encode, s, end))
1958
+ goto fail;
1959
+
1960
+ s += enclen(encode, s);
1961
+ MOP_OUT;
1962
+ break;
1963
+
1964
+ case OP_WORD_BOUND: MOP_IN(OP_WORD_BOUND);
1965
+ if (ON_STR_BEGIN(s)) {
1966
+ DATA_ENSURE(1);
1967
+ if (! ONIGENC_IS_MBC_WORD(encode, s, end))
1968
+ goto fail;
1969
+ }
1970
+ else if (ON_STR_END(s)) {
1971
+ if (! ONIGENC_IS_MBC_WORD(encode, sprev, end))
1972
+ goto fail;
1973
+ }
1974
+ else {
1975
+ if (ONIGENC_IS_MBC_WORD(encode, s, end)
1976
+ == ONIGENC_IS_MBC_WORD(encode, sprev, end))
1977
+ goto fail;
1978
+ }
1979
+ MOP_OUT;
1980
+ continue;
1981
+ break;
1982
+
1983
+ case OP_NOT_WORD_BOUND: MOP_IN(OP_NOT_WORD_BOUND);
1984
+ if (ON_STR_BEGIN(s)) {
1985
+ if (DATA_ENSURE_CHECK1 && ONIGENC_IS_MBC_WORD(encode, s, end))
1986
+ goto fail;
1987
+ }
1988
+ else if (ON_STR_END(s)) {
1989
+ if (ONIGENC_IS_MBC_WORD(encode, sprev, end))
1990
+ goto fail;
1991
+ }
1992
+ else {
1993
+ if (ONIGENC_IS_MBC_WORD(encode, s, end)
1994
+ != ONIGENC_IS_MBC_WORD(encode, sprev, end))
1995
+ goto fail;
1996
+ }
1997
+ MOP_OUT;
1998
+ continue;
1999
+ break;
2000
+
2001
+ #ifdef USE_WORD_BEGIN_END
2002
+ case OP_WORD_BEGIN: MOP_IN(OP_WORD_BEGIN);
2003
+ if (DATA_ENSURE_CHECK1 && ONIGENC_IS_MBC_WORD(encode, s, end)) {
2004
+ if (ON_STR_BEGIN(s) || !ONIGENC_IS_MBC_WORD(encode, sprev, end)) {
2005
+ MOP_OUT;
2006
+ continue;
2007
+ }
2008
+ }
2009
+ goto fail;
2010
+ break;
2011
+
2012
+ case OP_WORD_END: MOP_IN(OP_WORD_END);
2013
+ if (!ON_STR_BEGIN(s) && ONIGENC_IS_MBC_WORD(encode, sprev, end)) {
2014
+ if (ON_STR_END(s) || !ONIGENC_IS_MBC_WORD(encode, s, end)) {
2015
+ MOP_OUT;
2016
+ continue;
2017
+ }
2018
+ }
2019
+ goto fail;
2020
+ break;
2021
+ #endif
2022
+
2023
+ case OP_BEGIN_BUF: MOP_IN(OP_BEGIN_BUF);
2024
+ if (! ON_STR_BEGIN(s)) goto fail;
2025
+
2026
+ MOP_OUT;
2027
+ continue;
2028
+ break;
2029
+
2030
+ case OP_END_BUF: MOP_IN(OP_END_BUF);
2031
+ if (! ON_STR_END(s)) goto fail;
2032
+
2033
+ MOP_OUT;
2034
+ continue;
2035
+ break;
2036
+
2037
+ case OP_BEGIN_LINE: MOP_IN(OP_BEGIN_LINE);
2038
+ if (ON_STR_BEGIN(s)) {
2039
+ if (IS_NOTBOL(msa->options)) goto fail;
2040
+ MOP_OUT;
2041
+ continue;
2042
+ }
2043
+ else if (ONIGENC_IS_MBC_NEWLINE(encode, sprev, end) && !ON_STR_END(s)) {
2044
+ MOP_OUT;
2045
+ continue;
2046
+ }
2047
+ goto fail;
2048
+ break;
2049
+
2050
+ case OP_END_LINE: MOP_IN(OP_END_LINE);
2051
+ if (ON_STR_END(s)) {
2052
+ #ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE
2053
+ if (IS_EMPTY_STR || !ONIGENC_IS_MBC_NEWLINE(encode, sprev, end)) {
2054
+ #endif
2055
+ if (IS_NOTEOL(msa->options)) goto fail;
2056
+ MOP_OUT;
2057
+ continue;
2058
+ #ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE
2059
+ }
2060
+ #endif
2061
+ }
2062
+ else if (ONIGENC_IS_MBC_NEWLINE(encode, s, end)) {
2063
+ MOP_OUT;
2064
+ continue;
2065
+ }
2066
+ #ifdef USE_CRNL_AS_LINE_TERMINATOR
2067
+ else if (ONIGENC_IS_MBC_CRNL(encode, s, end)) {
2068
+ MOP_OUT;
2069
+ continue;
2070
+ }
2071
+ #endif
2072
+ goto fail;
2073
+ break;
2074
+
2075
+ case OP_SEMI_END_BUF: MOP_IN(OP_SEMI_END_BUF);
2076
+ if (ON_STR_END(s)) {
2077
+ #ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE
2078
+ if (IS_EMPTY_STR || !ONIGENC_IS_MBC_NEWLINE(encode, sprev, end)) {
2079
+ #endif
2080
+ if (IS_NOTEOL(msa->options)) goto fail;
2081
+ MOP_OUT;
2082
+ continue;
2083
+ #ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE
2084
+ }
2085
+ #endif
2086
+ }
2087
+ else if (ONIGENC_IS_MBC_NEWLINE(encode, s, end) &&
2088
+ ON_STR_END(s + enclen(encode, s))) {
2089
+ MOP_OUT;
2090
+ continue;
2091
+ }
2092
+ #ifdef USE_CRNL_AS_LINE_TERMINATOR
2093
+ else if (ONIGENC_IS_MBC_CRNL(encode, s, end)) {
2094
+ UChar* ss = s + enclen(encode, s);
2095
+ ss += enclen(encode, ss);
2096
+ if (ON_STR_END(ss)) {
2097
+ MOP_OUT;
2098
+ continue;
2099
+ }
2100
+ }
2101
+ #endif
2102
+ goto fail;
2103
+ break;
2104
+
2105
+ case OP_BEGIN_POSITION: MOP_IN(OP_BEGIN_POSITION);
2106
+ if (s != msa->start)
2107
+ goto fail;
2108
+
2109
+ MOP_OUT;
2110
+ continue;
2111
+ break;
2112
+
2113
+ case OP_MEMORY_START_PUSH: MOP_IN(OP_MEMORY_START_PUSH);
2114
+ GET_MEMNUM_INC(mem, p);
2115
+ STACK_PUSH_MEM_START(mem, s);
2116
+ MOP_OUT;
2117
+ continue;
2118
+ break;
2119
+
2120
+ case OP_MEMORY_START: MOP_IN(OP_MEMORY_START);
2121
+ GET_MEMNUM_INC(mem, p);
2122
+ mem_start_stk[mem] = (OnigStackIndex )((void* )s);
2123
+ MOP_OUT;
2124
+ continue;
2125
+ break;
2126
+
2127
+ case OP_MEMORY_END_PUSH: MOP_IN(OP_MEMORY_END_PUSH);
2128
+ GET_MEMNUM_INC(mem, p);
2129
+ STACK_PUSH_MEM_END(mem, s);
2130
+ MOP_OUT;
2131
+ continue;
2132
+ break;
2133
+
2134
+ case OP_MEMORY_END: MOP_IN(OP_MEMORY_END);
2135
+ GET_MEMNUM_INC(mem, p);
2136
+ mem_end_stk[mem] = (OnigStackIndex )((void* )s);
2137
+ MOP_OUT;
2138
+ continue;
2139
+ break;
2140
+
2141
+ #ifdef USE_SUBEXP_CALL
2142
+ case OP_MEMORY_END_PUSH_REC: MOP_IN(OP_MEMORY_END_PUSH_REC);
2143
+ GET_MEMNUM_INC(mem, p);
2144
+ STACK_GET_MEM_START(mem, stkp); /* should be before push mem-end. */
2145
+ STACK_PUSH_MEM_END(mem, s);
2146
+ mem_start_stk[mem] = GET_STACK_INDEX(stkp);
2147
+ MOP_OUT;
2148
+ continue;
2149
+ break;
2150
+
2151
+ case OP_MEMORY_END_REC: MOP_IN(OP_MEMORY_END_REC);
2152
+ GET_MEMNUM_INC(mem, p);
2153
+ mem_end_stk[mem] = (OnigStackIndex )((void* )s);
2154
+ STACK_GET_MEM_START(mem, stkp);
2155
+
2156
+ if (BIT_STATUS_AT(reg->bt_mem_start, mem))
2157
+ mem_start_stk[mem] = GET_STACK_INDEX(stkp);
2158
+ else
2159
+ mem_start_stk[mem] = (OnigStackIndex )((void* )stkp->u.mem.pstr);
2160
+
2161
+ STACK_PUSH_MEM_END_MARK(mem);
2162
+ MOP_OUT;
2163
+ continue;
2164
+ break;
2165
+ #endif
2166
+
2167
+ case OP_BACKREF1: MOP_IN(OP_BACKREF1);
2168
+ mem = 1;
2169
+ goto backref;
2170
+ break;
2171
+
2172
+ case OP_BACKREF2: MOP_IN(OP_BACKREF2);
2173
+ mem = 2;
2174
+ goto backref;
2175
+ break;
2176
+
2177
+ case OP_BACKREFN: MOP_IN(OP_BACKREFN);
2178
+ GET_MEMNUM_INC(mem, p);
2179
+ backref:
2180
+ {
2181
+ int len;
2182
+ UChar *pstart, *pend;
2183
+
2184
+ /* if you want to remove following line,
2185
+ you should check in parse and compile time. */
2186
+ if (mem > num_mem) goto fail;
2187
+ if (mem_end_stk[mem] == INVALID_STACK_INDEX) goto fail;
2188
+ if (mem_start_stk[mem] == INVALID_STACK_INDEX) goto fail;
2189
+
2190
+ if (BIT_STATUS_AT(reg->bt_mem_start, mem))
2191
+ pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;
2192
+ else
2193
+ pstart = (UChar* )((void* )mem_start_stk[mem]);
2194
+
2195
+ pend = (BIT_STATUS_AT(reg->bt_mem_end, mem)
2196
+ ? STACK_AT(mem_end_stk[mem])->u.mem.pstr
2197
+ : (UChar* )((void* )mem_end_stk[mem]));
2198
+ n = pend - pstart;
2199
+ DATA_ENSURE(n);
2200
+ sprev = s;
2201
+ STRING_CMP(pstart, s, n);
2202
+ while (sprev + (len = enclen(encode, sprev)) < s)
2203
+ sprev += len;
2204
+
2205
+ MOP_OUT;
2206
+ continue;
2207
+ }
2208
+ break;
2209
+
2210
+ case OP_BACKREFN_IC: MOP_IN(OP_BACKREFN_IC);
2211
+ GET_MEMNUM_INC(mem, p);
2212
+ {
2213
+ int len;
2214
+ UChar *pstart, *pend;
2215
+
2216
+ /* if you want to remove following line,
2217
+ you should check in parse and compile time. */
2218
+ if (mem > num_mem) goto fail;
2219
+ if (mem_end_stk[mem] == INVALID_STACK_INDEX) goto fail;
2220
+ if (mem_start_stk[mem] == INVALID_STACK_INDEX) goto fail;
2221
+
2222
+ if (BIT_STATUS_AT(reg->bt_mem_start, mem))
2223
+ pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;
2224
+ else
2225
+ pstart = (UChar* )((void* )mem_start_stk[mem]);
2226
+
2227
+ pend = (BIT_STATUS_AT(reg->bt_mem_end, mem)
2228
+ ? STACK_AT(mem_end_stk[mem])->u.mem.pstr
2229
+ : (UChar* )((void* )mem_end_stk[mem]));
2230
+ n = pend - pstart;
2231
+ DATA_ENSURE(n);
2232
+ sprev = s;
2233
+ STRING_CMP_IC(case_fold_flag, pstart, &s, n);
2234
+ while (sprev + (len = enclen(encode, sprev)) < s)
2235
+ sprev += len;
2236
+
2237
+ MOP_OUT;
2238
+ continue;
2239
+ }
2240
+ break;
2241
+
2242
+ case OP_BACKREF_MULTI: MOP_IN(OP_BACKREF_MULTI);
2243
+ {
2244
+ int len, is_fail;
2245
+ UChar *pstart, *pend, *swork;
2246
+
2247
+ GET_LENGTH_INC(tlen, p);
2248
+ for (i = 0; i < tlen; i++) {
2249
+ GET_MEMNUM_INC(mem, p);
2250
+
2251
+ if (mem_end_stk[mem] == INVALID_STACK_INDEX) continue;
2252
+ if (mem_start_stk[mem] == INVALID_STACK_INDEX) continue;
2253
+
2254
+ if (BIT_STATUS_AT(reg->bt_mem_start, mem))
2255
+ pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;
2256
+ else
2257
+ pstart = (UChar* )((void* )mem_start_stk[mem]);
2258
+
2259
+ pend = (BIT_STATUS_AT(reg->bt_mem_end, mem)
2260
+ ? STACK_AT(mem_end_stk[mem])->u.mem.pstr
2261
+ : (UChar* )((void* )mem_end_stk[mem]));
2262
+ n = pend - pstart;
2263
+ DATA_ENSURE(n);
2264
+ sprev = s;
2265
+ swork = s;
2266
+ STRING_CMP_VALUE(pstart, swork, n, is_fail);
2267
+ if (is_fail) continue;
2268
+ s = swork;
2269
+ while (sprev + (len = enclen(encode, sprev)) < s)
2270
+ sprev += len;
2271
+
2272
+ p += (SIZE_MEMNUM * (tlen - i - 1));
2273
+ break; /* success */
2274
+ }
2275
+ if (i == tlen) goto fail;
2276
+ MOP_OUT;
2277
+ continue;
2278
+ }
2279
+ break;
2280
+
2281
+ case OP_BACKREF_MULTI_IC: MOP_IN(OP_BACKREF_MULTI_IC);
2282
+ {
2283
+ int len, is_fail;
2284
+ UChar *pstart, *pend, *swork;
2285
+
2286
+ GET_LENGTH_INC(tlen, p);
2287
+ for (i = 0; i < tlen; i++) {
2288
+ GET_MEMNUM_INC(mem, p);
2289
+
2290
+ if (mem_end_stk[mem] == INVALID_STACK_INDEX) continue;
2291
+ if (mem_start_stk[mem] == INVALID_STACK_INDEX) continue;
2292
+
2293
+ if (BIT_STATUS_AT(reg->bt_mem_start, mem))
2294
+ pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;
2295
+ else
2296
+ pstart = (UChar* )((void* )mem_start_stk[mem]);
2297
+
2298
+ pend = (BIT_STATUS_AT(reg->bt_mem_end, mem)
2299
+ ? STACK_AT(mem_end_stk[mem])->u.mem.pstr
2300
+ : (UChar* )((void* )mem_end_stk[mem]));
2301
+ n = pend - pstart;
2302
+ DATA_ENSURE(n);
2303
+ sprev = s;
2304
+ swork = s;
2305
+ STRING_CMP_VALUE_IC(case_fold_flag, pstart, &swork, n, is_fail);
2306
+ if (is_fail) continue;
2307
+ s = swork;
2308
+ while (sprev + (len = enclen(encode, sprev)) < s)
2309
+ sprev += len;
2310
+
2311
+ p += (SIZE_MEMNUM * (tlen - i - 1));
2312
+ break; /* success */
2313
+ }
2314
+ if (i == tlen) goto fail;
2315
+ MOP_OUT;
2316
+ continue;
2317
+ }
2318
+ break;
2319
+
2320
+ #ifdef USE_BACKREF_WITH_LEVEL
2321
+ case OP_BACKREF_WITH_LEVEL:
2322
+ {
2323
+ int len;
2324
+ OnigOptionType ic;
2325
+ LengthType level;
2326
+
2327
+ GET_OPTION_INC(ic, p);
2328
+ GET_LENGTH_INC(level, p);
2329
+ GET_LENGTH_INC(tlen, p);
2330
+
2331
+ sprev = s;
2332
+ if (backref_match_at_nested_level(reg, stk, stk_base, ic
2333
+ , case_fold_flag, (int )level, (int )tlen, p, &s, end)) {
2334
+ while (sprev + (len = enclen(encode, sprev)) < s)
2335
+ sprev += len;
2336
+
2337
+ p += (SIZE_MEMNUM * tlen);
2338
+ }
2339
+ else
2340
+ goto fail;
2341
+
2342
+ MOP_OUT;
2343
+ continue;
2344
+ }
2345
+ break;
2346
+ #endif
2347
+
2348
+ #if 0 /* no need: IS_DYNAMIC_OPTION() == 0 */
2349
+ case OP_SET_OPTION_PUSH: MOP_IN(OP_SET_OPTION_PUSH);
2350
+ GET_OPTION_INC(option, p);
2351
+ STACK_PUSH_ALT(p, s, sprev);
2352
+ p += SIZE_OP_SET_OPTION + SIZE_OP_FAIL;
2353
+ MOP_OUT;
2354
+ continue;
2355
+ break;
2356
+
2357
+ case OP_SET_OPTION: MOP_IN(OP_SET_OPTION);
2358
+ GET_OPTION_INC(option, p);
2359
+ MOP_OUT;
2360
+ continue;
2361
+ break;
2362
+ #endif
2363
+
2364
+ case OP_NULL_CHECK_START: MOP_IN(OP_NULL_CHECK_START);
2365
+ GET_MEMNUM_INC(mem, p); /* mem: null check id */
2366
+ STACK_PUSH_NULL_CHECK_START(mem, s);
2367
+ MOP_OUT;
2368
+ continue;
2369
+ break;
2370
+
2371
+ case OP_NULL_CHECK_END: MOP_IN(OP_NULL_CHECK_END);
2372
+ {
2373
+ int isnull;
2374
+
2375
+ GET_MEMNUM_INC(mem, p); /* mem: null check id */
2376
+ STACK_NULL_CHECK(isnull, mem, s);
2377
+ if (isnull) {
2378
+ #ifdef ONIG_DEBUG_MATCH
2379
+ fprintf(stderr, "NULL_CHECK_END: skip id:%d, s:%d\n",
2380
+ (int )mem, (int )s);
2381
+ #endif
2382
+ null_check_found:
2383
+ /* empty loop founded, skip next instruction */
2384
+ switch (*p++) {
2385
+ case OP_JUMP:
2386
+ case OP_PUSH:
2387
+ p += SIZE_RELADDR;
2388
+ break;
2389
+ case OP_REPEAT_INC:
2390
+ case OP_REPEAT_INC_NG:
2391
+ case OP_REPEAT_INC_SG:
2392
+ case OP_REPEAT_INC_NG_SG:
2393
+ p += SIZE_MEMNUM;
2394
+ break;
2395
+ default:
2396
+ goto unexpected_bytecode_error;
2397
+ break;
2398
+ }
2399
+ }
2400
+ }
2401
+ MOP_OUT;
2402
+ continue;
2403
+ break;
2404
+
2405
+ #ifdef USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT
2406
+ case OP_NULL_CHECK_END_MEMST: MOP_IN(OP_NULL_CHECK_END_MEMST);
2407
+ {
2408
+ int isnull;
2409
+
2410
+ GET_MEMNUM_INC(mem, p); /* mem: null check id */
2411
+ STACK_NULL_CHECK_MEMST(isnull, mem, s, reg);
2412
+ if (isnull) {
2413
+ #ifdef ONIG_DEBUG_MATCH
2414
+ fprintf(stderr, "NULL_CHECK_END_MEMST: skip id:%d, s:%d\n",
2415
+ (int )mem, (int )s);
2416
+ #endif
2417
+ if (isnull == -1) goto fail;
2418
+ goto null_check_found;
2419
+ }
2420
+ }
2421
+ MOP_OUT;
2422
+ continue;
2423
+ break;
2424
+ #endif
2425
+
2426
+ #ifdef USE_SUBEXP_CALL
2427
+ case OP_NULL_CHECK_END_MEMST_PUSH:
2428
+ MOP_IN(OP_NULL_CHECK_END_MEMST_PUSH);
2429
+ {
2430
+ int isnull;
2431
+
2432
+ GET_MEMNUM_INC(mem, p); /* mem: null check id */
2433
+ #ifdef USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT
2434
+ STACK_NULL_CHECK_MEMST_REC(isnull, mem, s, reg);
2435
+ #else
2436
+ STACK_NULL_CHECK_REC(isnull, mem, s);
2437
+ #endif
2438
+ if (isnull) {
2439
+ #ifdef ONIG_DEBUG_MATCH
2440
+ fprintf(stderr, "NULL_CHECK_END_MEMST_PUSH: skip id:%d, s:%d\n",
2441
+ (int )mem, (int )s);
2442
+ #endif
2443
+ if (isnull == -1) goto fail;
2444
+ goto null_check_found;
2445
+ }
2446
+ else {
2447
+ STACK_PUSH_NULL_CHECK_END(mem);
2448
+ }
2449
+ }
2450
+ MOP_OUT;
2451
+ continue;
2452
+ break;
2453
+ #endif
2454
+
2455
+ case OP_JUMP: MOP_IN(OP_JUMP);
2456
+ GET_RELADDR_INC(addr, p);
2457
+ p += addr;
2458
+ MOP_OUT;
2459
+ CHECK_INTERRUPT_IN_MATCH_AT;
2460
+ continue;
2461
+ break;
2462
+
2463
+ case OP_PUSH: MOP_IN(OP_PUSH);
2464
+ GET_RELADDR_INC(addr, p);
2465
+ STACK_PUSH_ALT(p + addr, s, sprev);
2466
+ MOP_OUT;
2467
+ continue;
2468
+ break;
2469
+
2470
+ #ifdef USE_COMBINATION_EXPLOSION_CHECK
2471
+ case OP_STATE_CHECK_PUSH: MOP_IN(OP_STATE_CHECK_PUSH);
2472
+ GET_STATE_CHECK_NUM_INC(mem, p);
2473
+ STATE_CHECK_VAL(scv, mem);
2474
+ if (scv) goto fail;
2475
+
2476
+ GET_RELADDR_INC(addr, p);
2477
+ STACK_PUSH_ALT_WITH_STATE_CHECK(p + addr, s, sprev, mem);
2478
+ MOP_OUT;
2479
+ continue;
2480
+ break;
2481
+
2482
+ case OP_STATE_CHECK_PUSH_OR_JUMP: MOP_IN(OP_STATE_CHECK_PUSH_OR_JUMP);
2483
+ GET_STATE_CHECK_NUM_INC(mem, p);
2484
+ GET_RELADDR_INC(addr, p);
2485
+ STATE_CHECK_VAL(scv, mem);
2486
+ if (scv) {
2487
+ p += addr;
2488
+ }
2489
+ else {
2490
+ STACK_PUSH_ALT_WITH_STATE_CHECK(p + addr, s, sprev, mem);
2491
+ }
2492
+ MOP_OUT;
2493
+ continue;
2494
+ break;
2495
+
2496
+ case OP_STATE_CHECK: MOP_IN(OP_STATE_CHECK);
2497
+ GET_STATE_CHECK_NUM_INC(mem, p);
2498
+ STATE_CHECK_VAL(scv, mem);
2499
+ if (scv) goto fail;
2500
+
2501
+ STACK_PUSH_STATE_CHECK(s, mem);
2502
+ MOP_OUT;
2503
+ continue;
2504
+ break;
2505
+ #endif /* USE_COMBINATION_EXPLOSION_CHECK */
2506
+
2507
+ case OP_POP: MOP_IN(OP_POP);
2508
+ STACK_POP_ONE;
2509
+ MOP_OUT;
2510
+ continue;
2511
+ break;
2512
+
2513
+ case OP_PUSH_OR_JUMP_EXACT1: MOP_IN(OP_PUSH_OR_JUMP_EXACT1);
2514
+ GET_RELADDR_INC(addr, p);
2515
+ if (*p == *s && DATA_ENSURE_CHECK1) {
2516
+ p++;
2517
+ STACK_PUSH_ALT(p + addr, s, sprev);
2518
+ MOP_OUT;
2519
+ continue;
2520
+ }
2521
+ p += (addr + 1);
2522
+ MOP_OUT;
2523
+ continue;
2524
+ break;
2525
+
2526
+ case OP_PUSH_IF_PEEK_NEXT: MOP_IN(OP_PUSH_IF_PEEK_NEXT);
2527
+ GET_RELADDR_INC(addr, p);
2528
+ if (*p == *s) {
2529
+ p++;
2530
+ STACK_PUSH_ALT(p + addr, s, sprev);
2531
+ MOP_OUT;
2532
+ continue;
2533
+ }
2534
+ p++;
2535
+ MOP_OUT;
2536
+ continue;
2537
+ break;
2538
+
2539
+ case OP_REPEAT: MOP_IN(OP_REPEAT);
2540
+ {
2541
+ GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */
2542
+ GET_RELADDR_INC(addr, p);
2543
+
2544
+ STACK_ENSURE(1);
2545
+ repeat_stk[mem] = GET_STACK_INDEX(stk);
2546
+ STACK_PUSH_REPEAT(mem, p);
2547
+
2548
+ if (reg->repeat_range[mem].lower == 0) {
2549
+ STACK_PUSH_ALT(p + addr, s, sprev);
2550
+ }
2551
+ }
2552
+ MOP_OUT;
2553
+ continue;
2554
+ break;
2555
+
2556
+ case OP_REPEAT_NG: MOP_IN(OP_REPEAT_NG);
2557
+ {
2558
+ GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */
2559
+ GET_RELADDR_INC(addr, p);
2560
+
2561
+ STACK_ENSURE(1);
2562
+ repeat_stk[mem] = GET_STACK_INDEX(stk);
2563
+ STACK_PUSH_REPEAT(mem, p);
2564
+
2565
+ if (reg->repeat_range[mem].lower == 0) {
2566
+ STACK_PUSH_ALT(p, s, sprev);
2567
+ p += addr;
2568
+ }
2569
+ }
2570
+ MOP_OUT;
2571
+ continue;
2572
+ break;
2573
+
2574
+ case OP_REPEAT_INC: MOP_IN(OP_REPEAT_INC);
2575
+ GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */
2576
+ si = repeat_stk[mem];
2577
+ stkp = STACK_AT(si);
2578
+
2579
+ repeat_inc:
2580
+ stkp->u.repeat.count++;
2581
+ if (stkp->u.repeat.count >= reg->repeat_range[mem].upper) {
2582
+ /* end of repeat. Nothing to do. */
2583
+ }
2584
+ else if (stkp->u.repeat.count >= reg->repeat_range[mem].lower) {
2585
+ STACK_PUSH_ALT(p, s, sprev);
2586
+ p = STACK_AT(si)->u.repeat.pcode; /* Don't use stkp after PUSH. */
2587
+ }
2588
+ else {
2589
+ p = stkp->u.repeat.pcode;
2590
+ }
2591
+ STACK_PUSH_REPEAT_INC(si);
2592
+ MOP_OUT;
2593
+ CHECK_INTERRUPT_IN_MATCH_AT;
2594
+ continue;
2595
+ break;
2596
+
2597
+ case OP_REPEAT_INC_SG: MOP_IN(OP_REPEAT_INC_SG);
2598
+ GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */
2599
+ STACK_GET_REPEAT(mem, stkp);
2600
+ si = GET_STACK_INDEX(stkp);
2601
+ goto repeat_inc;
2602
+ break;
2603
+
2604
+ case OP_REPEAT_INC_NG: MOP_IN(OP_REPEAT_INC_NG);
2605
+ GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */
2606
+ si = repeat_stk[mem];
2607
+ stkp = STACK_AT(si);
2608
+
2609
+ repeat_inc_ng:
2610
+ stkp->u.repeat.count++;
2611
+ if (stkp->u.repeat.count < reg->repeat_range[mem].upper) {
2612
+ if (stkp->u.repeat.count >= reg->repeat_range[mem].lower) {
2613
+ UChar* pcode = stkp->u.repeat.pcode;
2614
+
2615
+ STACK_PUSH_REPEAT_INC(si);
2616
+ STACK_PUSH_ALT(pcode, s, sprev);
2617
+ }
2618
+ else {
2619
+ p = stkp->u.repeat.pcode;
2620
+ STACK_PUSH_REPEAT_INC(si);
2621
+ }
2622
+ }
2623
+ else if (stkp->u.repeat.count == reg->repeat_range[mem].upper) {
2624
+ STACK_PUSH_REPEAT_INC(si);
2625
+ }
2626
+ MOP_OUT;
2627
+ CHECK_INTERRUPT_IN_MATCH_AT;
2628
+ continue;
2629
+ break;
2630
+
2631
+ case OP_REPEAT_INC_NG_SG: MOP_IN(OP_REPEAT_INC_NG_SG);
2632
+ GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */
2633
+ STACK_GET_REPEAT(mem, stkp);
2634
+ si = GET_STACK_INDEX(stkp);
2635
+ goto repeat_inc_ng;
2636
+ break;
2637
+
2638
+ case OP_PUSH_POS: MOP_IN(OP_PUSH_POS);
2639
+ STACK_PUSH_POS(s, sprev);
2640
+ MOP_OUT;
2641
+ continue;
2642
+ break;
2643
+
2644
+ case OP_POP_POS: MOP_IN(OP_POP_POS);
2645
+ {
2646
+ STACK_POS_END(stkp);
2647
+ s = stkp->u.state.pstr;
2648
+ sprev = stkp->u.state.pstr_prev;
2649
+ }
2650
+ MOP_OUT;
2651
+ continue;
2652
+ break;
2653
+
2654
+ case OP_PUSH_POS_NOT: MOP_IN(OP_PUSH_POS_NOT);
2655
+ GET_RELADDR_INC(addr, p);
2656
+ STACK_PUSH_POS_NOT(p + addr, s, sprev);
2657
+ MOP_OUT;
2658
+ continue;
2659
+ break;
2660
+
2661
+ case OP_FAIL_POS: MOP_IN(OP_FAIL_POS);
2662
+ STACK_POP_TIL_POS_NOT;
2663
+ goto fail;
2664
+ break;
2665
+
2666
+ case OP_PUSH_STOP_BT: MOP_IN(OP_PUSH_STOP_BT);
2667
+ STACK_PUSH_STOP_BT;
2668
+ MOP_OUT;
2669
+ continue;
2670
+ break;
2671
+
2672
+ case OP_POP_STOP_BT: MOP_IN(OP_POP_STOP_BT);
2673
+ STACK_STOP_BT_END;
2674
+ MOP_OUT;
2675
+ continue;
2676
+ break;
2677
+
2678
+ case OP_LOOK_BEHIND: MOP_IN(OP_LOOK_BEHIND);
2679
+ GET_LENGTH_INC(tlen, p);
2680
+ s = (UChar* )ONIGENC_STEP_BACK(encode, str, s, (int )tlen);
2681
+ if (IS_NULL(s)) goto fail;
2682
+ sprev = (UChar* )onigenc_get_prev_char_head(encode, str, s);
2683
+ MOP_OUT;
2684
+ continue;
2685
+ break;
2686
+
2687
+ case OP_PUSH_LOOK_BEHIND_NOT: MOP_IN(OP_PUSH_LOOK_BEHIND_NOT);
2688
+ GET_RELADDR_INC(addr, p);
2689
+ GET_LENGTH_INC(tlen, p);
2690
+ q = (UChar* )ONIGENC_STEP_BACK(encode, str, s, (int )tlen);
2691
+ if (IS_NULL(q)) {
2692
+ /* too short case -> success. ex. /(?<!XXX)a/.match("a")
2693
+ If you want to change to fail, replace following line. */
2694
+ p += addr;
2695
+ /* goto fail; */
2696
+ }
2697
+ else {
2698
+ STACK_PUSH_LOOK_BEHIND_NOT(p + addr, s, sprev);
2699
+ s = q;
2700
+ sprev = (UChar* )onigenc_get_prev_char_head(encode, str, s);
2701
+ }
2702
+ MOP_OUT;
2703
+ continue;
2704
+ break;
2705
+
2706
+ case OP_FAIL_LOOK_BEHIND_NOT: MOP_IN(OP_FAIL_LOOK_BEHIND_NOT);
2707
+ STACK_POP_TIL_LOOK_BEHIND_NOT;
2708
+ goto fail;
2709
+ break;
2710
+
2711
+ #ifdef USE_SUBEXP_CALL
2712
+ case OP_CALL: MOP_IN(OP_CALL);
2713
+ GET_ABSADDR_INC(addr, p);
2714
+ STACK_PUSH_CALL_FRAME(p);
2715
+ p = reg->p + addr;
2716
+ MOP_OUT;
2717
+ continue;
2718
+ break;
2719
+
2720
+ case OP_RETURN: MOP_IN(OP_RETURN);
2721
+ STACK_RETURN(p);
2722
+ STACK_PUSH_RETURN;
2723
+ MOP_OUT;
2724
+ continue;
2725
+ break;
2726
+ #endif
2727
+
2728
+ case OP_FINISH:
2729
+ goto finish;
2730
+ break;
2731
+
2732
+ fail:
2733
+ MOP_OUT;
2734
+ /* fall */
2735
+ case OP_FAIL: MOP_IN(OP_FAIL);
2736
+ STACK_POP;
2737
+ p = stk->u.state.pcode;
2738
+ s = stk->u.state.pstr;
2739
+ sprev = stk->u.state.pstr_prev;
2740
+
2741
+ #ifdef USE_COMBINATION_EXPLOSION_CHECK
2742
+ if (stk->u.state.state_check != 0) {
2743
+ stk->type = STK_STATE_CHECK_MARK;
2744
+ stk++;
2745
+ }
2746
+ #endif
2747
+
2748
+ MOP_OUT;
2749
+ continue;
2750
+ break;
2751
+
2752
+ default:
2753
+ goto bytecode_error;
2754
+
2755
+ } /* end of switch */
2756
+ sprev = sbegin;
2757
+ } /* end of while(1) */
2758
+
2759
+ finish:
2760
+ STACK_SAVE;
2761
+ return best_len;
2762
+
2763
+ #ifdef ONIG_DEBUG
2764
+ stack_error:
2765
+ STACK_SAVE;
2766
+ return ONIGERR_STACK_BUG;
2767
+ #endif
2768
+
2769
+ bytecode_error:
2770
+ STACK_SAVE;
2771
+ return ONIGERR_UNDEFINED_BYTECODE;
2772
+
2773
+ unexpected_bytecode_error:
2774
+ STACK_SAVE;
2775
+ return ONIGERR_UNEXPECTED_BYTECODE;
2776
+ }
2777
+
2778
+
2779
+ static UChar*
2780
+ slow_search(OnigEncoding enc, UChar* target, UChar* target_end,
2781
+ const UChar* text, const UChar* text_end, UChar* text_range)
2782
+ {
2783
+ UChar *t, *p, *s, *end;
2784
+
2785
+ end = (UChar* )text_end;
2786
+ end -= target_end - target - 1;
2787
+ if (end > text_range)
2788
+ end = text_range;
2789
+
2790
+ s = (UChar* )text;
2791
+
2792
+ while (s < end) {
2793
+ if (*s == *target) {
2794
+ p = s + 1;
2795
+ t = target + 1;
2796
+ while (t < target_end) {
2797
+ if (*t != *p++)
2798
+ break;
2799
+ t++;
2800
+ }
2801
+ if (t == target_end)
2802
+ return s;
2803
+ }
2804
+ s += enclen(enc, s);
2805
+ }
2806
+
2807
+ return (UChar* )NULL;
2808
+ }
2809
+
2810
+ static int
2811
+ str_lower_case_match(OnigEncoding enc, int case_fold_flag,
2812
+ const UChar* t, const UChar* tend,
2813
+ const UChar* p, const UChar* end)
2814
+ {
2815
+ int lowlen;
2816
+ UChar *q, lowbuf[ONIGENC_MBC_CASE_FOLD_MAXLEN];
2817
+
2818
+ while (t < tend) {
2819
+ lowlen = ONIGENC_MBC_CASE_FOLD(enc, case_fold_flag, &p, end, lowbuf);
2820
+ q = lowbuf;
2821
+ while (lowlen > 0) {
2822
+ if (*t++ != *q++) return 0;
2823
+ lowlen--;
2824
+ }
2825
+ }
2826
+
2827
+ return 1;
2828
+ }
2829
+
2830
+ static UChar*
2831
+ slow_search_ic(OnigEncoding enc, int case_fold_flag,
2832
+ UChar* target, UChar* target_end,
2833
+ const UChar* text, const UChar* text_end, UChar* text_range)
2834
+ {
2835
+ UChar *s, *end;
2836
+
2837
+ end = (UChar* )text_end;
2838
+ end -= target_end - target - 1;
2839
+ if (end > text_range)
2840
+ end = text_range;
2841
+
2842
+ s = (UChar* )text;
2843
+
2844
+ while (s < end) {
2845
+ if (str_lower_case_match(enc, case_fold_flag, target, target_end,
2846
+ s, text_end))
2847
+ return s;
2848
+
2849
+ s += enclen(enc, s);
2850
+ }
2851
+
2852
+ return (UChar* )NULL;
2853
+ }
2854
+
2855
+ static UChar*
2856
+ slow_search_backward(OnigEncoding enc, UChar* target, UChar* target_end,
2857
+ const UChar* text, const UChar* adjust_text,
2858
+ const UChar* text_end, const UChar* text_start)
2859
+ {
2860
+ UChar *t, *p, *s;
2861
+
2862
+ s = (UChar* )text_end;
2863
+ s -= (target_end - target);
2864
+ if (s > text_start)
2865
+ s = (UChar* )text_start;
2866
+ else
2867
+ s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, adjust_text, s);
2868
+
2869
+ while (s >= text) {
2870
+ if (*s == *target) {
2871
+ p = s + 1;
2872
+ t = target + 1;
2873
+ while (t < target_end) {
2874
+ if (*t != *p++)
2875
+ break;
2876
+ t++;
2877
+ }
2878
+ if (t == target_end)
2879
+ return s;
2880
+ }
2881
+ s = (UChar* )onigenc_get_prev_char_head(enc, adjust_text, s);
2882
+ }
2883
+
2884
+ return (UChar* )NULL;
2885
+ }
2886
+
2887
+ static UChar*
2888
+ slow_search_backward_ic(OnigEncoding enc, int case_fold_flag,
2889
+ UChar* target, UChar* target_end,
2890
+ const UChar* text, const UChar* adjust_text,
2891
+ const UChar* text_end, const UChar* text_start)
2892
+ {
2893
+ UChar *s;
2894
+
2895
+ s = (UChar* )text_end;
2896
+ s -= (target_end - target);
2897
+ if (s > text_start)
2898
+ s = (UChar* )text_start;
2899
+ else
2900
+ s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, adjust_text, s);
2901
+
2902
+ while (s >= text) {
2903
+ if (str_lower_case_match(enc, case_fold_flag,
2904
+ target, target_end, s, text_end))
2905
+ return s;
2906
+
2907
+ s = (UChar* )onigenc_get_prev_char_head(enc, adjust_text, s);
2908
+ }
2909
+
2910
+ return (UChar* )NULL;
2911
+ }
2912
+
2913
+ static UChar*
2914
+ bm_search_notrev(regex_t* reg, const UChar* target, const UChar* target_end,
2915
+ const UChar* text, const UChar* text_end,
2916
+ const UChar* text_range)
2917
+ {
2918
+ const UChar *s, *se, *t, *p, *end;
2919
+ const UChar *tail;
2920
+ int skip, tlen1;
2921
+
2922
+ #ifdef ONIG_DEBUG_SEARCH
2923
+ fprintf(stderr, "bm_search_notrev: text: %d, text_end: %d, text_range: %d\n",
2924
+ (int )text, (int )text_end, (int )text_range);
2925
+ #endif
2926
+
2927
+ tail = target_end - 1;
2928
+ tlen1 = tail - target;
2929
+ end = text_range;
2930
+ if (end + tlen1 > text_end)
2931
+ end = text_end - tlen1;
2932
+
2933
+ s = text;
2934
+
2935
+ if (IS_NULL(reg->int_map)) {
2936
+ while (s < end) {
2937
+ p = se = s + tlen1;
2938
+ t = tail;
2939
+ while (*p == *t) {
2940
+ if (t == target) return (UChar* )s;
2941
+ p--; t--;
2942
+ }
2943
+ skip = reg->map[*se];
2944
+ t = s;
2945
+ do {
2946
+ s += enclen(reg->enc, s);
2947
+ } while ((s - t) < skip && s < end);
2948
+ }
2949
+ }
2950
+ else {
2951
+ while (s < end) {
2952
+ p = se = s + tlen1;
2953
+ t = tail;
2954
+ while (*p == *t) {
2955
+ if (t == target) return (UChar* )s;
2956
+ p--; t--;
2957
+ }
2958
+ skip = reg->int_map[*se];
2959
+ t = s;
2960
+ do {
2961
+ s += enclen(reg->enc, s);
2962
+ } while ((s - t) < skip && s < end);
2963
+ }
2964
+ }
2965
+
2966
+ return (UChar* )NULL;
2967
+ }
2968
+
2969
+ static UChar*
2970
+ bm_search(regex_t* reg, const UChar* target, const UChar* target_end,
2971
+ const UChar* text, const UChar* text_end, const UChar* text_range)
2972
+ {
2973
+ const UChar *s, *t, *p, *end;
2974
+ const UChar *tail;
2975
+
2976
+ end = text_range + (target_end - target) - 1;
2977
+ if (end > text_end)
2978
+ end = text_end;
2979
+
2980
+ tail = target_end - 1;
2981
+ s = text + (target_end - target) - 1;
2982
+ if (IS_NULL(reg->int_map)) {
2983
+ while (s < end) {
2984
+ p = s;
2985
+ t = tail;
2986
+ while (*p == *t) {
2987
+ if (t == target) return (UChar* )p;
2988
+ p--; t--;
2989
+ }
2990
+ s += reg->map[*s];
2991
+ }
2992
+ }
2993
+ else { /* see int_map[] */
2994
+ while (s < end) {
2995
+ p = s;
2996
+ t = tail;
2997
+ while (*p == *t) {
2998
+ if (t == target) return (UChar* )p;
2999
+ p--; t--;
3000
+ }
3001
+ s += reg->int_map[*s];
3002
+ }
3003
+ }
3004
+ return (UChar* )NULL;
3005
+ }
3006
+
3007
+ #ifdef USE_INT_MAP_BACKWARD
3008
+ static int
3009
+ set_bm_backward_skip(UChar* s, UChar* end, OnigEncoding enc ARG_UNUSED,
3010
+ int** skip)
3011
+
3012
+ {
3013
+ int i, len;
3014
+
3015
+ if (IS_NULL(*skip)) {
3016
+ *skip = (int* )xmalloc(sizeof(int) * ONIG_CHAR_TABLE_SIZE);
3017
+ if (IS_NULL(*skip)) return ONIGERR_MEMORY;
3018
+ }
3019
+
3020
+ len = end - s;
3021
+ for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++)
3022
+ (*skip)[i] = len;
3023
+
3024
+ for (i = len - 1; i > 0; i--)
3025
+ (*skip)[s[i]] = i;
3026
+
3027
+ return 0;
3028
+ }
3029
+
3030
+ static UChar*
3031
+ bm_search_backward(regex_t* reg, const UChar* target, const UChar* target_end,
3032
+ const UChar* text, const UChar* adjust_text,
3033
+ const UChar* text_end, const UChar* text_start)
3034
+ {
3035
+ const UChar *s, *t, *p;
3036
+
3037
+ s = text_end - (target_end - target);
3038
+ if (text_start < s)
3039
+ s = text_start;
3040
+ else
3041
+ s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, adjust_text, s);
3042
+
3043
+ while (s >= text) {
3044
+ p = s;
3045
+ t = target;
3046
+ while (t < target_end && *p == *t) {
3047
+ p++; t++;
3048
+ }
3049
+ if (t == target_end)
3050
+ return (UChar* )s;
3051
+
3052
+ s -= reg->int_map_backward[*s];
3053
+ s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, adjust_text, s);
3054
+ }
3055
+
3056
+ return (UChar* )NULL;
3057
+ }
3058
+ #endif
3059
+
3060
+ static UChar*
3061
+ map_search(OnigEncoding enc, UChar map[],
3062
+ const UChar* text, const UChar* text_range)
3063
+ {
3064
+ const UChar *s = text;
3065
+
3066
+ while (s < text_range) {
3067
+ if (map[*s]) return (UChar* )s;
3068
+
3069
+ s += enclen(enc, s);
3070
+ }
3071
+ return (UChar* )NULL;
3072
+ }
3073
+
3074
+ static UChar*
3075
+ map_search_backward(OnigEncoding enc, UChar map[],
3076
+ const UChar* text, const UChar* adjust_text,
3077
+ const UChar* text_start)
3078
+ {
3079
+ const UChar *s = text_start;
3080
+
3081
+ while (s >= text) {
3082
+ if (map[*s]) return (UChar* )s;
3083
+
3084
+ s = onigenc_get_prev_char_head(enc, adjust_text, s);
3085
+ }
3086
+ return (UChar* )NULL;
3087
+ }
3088
+
3089
+ extern int
3090
+ onig_match(regex_t* reg, const UChar* str, const UChar* end, const UChar* at, OnigRegion* region,
3091
+ OnigOptionType option)
3092
+ {
3093
+ int r;
3094
+ UChar *prev;
3095
+ OnigMatchArg msa;
3096
+
3097
+ MATCH_ARG_INIT(msa, reg, option, region, at);
3098
+ #ifdef USE_COMBINATION_EXPLOSION_CHECK
3099
+ {
3100
+ int offset = at - str;
3101
+ STATE_CHECK_BUFF_INIT(msa, end - str, offset, reg->num_comb_exp_check);
3102
+ }
3103
+ #endif
3104
+
3105
+ if (region
3106
+ #ifdef USE_POSIX_API_REGION_OPTION
3107
+ && !IS_POSIX_REGION(option)
3108
+ #endif
3109
+ ) {
3110
+ r = onig_region_resize_clear(region, reg->num_mem + 1);
3111
+ }
3112
+ else
3113
+ r = 0;
3114
+
3115
+ if (r == 0) {
3116
+ if (ONIG_IS_OPTION_ON(option, ONIG_OPTION_CHECK_VALIDITY_OF_STRING)) {
3117
+ if (! ONIGENC_IS_VALID_MBC_STRING(reg->enc, str, end)) {
3118
+ r = ONIGERR_INVALID_WIDE_CHAR_VALUE;
3119
+ goto end;
3120
+ }
3121
+ }
3122
+
3123
+ prev = (UChar* )onigenc_get_prev_char_head(reg->enc, str, at);
3124
+ r = match_at(reg, str, end,
3125
+ #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE
3126
+ end,
3127
+ #endif
3128
+ at, prev, &msa);
3129
+ }
3130
+
3131
+ end:
3132
+ MATCH_ARG_FREE(msa);
3133
+ return r;
3134
+ }
3135
+
3136
+ static int
3137
+ forward_search_range(regex_t* reg, const UChar* str, const UChar* end, UChar* s,
3138
+ UChar* range, UChar** low, UChar** high, UChar** low_prev)
3139
+ {
3140
+ UChar *p, *pprev = (UChar* )NULL;
3141
+
3142
+ #ifdef ONIG_DEBUG_SEARCH
3143
+ fprintf(stderr, "forward_search_range: str: %d, end: %d, s: %d, range: %d\n",
3144
+ (int )str, (int )end, (int )s, (int )range);
3145
+ #endif
3146
+
3147
+ p = s;
3148
+ if (reg->dmin > 0) {
3149
+ if (ONIGENC_IS_SINGLEBYTE(reg->enc)) {
3150
+ p += reg->dmin;
3151
+ }
3152
+ else {
3153
+ UChar *q = p + reg->dmin;
3154
+ while (p < q) p += enclen(reg->enc, p);
3155
+ }
3156
+ }
3157
+
3158
+ retry:
3159
+ switch (reg->optimize) {
3160
+ case ONIG_OPTIMIZE_EXACT:
3161
+ p = slow_search(reg->enc, reg->exact, reg->exact_end, p, end, range);
3162
+ break;
3163
+ case ONIG_OPTIMIZE_EXACT_IC:
3164
+ p = slow_search_ic(reg->enc, reg->case_fold_flag,
3165
+ reg->exact, reg->exact_end, p, end, range);
3166
+ break;
3167
+
3168
+ case ONIG_OPTIMIZE_EXACT_BM:
3169
+ p = bm_search(reg, reg->exact, reg->exact_end, p, end, range);
3170
+ break;
3171
+
3172
+ case ONIG_OPTIMIZE_EXACT_BM_NOT_REV:
3173
+ p = bm_search_notrev(reg, reg->exact, reg->exact_end, p, end, range);
3174
+ break;
3175
+
3176
+ case ONIG_OPTIMIZE_MAP:
3177
+ p = map_search(reg->enc, reg->map, p, range);
3178
+ break;
3179
+ }
3180
+
3181
+ if (p && p < range) {
3182
+ if (p - reg->dmin < s) {
3183
+ retry_gate:
3184
+ pprev = p;
3185
+ p += enclen(reg->enc, p);
3186
+ goto retry;
3187
+ }
3188
+
3189
+ if (reg->sub_anchor) {
3190
+ UChar* prev;
3191
+
3192
+ switch (reg->sub_anchor) {
3193
+ case ANCHOR_BEGIN_LINE:
3194
+ if (!ON_STR_BEGIN(p)) {
3195
+ prev = onigenc_get_prev_char_head(reg->enc,
3196
+ (pprev ? pprev : str), p);
3197
+ if (!ONIGENC_IS_MBC_NEWLINE(reg->enc, prev, end))
3198
+ goto retry_gate;
3199
+ }
3200
+ break;
3201
+
3202
+ case ANCHOR_END_LINE:
3203
+ if (ON_STR_END(p)) {
3204
+ #ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE
3205
+ prev = (UChar* )onigenc_get_prev_char_head(reg->enc,
3206
+ (pprev ? pprev : str), p);
3207
+ if (prev && ONIGENC_IS_MBC_NEWLINE(reg->enc, prev, end))
3208
+ goto retry_gate;
3209
+ #endif
3210
+ }
3211
+ else if (! ONIGENC_IS_MBC_NEWLINE(reg->enc, p, end)
3212
+ #ifdef USE_CRNL_AS_LINE_TERMINATOR
3213
+ && ! ONIGENC_IS_MBC_CRNL(reg->enc, p, end)
3214
+ #endif
3215
+ )
3216
+ goto retry_gate;
3217
+ break;
3218
+ }
3219
+ }
3220
+
3221
+ if (reg->dmax == 0) {
3222
+ *low = p;
3223
+ if (low_prev) {
3224
+ if (*low > s)
3225
+ *low_prev = onigenc_get_prev_char_head(reg->enc, s, p);
3226
+ else
3227
+ *low_prev = onigenc_get_prev_char_head(reg->enc,
3228
+ (pprev ? pprev : str), p);
3229
+ }
3230
+ }
3231
+ else {
3232
+ if (reg->dmax != ONIG_INFINITE_DISTANCE) {
3233
+ *low = p - reg->dmax;
3234
+ if (*low > s) {
3235
+ *low = onigenc_get_right_adjust_char_head_with_prev(reg->enc, s,
3236
+ *low, (const UChar** )low_prev);
3237
+ if (low_prev && IS_NULL(*low_prev))
3238
+ *low_prev = onigenc_get_prev_char_head(reg->enc,
3239
+ (pprev ? pprev : s), *low);
3240
+ }
3241
+ else {
3242
+ if (low_prev)
3243
+ *low_prev = onigenc_get_prev_char_head(reg->enc,
3244
+ (pprev ? pprev : str), *low);
3245
+ }
3246
+ }
3247
+ }
3248
+ /* no needs to adjust *high, *high is used as range check only */
3249
+ *high = p - reg->dmin;
3250
+
3251
+ #ifdef ONIG_DEBUG_SEARCH
3252
+ fprintf(stderr,
3253
+ "forward_search_range success: low: %d, high: %d, dmin: %d, dmax: %d\n",
3254
+ (int )(*low - str), (int )(*high - str), reg->dmin, reg->dmax);
3255
+ #endif
3256
+ return 1; /* success */
3257
+ }
3258
+
3259
+ return 0; /* fail */
3260
+ }
3261
+
3262
+
3263
+ #define BM_BACKWARD_SEARCH_LENGTH_THRESHOLD 100
3264
+
3265
+ static int
3266
+ backward_search_range(regex_t* reg, const UChar* str, const UChar* end,
3267
+ UChar* s, const UChar* range, UChar* adjrange,
3268
+ UChar** low, UChar** high)
3269
+ {
3270
+ UChar *p;
3271
+
3272
+ range += reg->dmin;
3273
+ p = s;
3274
+
3275
+ retry:
3276
+ switch (reg->optimize) {
3277
+ case ONIG_OPTIMIZE_EXACT:
3278
+ exact_method:
3279
+ p = slow_search_backward(reg->enc, reg->exact, reg->exact_end,
3280
+ range, adjrange, end, p);
3281
+ break;
3282
+
3283
+ case ONIG_OPTIMIZE_EXACT_IC:
3284
+ p = slow_search_backward_ic(reg->enc, reg->case_fold_flag,
3285
+ reg->exact, reg->exact_end,
3286
+ range, adjrange, end, p);
3287
+ break;
3288
+
3289
+ case ONIG_OPTIMIZE_EXACT_BM:
3290
+ case ONIG_OPTIMIZE_EXACT_BM_NOT_REV:
3291
+ #ifdef USE_INT_MAP_BACKWARD
3292
+ if (IS_NULL(reg->int_map_backward)) {
3293
+ int r;
3294
+
3295
+ if (s - range < BM_BACKWARD_SEARCH_LENGTH_THRESHOLD)
3296
+ goto exact_method;
3297
+
3298
+ r = set_bm_backward_skip(reg->exact, reg->exact_end, reg->enc,
3299
+ &(reg->int_map_backward));
3300
+ if (r) return r;
3301
+ }
3302
+ p = bm_search_backward(reg, reg->exact, reg->exact_end, range, adjrange,
3303
+ end, p);
3304
+ #else
3305
+ goto exact_method;
3306
+ #endif
3307
+ break;
3308
+
3309
+ case ONIG_OPTIMIZE_MAP:
3310
+ p = map_search_backward(reg->enc, reg->map, range, adjrange, p);
3311
+ break;
3312
+ }
3313
+
3314
+ if (p) {
3315
+ if (reg->sub_anchor) {
3316
+ UChar* prev;
3317
+
3318
+ switch (reg->sub_anchor) {
3319
+ case ANCHOR_BEGIN_LINE:
3320
+ if (!ON_STR_BEGIN(p)) {
3321
+ prev = onigenc_get_prev_char_head(reg->enc, str, p);
3322
+ if (!ONIGENC_IS_MBC_NEWLINE(reg->enc, prev, end)) {
3323
+ p = prev;
3324
+ goto retry;
3325
+ }
3326
+ }
3327
+ break;
3328
+
3329
+ case ANCHOR_END_LINE:
3330
+ if (ON_STR_END(p)) {
3331
+ #ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE
3332
+ prev = onigenc_get_prev_char_head(reg->enc, adjrange, p);
3333
+ if (IS_NULL(prev)) goto fail;
3334
+ if (ONIGENC_IS_MBC_NEWLINE(reg->enc, prev, end)) {
3335
+ p = prev;
3336
+ goto retry;
3337
+ }
3338
+ #endif
3339
+ }
3340
+ else if (! ONIGENC_IS_MBC_NEWLINE(reg->enc, p, end)
3341
+ #ifdef USE_CRNL_AS_LINE_TERMINATOR
3342
+ && ! ONIGENC_IS_MBC_CRNL(reg->enc, p, end)
3343
+ #endif
3344
+ ) {
3345
+ p = onigenc_get_prev_char_head(reg->enc, adjrange, p);
3346
+ if (IS_NULL(p)) goto fail;
3347
+ goto retry;
3348
+ }
3349
+ break;
3350
+ }
3351
+ }
3352
+
3353
+ /* no needs to adjust *high, *high is used as range check only */
3354
+ if (reg->dmax != ONIG_INFINITE_DISTANCE) {
3355
+ *low = p - reg->dmax;
3356
+ *high = p - reg->dmin;
3357
+ *high = onigenc_get_right_adjust_char_head(reg->enc, adjrange, *high);
3358
+ }
3359
+
3360
+ #ifdef ONIG_DEBUG_SEARCH
3361
+ fprintf(stderr, "backward_search_range: low: %d, high: %d\n",
3362
+ (int )(*low - str), (int )(*high - str));
3363
+ #endif
3364
+ return 1; /* success */
3365
+ }
3366
+
3367
+ fail:
3368
+ #ifdef ONIG_DEBUG_SEARCH
3369
+ fprintf(stderr, "backward_search_range: fail.\n");
3370
+ #endif
3371
+ return 0; /* fail */
3372
+ }
3373
+
3374
+
3375
+ extern int
3376
+ onig_search(regex_t* reg, const UChar* str, const UChar* end,
3377
+ const UChar* start, const UChar* range, OnigRegion* region, OnigOptionType option)
3378
+ {
3379
+ int r;
3380
+ UChar *s, *prev;
3381
+ OnigMatchArg msa;
3382
+ const UChar *orig_start = start;
3383
+ #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE
3384
+ const UChar *orig_range = range;
3385
+ #endif
3386
+
3387
+ #ifdef ONIG_DEBUG_SEARCH
3388
+ fprintf(stderr,
3389
+ "onig_search (entry point): str: %d, end: %d, start: %d, range: %d\n",
3390
+ (int )str, (int )(end - str), (int )(start - str), (int )(range - str));
3391
+ #endif
3392
+
3393
+ if (region
3394
+ #ifdef USE_POSIX_API_REGION_OPTION
3395
+ && !IS_POSIX_REGION(option)
3396
+ #endif
3397
+ ) {
3398
+ r = onig_region_resize_clear(region, reg->num_mem + 1);
3399
+ if (r) goto finish_no_msa;
3400
+ }
3401
+
3402
+ if (start > end || start < str) goto mismatch_no_msa;
3403
+
3404
+ if (ONIG_IS_OPTION_ON(option, ONIG_OPTION_CHECK_VALIDITY_OF_STRING)) {
3405
+ if (! ONIGENC_IS_VALID_MBC_STRING(reg->enc, str, end)) {
3406
+ r = ONIGERR_INVALID_WIDE_CHAR_VALUE;
3407
+ goto finish_no_msa;
3408
+ }
3409
+ }
3410
+
3411
+
3412
+ #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE
3413
+ #ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE
3414
+ #define MATCH_AND_RETURN_CHECK(upper_range) \
3415
+ r = match_at(reg, str, end, (upper_range), s, prev, &msa); \
3416
+ if (r != ONIG_MISMATCH) {\
3417
+ if (r >= 0) {\
3418
+ if (! IS_FIND_LONGEST(reg->options)) {\
3419
+ goto match;\
3420
+ }\
3421
+ }\
3422
+ else goto finish; /* error */ \
3423
+ }
3424
+ #else
3425
+ #define MATCH_AND_RETURN_CHECK(upper_range) \
3426
+ r = match_at(reg, str, end, (upper_range), s, prev, &msa); \
3427
+ if (r != ONIG_MISMATCH) {\
3428
+ if (r >= 0) {\
3429
+ goto match;\
3430
+ }\
3431
+ else goto finish; /* error */ \
3432
+ }
3433
+ #endif /* USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE */
3434
+ #else
3435
+ #ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE
3436
+ #define MATCH_AND_RETURN_CHECK(none) \
3437
+ r = match_at(reg, str, end, s, prev, &msa);\
3438
+ if (r != ONIG_MISMATCH) {\
3439
+ if (r >= 0) {\
3440
+ if (! IS_FIND_LONGEST(reg->options)) {\
3441
+ goto match;\
3442
+ }\
3443
+ }\
3444
+ else goto finish; /* error */ \
3445
+ }
3446
+ #else
3447
+ #define MATCH_AND_RETURN_CHECK(none) \
3448
+ r = match_at(reg, str, end, s, prev, &msa);\
3449
+ if (r != ONIG_MISMATCH) {\
3450
+ if (r >= 0) {\
3451
+ goto match;\
3452
+ }\
3453
+ else goto finish; /* error */ \
3454
+ }
3455
+ #endif /* USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE */
3456
+ #endif /* USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE */
3457
+
3458
+
3459
+ /* anchor optimize: resume search range */
3460
+ if (reg->anchor != 0 && str < end) {
3461
+ UChar *min_semi_end, *max_semi_end;
3462
+
3463
+ if (reg->anchor & ANCHOR_BEGIN_POSITION) {
3464
+ /* search start-position only */
3465
+ begin_position:
3466
+ if (range > start)
3467
+ range = start + 1;
3468
+ else
3469
+ range = start;
3470
+ }
3471
+ else if (reg->anchor & ANCHOR_BEGIN_BUF) {
3472
+ /* search str-position only */
3473
+ if (range > start) {
3474
+ if (start != str) goto mismatch_no_msa;
3475
+ range = str + 1;
3476
+ }
3477
+ else {
3478
+ if (range <= str) {
3479
+ start = str;
3480
+ range = str;
3481
+ }
3482
+ else
3483
+ goto mismatch_no_msa;
3484
+ }
3485
+ }
3486
+ else if (reg->anchor & ANCHOR_END_BUF) {
3487
+ min_semi_end = max_semi_end = (UChar* )end;
3488
+
3489
+ end_buf:
3490
+ if ((OnigLen )(max_semi_end - str) < reg->anchor_dmin)
3491
+ goto mismatch_no_msa;
3492
+
3493
+ if (range > start) {
3494
+ if ((OnigLen )(min_semi_end - start) > reg->anchor_dmax) {
3495
+ start = min_semi_end - reg->anchor_dmax;
3496
+ if (start < end)
3497
+ start = onigenc_get_right_adjust_char_head(reg->enc, str, start);
3498
+ }
3499
+ if ((OnigLen )(max_semi_end - (range - 1)) < reg->anchor_dmin) {
3500
+ range = max_semi_end - reg->anchor_dmin + 1;
3501
+ }
3502
+
3503
+ if (start > range) goto mismatch_no_msa;
3504
+ /* If start == range, match with empty at end.
3505
+ Backward search is used. */
3506
+ }
3507
+ else {
3508
+ if ((OnigLen )(min_semi_end - range) > reg->anchor_dmax) {
3509
+ range = min_semi_end - reg->anchor_dmax;
3510
+ }
3511
+ if ((OnigLen )(max_semi_end - start) < reg->anchor_dmin) {
3512
+ start = max_semi_end - reg->anchor_dmin;
3513
+ start = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, str, start);
3514
+ }
3515
+ if (range > start) goto mismatch_no_msa;
3516
+ }
3517
+ }
3518
+ else if (reg->anchor & ANCHOR_SEMI_END_BUF) {
3519
+ UChar* pre_end = ONIGENC_STEP_BACK(reg->enc, str, end, 1);
3520
+
3521
+ max_semi_end = (UChar* )end;
3522
+ if (ONIGENC_IS_MBC_NEWLINE(reg->enc, pre_end, end)) {
3523
+ min_semi_end = pre_end;
3524
+
3525
+ #ifdef USE_CRNL_AS_LINE_TERMINATOR
3526
+ pre_end = ONIGENC_STEP_BACK(reg->enc, str, pre_end, 1);
3527
+ if (IS_NOT_NULL(pre_end) &&
3528
+ ONIGENC_IS_MBC_CRNL(reg->enc, pre_end, end)) {
3529
+ min_semi_end = pre_end;
3530
+ }
3531
+ #endif
3532
+ if (min_semi_end > str && start <= min_semi_end) {
3533
+ goto end_buf;
3534
+ }
3535
+ }
3536
+ else {
3537
+ min_semi_end = (UChar* )end;
3538
+ goto end_buf;
3539
+ }
3540
+ }
3541
+ else if ((reg->anchor & ANCHOR_ANYCHAR_STAR_ML)) {
3542
+ goto begin_position;
3543
+ }
3544
+ }
3545
+ else if (str == end) { /* empty string */
3546
+ static const UChar* address_for_empty_string = (UChar* )"";
3547
+
3548
+ #ifdef ONIG_DEBUG_SEARCH
3549
+ fprintf(stderr, "onig_search: empty string.\n");
3550
+ #endif
3551
+
3552
+ if (reg->threshold_len == 0) {
3553
+ start = end = str = address_for_empty_string;
3554
+ s = (UChar* )start;
3555
+ prev = (UChar* )NULL;
3556
+
3557
+ MATCH_ARG_INIT(msa, reg, option, region, start);
3558
+ #ifdef USE_COMBINATION_EXPLOSION_CHECK
3559
+ msa.state_check_buff = (void* )0;
3560
+ msa.state_check_buff_size = 0; /* NO NEED, for valgrind */
3561
+ #endif
3562
+ MATCH_AND_RETURN_CHECK(end);
3563
+ goto mismatch;
3564
+ }
3565
+ goto mismatch_no_msa;
3566
+ }
3567
+
3568
+ #ifdef ONIG_DEBUG_SEARCH
3569
+ fprintf(stderr, "onig_search(apply anchor): end: %d, start: %d, range: %d\n",
3570
+ (int )(end - str), (int )(start - str), (int )(range - str));
3571
+ #endif
3572
+
3573
+ MATCH_ARG_INIT(msa, reg, option, region, orig_start);
3574
+ #ifdef USE_COMBINATION_EXPLOSION_CHECK
3575
+ {
3576
+ int offset = (MIN(start, range) - str);
3577
+ STATE_CHECK_BUFF_INIT(msa, end - str, offset, reg->num_comb_exp_check);
3578
+ }
3579
+ #endif
3580
+
3581
+ s = (UChar* )start;
3582
+ if (range > start) { /* forward search */
3583
+ if (s > str)
3584
+ prev = onigenc_get_prev_char_head(reg->enc, str, s);
3585
+ else
3586
+ prev = (UChar* )NULL;
3587
+
3588
+ if (reg->optimize != ONIG_OPTIMIZE_NONE) {
3589
+ UChar *sch_range, *low, *high, *low_prev;
3590
+
3591
+ sch_range = (UChar* )range;
3592
+ if (reg->dmax != 0) {
3593
+ if (reg->dmax == ONIG_INFINITE_DISTANCE)
3594
+ sch_range = (UChar* )end;
3595
+ else {
3596
+ sch_range += reg->dmax;
3597
+ if (sch_range > end) sch_range = (UChar* )end;
3598
+ }
3599
+ }
3600
+
3601
+ if ((end - start) < reg->threshold_len)
3602
+ goto mismatch;
3603
+
3604
+ if (reg->dmax != ONIG_INFINITE_DISTANCE) {
3605
+ do {
3606
+ if (! forward_search_range(reg, str, end, s, sch_range,
3607
+ &low, &high, &low_prev)) goto mismatch;
3608
+ if (s < low) {
3609
+ s = low;
3610
+ prev = low_prev;
3611
+ }
3612
+ while (s <= high) {
3613
+ MATCH_AND_RETURN_CHECK(orig_range);
3614
+ prev = s;
3615
+ s += enclen(reg->enc, s);
3616
+ }
3617
+ } while (s < range);
3618
+ goto mismatch;
3619
+ }
3620
+ else { /* check only. */
3621
+ if (! forward_search_range(reg, str, end, s, sch_range,
3622
+ &low, &high, (UChar** )NULL)) goto mismatch;
3623
+
3624
+ if ((reg->anchor & ANCHOR_ANYCHAR_STAR) != 0) {
3625
+ do {
3626
+ MATCH_AND_RETURN_CHECK(orig_range);
3627
+ prev = s;
3628
+ s += enclen(reg->enc, s);
3629
+
3630
+ if ((reg->anchor & (ANCHOR_LOOK_BEHIND | ANCHOR_PREC_READ_NOT)) == 0) {
3631
+ while (!ONIGENC_IS_MBC_NEWLINE(reg->enc, prev, end) && s < range) {
3632
+ prev = s;
3633
+ s += enclen(reg->enc, s);
3634
+ }
3635
+ }
3636
+ } while (s < range);
3637
+ goto mismatch;
3638
+ }
3639
+ }
3640
+ }
3641
+
3642
+ do {
3643
+ MATCH_AND_RETURN_CHECK(orig_range);
3644
+ prev = s;
3645
+ s += enclen(reg->enc, s);
3646
+ } while (s < range);
3647
+
3648
+ if (s == range) { /* because empty match with /$/. */
3649
+ MATCH_AND_RETURN_CHECK(orig_range);
3650
+ }
3651
+ }
3652
+ else { /* backward search */
3653
+ #ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE
3654
+ if (orig_start < end)
3655
+ orig_start += enclen(reg->enc, orig_start); /* is upper range */
3656
+ #endif
3657
+
3658
+ if (reg->optimize != ONIG_OPTIMIZE_NONE) {
3659
+ UChar *low, *high, *adjrange, *sch_start;
3660
+
3661
+ if (range < end)
3662
+ adjrange = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, str, range);
3663
+ else
3664
+ adjrange = (UChar* )end;
3665
+
3666
+ if (reg->dmax != ONIG_INFINITE_DISTANCE &&
3667
+ (end - range) >= reg->threshold_len) {
3668
+ do {
3669
+ sch_start = s + reg->dmax;
3670
+ if (sch_start > end) sch_start = (UChar* )end;
3671
+ if (backward_search_range(reg, str, end, sch_start, range, adjrange,
3672
+ &low, &high) <= 0)
3673
+ goto mismatch;
3674
+
3675
+ if (s > high)
3676
+ s = high;
3677
+
3678
+ while (s >= low) {
3679
+ prev = onigenc_get_prev_char_head(reg->enc, str, s);
3680
+ MATCH_AND_RETURN_CHECK(orig_start);
3681
+ s = prev;
3682
+ }
3683
+ } while (s >= range);
3684
+ goto mismatch;
3685
+ }
3686
+ else { /* check only. */
3687
+ if ((end - range) < reg->threshold_len) goto mismatch;
3688
+
3689
+ sch_start = s;
3690
+ if (reg->dmax != 0) {
3691
+ if (reg->dmax == ONIG_INFINITE_DISTANCE)
3692
+ sch_start = (UChar* )end;
3693
+ else {
3694
+ sch_start += reg->dmax;
3695
+ if (sch_start > end) sch_start = (UChar* )end;
3696
+ else
3697
+ sch_start = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc,
3698
+ start, sch_start);
3699
+ }
3700
+ }
3701
+ if (backward_search_range(reg, str, end, sch_start, range, adjrange,
3702
+ &low, &high) <= 0) goto mismatch;
3703
+ }
3704
+ }
3705
+
3706
+ do {
3707
+ prev = onigenc_get_prev_char_head(reg->enc, str, s);
3708
+ MATCH_AND_RETURN_CHECK(orig_start);
3709
+ s = prev;
3710
+ } while (s >= range);
3711
+ }
3712
+
3713
+ mismatch:
3714
+ #ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE
3715
+ if (IS_FIND_LONGEST(reg->options)) {
3716
+ if (msa.best_len >= 0) {
3717
+ s = msa.best_s;
3718
+ goto match;
3719
+ }
3720
+ }
3721
+ #endif
3722
+ r = ONIG_MISMATCH;
3723
+
3724
+ finish:
3725
+ MATCH_ARG_FREE(msa);
3726
+
3727
+ /* If result is mismatch and no FIND_NOT_EMPTY option,
3728
+ then the region is not set in match_at(). */
3729
+ if (IS_FIND_NOT_EMPTY(reg->options) && region
3730
+ #ifdef USE_POSIX_API_REGION_OPTION
3731
+ && !IS_POSIX_REGION(option)
3732
+ #endif
3733
+ ) {
3734
+ onig_region_clear(region);
3735
+ }
3736
+
3737
+ #ifdef ONIG_DEBUG
3738
+ if (r != ONIG_MISMATCH)
3739
+ fprintf(stderr, "onig_search: error %d\n", r);
3740
+ #endif
3741
+ return r;
3742
+
3743
+ mismatch_no_msa:
3744
+ r = ONIG_MISMATCH;
3745
+ finish_no_msa:
3746
+ #ifdef ONIG_DEBUG
3747
+ if (r != ONIG_MISMATCH)
3748
+ fprintf(stderr, "onig_search: error %d\n", r);
3749
+ #endif
3750
+ return r;
3751
+
3752
+ match:
3753
+ MATCH_ARG_FREE(msa);
3754
+ return s - str;
3755
+ }
3756
+
3757
+ extern int
3758
+ onig_scan(regex_t* reg, const UChar* str, const UChar* end,
3759
+ OnigRegion* region, OnigOptionType option,
3760
+ int (*scan_callback)(int, int, OnigRegion*, void*),
3761
+ void* callback_arg)
3762
+ {
3763
+ int r;
3764
+ int n;
3765
+ int rs;
3766
+ const UChar* start;
3767
+
3768
+ if (ONIG_IS_OPTION_ON(option, ONIG_OPTION_CHECK_VALIDITY_OF_STRING)) {
3769
+ if (! ONIGENC_IS_VALID_MBC_STRING(reg->enc, str, end))
3770
+ return ONIGERR_INVALID_WIDE_CHAR_VALUE;
3771
+
3772
+ ONIG_OPTION_OFF(option, ONIG_OPTION_CHECK_VALIDITY_OF_STRING);
3773
+ }
3774
+
3775
+ n = 0;
3776
+ start = str;
3777
+ while (1) {
3778
+ r = onig_search(reg, str, end, start, end, region, option);
3779
+ if (r >= 0) {
3780
+ rs = scan_callback(n, r, region, callback_arg);
3781
+ n++;
3782
+ if (rs != 0)
3783
+ return rs;
3784
+
3785
+ if (region->end[0] == start - str)
3786
+ start++;
3787
+ else
3788
+ start = str + region->end[0];
3789
+
3790
+ if (start > end)
3791
+ break;
3792
+ }
3793
+ else if (r == ONIG_MISMATCH) {
3794
+ break;
3795
+ }
3796
+ else { /* error */
3797
+ return r;
3798
+ }
3799
+ }
3800
+
3801
+ return n;
3802
+ }
3803
+
3804
+ extern OnigEncoding
3805
+ onig_get_encoding(regex_t* reg)
3806
+ {
3807
+ return reg->enc;
3808
+ }
3809
+
3810
+ extern OnigOptionType
3811
+ onig_get_options(regex_t* reg)
3812
+ {
3813
+ return reg->options;
3814
+ }
3815
+
3816
+ extern OnigCaseFoldType
3817
+ onig_get_case_fold_flag(regex_t* reg)
3818
+ {
3819
+ return reg->case_fold_flag;
3820
+ }
3821
+
3822
+ extern OnigSyntaxType*
3823
+ onig_get_syntax(regex_t* reg)
3824
+ {
3825
+ return reg->syntax;
3826
+ }
3827
+
3828
+ extern int
3829
+ onig_number_of_captures(regex_t* reg)
3830
+ {
3831
+ return reg->num_mem;
3832
+ }
3833
+
3834
+ extern int
3835
+ onig_number_of_capture_histories(regex_t* reg)
3836
+ {
3837
+ #ifdef USE_CAPTURE_HISTORY
3838
+ int i, n;
3839
+
3840
+ n = 0;
3841
+ for (i = 0; i <= ONIG_MAX_CAPTURE_HISTORY_GROUP; i++) {
3842
+ if (BIT_STATUS_AT(reg->capture_history, i) != 0)
3843
+ n++;
3844
+ }
3845
+ return n;
3846
+ #else
3847
+ return 0;
3848
+ #endif
3849
+ }
3850
+
3851
+ extern void
3852
+ onig_copy_encoding(OnigEncoding to, OnigEncoding from)
3853
+ {
3854
+ *to = *from;
3855
+ }
3856
+